38

ソースに長い行を書かなければならないことがありますが、これは改行したほうがよいでしょう。これによって作成されたものをどのようにインデントしますか。

同じようにインデントできます:

very long
statement;
other statement;

これにより、例に示すように、次のコードとの区別が難しくなります。一方、1 レベルインデントすることもできます。

very long
   statement;
other statement;

これにより簡単になりますが、次のように、長い行がネストされたブロックの開始であり、インデントしたい場合があります。

if ((long test 1) &&
   (long test 2) &&
   (long test 3)) {
   code executed if true;
}

この場合も、読みにくいです。私が考えることができる 3 番目の可能性は、長い行をまったく改行しないことです。最新のエディターはそれを処理して、ソフトな改行を作成できます。しかし、別のエディターでは横にスクロールする必要があり、位置に影響を与えることはできません。エディターは長い行を分割します。

あなたはどの可能性を好みますか?これを解決するための他のアイデアはありますか?正当な理由であなたの好みを支持できますか?

4

14 に答える 14

43

条件と内部ブロックをすべて 1 つの項目として見やすくするため、独自の行にブレースを付けるのが好きです (私の言いたいことがわかっている場合)。

if ((long test 1)
    && (long test 2)
    && (long test 3)) 
{
    code executed if true;
}

「結合」条件が非常に重要であり、前の行の最後で見落とされる傾向があるため、条件が何であるかで追加の条件行を開始するのが好きです。

また、括弧の効果が明確になるようにインデントを試みます (ただし、長い条件文を避けることは一般的には良いことです)。

「もの」を簡単に「スキャン」できるように、ものを構造化しようとしています:)

于 2009-03-30T22:45:30.020 に答える
31

行を分割するのではなく、80 文字を超える行を書かないようにする必要があります。

  • 条件を変換してコードをカプセル化することで、インデントを最小限に抑えるようにしてください。

Linus Torvalds: 3 つ以上のレベルのインデントが必要な場合は、いずれにせよ失敗です
。プログラムを修正する必要があります。

これには、コードをはるかに読みやすくするという副作用もあります。さらに、条件は、カプセル化した他のものを他の場所で使用する準備ができているということです。

bool encapsulatedLongCondition() // Add some parameters
{
  if (!condition1)
    return false;

  if (!condition2)
    return false;

  // ... (Other conditions)

  return true;
}    

if (encapsulatedLongCondition())
{
  // ... (Call some methods, try not to introduce deeper if/loop levels!)
}

ブール代数を使用して条件を単純化し、条件と戻り値を逆にすると、非常に役立ちます。:-)

参照:このアルゴリズムを単純化できますか? 参照 2: C# のリファクタリングには、これを支援する機能があります。;-)

  • 型定義を使用し、長い名前を避けるようにしてください

簡単な例として、別のコンテナーでより長い名前を持つ typedef を使用せずに Days を使用する時間を想像してみてください。

struct Day
{
  // Some data
};
struct Event
{
  // Some data
};
typedef list<Event> Events;
typedef map<Day, Event> Days;
// Some other container that would else be long...
  • ... (行が長い理由を分析し、その解決策を見つけてください)

一般的なアイデアが得られることを願っています。これにより、汚い改行を思い付く必要がなくなります。;-)

長い行が発生する唯一の場所は、関数のプロトタイプまたはそれらを呼び出すときです。そこでは、最後の可能なコンマの後で改行して次の行に進む必要があります。それぞれの後にそれを行い、複数の行を無駄にしてスクロールを肥大化し、関数を目立たせるのではなく...これらの長い行を頻繁に目にする場合は、関数名の前の行に戻り値の型を配置できます。

void longFunctionName(ParameterType1 parameter1, ParameterType2 parameter2,
                      ParameterType3 parameter3, ParameterType4 parameter4)  
于 2009-03-30T22:51:56.773 に答える
9

一般的に私は:

if (condition) {
     something;
}

ブロック区切り用。ただし、分割する必要がある長い行の場合は、これを使用します。

if (
    (long test 1) &&
    (long test 2) &&
    (long test 3)
) {
    code executed if true;
}

rbobby の回答との主な違い:

  1. 行が不完全であることを視覚的に非常に明確に示すために、後続の行の先頭ではなく各行の末尾にある演算子
  2. 条件要素の前の最初の行で改行 -- これにより、コードの「形状」の一貫性を保つことができます。
  3. 閉じ括弧がインデントされていません。

これには、パラメーター/条件付きリストをコード ブロックのように見せるという視覚効果があります (ただし、中括弧の代わりに括弧を使用します。対称性が気に入っています。また、行にむき出しの中括弧を配置することも回避されます (これは見栄えが悪いと思います))。 .

于 2009-11-17T15:12:01.040 に答える
7

2 つの簡単なルールがあります。

  1. ステートメント ブロック: 1 つのインデント。
  2. 行の継続: 2 つのインデントまたはかっこが整列し、さらにインデントされているもの。

したがって、if の場合は次のようになります。

if ((long test 1) &&
        (long test 2) &&
        (long test 3)) {
    code executed if true;
}
于 2009-03-30T22:36:02.337 に答える
3

すでにここに書かれているものにわずかな違いがあります:

if ((long test 1) &&
    (long test 2) &&
    (long test 3)) 
{
    code executed if true;
}

