web-dev-qa-db-ja.com

長いコード行を改行する場合、次の行の内容をどのようにインデントしますか?

時々、ソースに長い行を書かなければならないことがあります。これで止められたものをどのようにインデントしますか?.

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

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番目の可能性は、長い行をまったく改行しないことです。現代のエディターはそれを処理して、ソフトな改行を作成できます。しかし、別のエディターでは横にスクロールする必要があり、位置に影響を与えることはできません。エディターは長い行を壊します。

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

39
Mnementh

状態と内側のブロックをすべて1つの項目として見やすくするので、自分の行で中かっこが好きです(つまり、私が何を意味するかを知っている場合)。

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

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

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

私は「もの」を簡単に「スキャン」できるようにものを構成してみます:)

42
user53794

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)  
30
Tamara Wijsman

一般的に私はします:

if (condition) {
     something;
}

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

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

Rbobbyの回答との主な違い:

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

これには、パラメーター/条件付きリストをコードブロックのように見えるようにする視覚効果があります(ただし、中かっこの代わりにかっこを使用します。対称性が良いことがわかります。また、線にむき出しの中かっこ(ひどいように見える)を回避します。 。

8
Cory Petosky

私には2つの単純なルールがあります。

  1. ステートメントブロック:1つのインデント。
  2. 行の継続:2つのインデントまたはかっこを揃えて、さらにインデントされます。

したがって、ifの場合:

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

私はすでにここに書かれていることについて少し変化があります:

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

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

長いメソッド名、または多くのパラメーターを持つメソッドは次のとおりです。

reallyLongMethodName (paramA,
                      paramB,
                      paramC);

上記のparam名にビットが並んでいます。ブラケットではありません...

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

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

    //now we have only prime values of i
}
3
masher

"IDEと戦わないでください。"

ただし、私のIDE(Eclipse、Visual Studio)は改行したいので、改行します。

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

3
jjnguy

常にインデントしますが、ifステートメントは特別です。テストを並べるのが好きで、余分な&&左側の演算子:

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

&&と左揃えしてifに合わせることも可能ですが、この代替案は読みにくいと思います。

2
Norman Ramsey

私は過去に同様の質問をしました:

コード行をラップする場所、特に長い引数リスト

この種の質問の難しさはその主観的な性質なので、私は答えを受け入れることができませんでした。

インデントスタイルをコードベース全体で一貫させることは重要な部分だと思います。

2
coobird

特定の方法でコードをフォーマットする唯一の理由は、コードを読みやすくするためです。これは本質的に主観的なものです。見た目が良く、コードを初めて見る人にとって読みやすくなるようにしてください。そして、私は従来の知識を捨てて、一般的な標準について心配しないでください-2つの理由で

1)破線にはさまざまな可能性があるため、この状況では難しい

2)何も買わない。限目。繰り返しになりますが、コードのフォーマットは単にコードを読みやすくするためのものであり、コードの詳細をフォーマットする標準的な方法があっても、読みやすさは損なわれません。

1
user13276

Astyle、または使用している自動インデンター。それは十分に良い仕事をしているようであり、通常はもっと重要なことを考える必要があります。

1
Pete Kirkham

括弧で囲まれた式は、オープニングのレベルで保持します。

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

これにより、各式のレベルが明確になります。

1
brian-brazil

次の基準を満たしていれば、どの方法を使用してもかまいません。

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

あなたがチーム開発に参加している場合、do合意に到達できず、指示する人がいない場合は、難解な投票メカニズムによって、あなたの間の規約に同意するようにしてください。

1
Mike Woodhouse

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();
}

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

0
prime

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

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

その答えは、3レベル以上のインデントが必要な場合は、とにかくねじ込まれているため、プログラムを修正する必要があるということです。

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

0
Manuel

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

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

ただし、このようなことをする上で重要なことの1つは、代入演算子を次の行の最初の文字として保持することです。これはメイントを与えます。プログラマーは、WTFがそれを見た瞬間に、見つめるだけでなく、見るように強制します。

非常に長いステートメントをラップして、私がそれが理にかなっていると感じたときはいつでもそれをします...必ずしも最初のインデントではありません。そう :

reallyLongMethodName (paramA,paramB,paramC);

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

reallyLongMethodName (paramA,
    paramB,
    paramC);

しかし、最終的には

reallyLongMethodName (paramA,
                    paramB,
                    paramC);

すべてのパラメーターが開き括弧と並んでいます。

If'sとwhilesの場合、私は次のようなことをします

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