時々、ソースに長い行を書かなければならないことがあります。これで止められたものをどのようにインデントしますか?.
同じようにインデントできます:
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番目の可能性は、長い行をまったく改行しないことです。現代のエディターはそれを処理して、ソフトな改行を作成できます。しかし、別のエディターでは横にスクロールする必要があり、位置に影響を与えることはできません。エディターは長い行を壊します。
どんな可能性を好みますか?これを解決する他のアイデアはありますか?正当な理由であなたの好みをサポートできますか?
状態と内側のブロックをすべて1つの項目として見やすくするので、自分の行で中かっこが好きです(つまり、私が何を意味するかを知っている場合)。
if ((long test 1)
&& (long test 2)
&& (long test 3))
{
code executed if true;
}
「条件付け」条件が非常に重要であり、前の行の終わりで見落とされる傾向があるため、条件が何であるかで追加の条件付き行を開始するのが好きです。
また、括弧の効果が明白になるようにインデントを試みます(ただし、長い条件文を回避しようとすることは一般的には良いことです)。
私は「もの」を簡単に「スキャン」できるようにものを構成してみます:)
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)
一般的に私はします:
if (condition) {
something;
}
ブロック区切り文字用。ただし、長い行の場合に分割する必要がある場合は、これを使用します。
if (
(long test 1) &&
(long test 2) &&
(long test 3)
) {
code executed if true;
}
Rbobbyの回答との主な違い:
これには、パラメーター/条件付きリストをコードブロックのように見えるようにする視覚効果があります(ただし、中かっこの代わりにかっこを使用します。対称性が良いことがわかります。また、線にむき出しの中かっこ(ひどいように見える)を回避します。 。
私には2つの単純なルールがあります。
したがって、ifの場合:
if ((long test 1) &&
(long test 2) &&
(long test 3)) {
code executed if true;
}
私はすでにここに書かれていることについて少し変化があります:
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
}
"IDEと戦わないでください。"
ただし、私のIDE(Eclipse、Visual Studio)は改行したいので、改行します。
これは、言語間の不整合を意味する場合がありますが、これは問題ありません。
常にインデントしますが、ifステートメントは特別です。テストを並べるのが好きで、余分な&&
左側の演算子:
if ( (long test 1)
&& (long test 2)
&& (long test 3))
{
code executed if true;
}
&&
と左揃えしてif
に合わせることも可能ですが、この代替案は読みにくいと思います。
私は過去に同様の質問をしました:
この種の質問の難しさはその主観的な性質なので、私は答えを受け入れることができませんでした。
インデントスタイルをコードベース全体で一貫させることは重要な部分だと思います。
特定の方法でコードをフォーマットする唯一の理由は、コードを読みやすくするためです。これは本質的に主観的なものです。見た目が良く、コードを初めて見る人にとって読みやすくなるようにしてください。そして、私は従来の知識を捨てて、一般的な標準について心配しないでください-2つの理由で
1)破線にはさまざまな可能性があるため、この状況では難しい
2)何も買わない。限目。繰り返しになりますが、コードのフォーマットは単にコードを読みやすくするためのものであり、コードの詳細をフォーマットする標準的な方法があっても、読みやすさは損なわれません。
Astyle、または使用している自動インデンター。それは十分に良い仕事をしているようであり、通常はもっと重要なことを考える必要があります。
括弧で囲まれた式は、オープニングのレベルで保持します。
if ((long test 1) &&
(long test 2) &&
(long test 3)) {
code executed if true;
}
これにより、各式のレベルが明確になります。
次の基準を満たしていれば、どの方法を使用してもかまいません。
あなたがチーム開発に参加している場合、do合意に到達できず、指示する人がいない場合は、難解な投票メカニズムによって、あなたの間の規約に同意するようにしてください。
Java Oracleはこれらの規則を提供します。 Javaコードの規則-Oracle。
例として、
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();
}
そのドキュメントには、さらに多くの例が示されています。
私の意見では、78文字または80文字の行幅は、同じ画面で複数のファイルを並べて開くことが容易になるので便利です。
正当化、 Linus Torvaldsによる引用 はどうですか? :)
その答えは、3レベル以上のインデントが必要な場合は、とにかくねじ込まれているため、プログラムを修正する必要があるということです。
私は通常、 Google C++コーディングスタイル (これをJavaに適応させることもできると思います)と このC++コーディングスタイル の集まりに従います。
同じ行でインデントすることはほとんどありません。ただし、非常にまれな機会に、このような一連の変数を再初期化します
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;
}