ブール演算子を行末に置くのが好きです。

長いメソッド名、または多くのパラメーターを持つメソッドは次のようになります。

reallyLongMethodName (paramA,
                      paramB,
                      paramC);

上記のパラメーター名とビットが並んでいます。ブランケットではなく…

また、インデントを減らすために、コードで複数のリターン ポイントを使用し始め、ループでの継続と中断も行いました。例えば

for(int i = 0; i < MAX; i++)
{
    if(!isPrime(i)) // predefined prime finding func
        continue;

    //now we have only prime values of i
}
于 2009-03-30T22:59:22.217 に答える
2

私は「IDE と戦うな」という意見に賛成です。

ただし、私のIDE(Eclipse、Visual Studio)は行を分割したいので、行が壊れています。

これは、言語間の不一致を意味する場合がありますが、問題ありません。

于 2009-03-30T22:36:03.943 に答える
1

括弧で囲まれた式は、開始のレベルで保持します。

if ((long test 1) &&
    (long test 2) &&
    (long test 3)) {
  code executed if true;
}

これにより、各表現がどのレベルにあるかが明確になります。

于 2009-03-30T22:35:44.287 に答える
1

次の基準を満たしていれば、どの方法を使用するかは問題ではないと思います。

  • それは賢明です
  • コード全体に同じ規則を適用します。

あなたがチーム開発をている場合は、他の方法で合意に達することができず、口述する人がいない場合は、難解な投票メカニズムによって、あなたの間の慣習に同意するようにしてください.

于 2009-03-30T22:55:50.587 に答える
1

特定の方法でコードをフォーマットする唯一の理由は、コードを読みやすくすることです。これは本質的に主観的なものです。見栄えが良く、初めてコードを見る人にとって読みやすいと思われる方法で行ってください。そして、私は従来の通念を覆して、共通の基準について心配する必要はないと言い

たい

.あなたは何でも。限目。繰り返しますが、コードの書式設定は単にコードを読みやすくするためのものであり、コードの詳細を書式設定する標準的な方法を使用しても読みやすさは得られません。

于 2009-03-30T23:23:43.780 に答える
1

astyle、または使用している自動圧子を使用します。それは十分に機能しているように見えますが、通常はもっと重要なことを考えなければなりません。

于 2009-03-30T22:34:41.777 に答える
0

私の意見では、78 文字または 80 文字の行幅が​​便利です。同じ画面で複数のファイルを並べて開くのが簡単になるからです。

正当化、Linus Torvalds の引用はどうですか? :)

それに対する答えは、3 レベル以上のインデントが必要な場合は、いずれにせよ失敗するので、プログラムを修正する必要があるということです。

私は通常、Google C++ コーディング スタイル(これを Java にも適用できると思います)とこの C++ コーディング スタイルの集合体に従っています。

于 2009-03-30T22:43:40.850 に答える
0

同じ行にインデントすることはほとんどありません。ただし、非常にまれな機会に、このような変数の束を再初期化します

a 
= b
= c
= d
= e
= f
= 0;

ただし、このようなことを行う際の重要な点の 1 つは、代入演算子を次の行の最初の文字として保持することです。これにより、メインが提供されます。彼らがそれを見たときのWTFの瞬間をプログラミングし、単にそれをざっと見るのではなく、強制的に見るようにします.

非常に長いステートメントをラップします。意味があると思われる場所ならどこでもそれを行います...必ずしも最初のインデントである必要はありません。そう :

reallyLongMethodName (paramA,paramB,paramC);

のようにフォーマットされません

reallyLongMethodName (paramA,
    paramB,
    paramC);

しかし、より多くのようになります

reallyLongMethodName (paramA,
                    paramB,
                    paramC);

すべてのパラメーターが左括弧に並んでいます。

if と while については、次のようにします。

if((long test 1) 
&& (long test 2) 
&& (long test 3))
{
    code executed if true;
}
于 2009-03-30T22:43:47.637 に答える
0

Java については、Oracle がこれらの規則を提供しています。Java コード規則 - Oracle。

  • コンマの後にブレーク
  • 演算子の前でブレーク
  • 低レベルの休憩よりも高レベルの休憩を優先する
  • 新しい行を前の行の同じレベルの式の先頭に揃えます
  • 上記の規則によってコードが混乱したり、右マージンに押し付けられたりする場合は、代わりにスペースを 8 つインデントしてください。

たとえば、

longName1 = longName2 * (longName3 + longName4 - longName5)
            + 4 * longname6; // PREFER
longName1 = longName2 * (longName3 + longName4
                        - longName5) + 4 * longname6; // AVOID

別 :

//DON’T USE THIS INDENTATION
if ((condition1 && condition2)
    || (condition3 && condition4)
    ||!(condition5 && condition6)) { //BAD WRAPS
    doSomethingAboutIt(); //MAKE THIS LINE EASY TO MISS
}
//USE THIS INDENTATION INSTEAD
if ((condition1 && condition2)
        || (condition3 && condition4)
        ||!(condition5 && condition6)) {
    doSomethingAboutIt();
}
//OR USE THIS
if ((condition1 && condition2) || (condition3 && condition4)
        ||!(condition5 && condition6)) {
    doSomethingAboutIt();
}

そのドキュメントには、より多くの例が示されています。

于 2018-03-09T06:14:12.323 に答える