C++やJavaなどの言語でブロックコードを書く場合、人々は通常、行の終わりにあるブラケットに独自の行を含めるかどうかについて議論します。
if (condition) {
if (condition)
{
ただし、下の2番目の形式を提案する人すら見たことがありません。以下は同等ですか、もしそうであれば、なぜ私は2番目のものを見たことがないのですか?考えられる理由の1つは、それほど一般的ではないことですが、2つの括弧が連続してかなり頻繁に見られます。
if (condition) {
//code
if (condition) {
//code
}
}
if (condition) {
//code
if (condition) {
//code
} }
それは実際には括弧についてではなく、インデントと垂直方向の配置についてです。
インデントなし
インデントが効かない場合は、同じ行にブラケットをできます。
ラムダ式の例:
list.ForEach( a => { a.Init(); a.DoSomething(); a.Complete(); });
.NET CLRにある次のような空のインターフェースを宣言する場合の例:
interface IRequiresSessionState {}
単純なインデント
しかし、何かをインデントすることを計画している場合、識別のルールは、コードブロックの開始と終了を同じようにインデントし、ブロック内のものを次のように1レベル深くする必要があることを示しています。
void DoSomething() {
Code();
}
アイデアは、ブロックを垂直方向に目視することで、ブロックの最初と最後をトレースできるというものです。
あなたはこれをしないでしょう:
void DoSomething() {
Code();
}
またはこれ:
void DoSomething() {
Code();
}
目を使って終わりに行く始まりを見つけることができないからです。
ダブルインデント
つまり、次の非常に一般的なJavaScriptの例のように、同じ行で2つのブロックを開いた場合、同じ行で2つのブロックを閉じることができます。
document.ready(function() {
DoSomething();
});
または
while(flag) { for (i=1; i<10; i++) {
DoSomething();
}};
...率直に言って、そのような構成を使用することはないと思います。
私が考えることができる1つの理由は、閉じ括弧を個々の行に置くと、構文を壊さずに//
を使用してブロック全体を(アン)コメントしやすくなるためです。
ステートメントを区別し、ブロック/コンパウンドの開始位置と終了位置を確認できるようにする必要があります。これがオールマンスタイルが優れている理由です。
if (condition)
{
// compound content
}
ただし、一部の人々は古い紙節約のK&Rスタイルに慣れてきました。
if (condition) {
// compound content
}
これにより、開始文字と終了文字が同じ列になく、ブロックと区別して条件を区別することが困難になるため、ブロックが見にくくなります。しかし、それでも1つのステートメントを見ることができます。左括弧は、どこかに存在する必要があるため、条件の直後にある、機能不全のようなものです。しかし、締めくくりはステートメントの開始とうまく一致しています。
今これ...
if (condition) {
if (condition) {
// compound content
} }
オールマンとK&Rの両方の弟子は、これが恐ろしいことに同意します。ステートメントブロックを確認するのに役立つリファレンスがないためです。最後の}は内部のifステートメントに属しているように見えますが、そうではありません。
この非常に特殊なケースでは、非常に誤解を招くコードにつながり、誤解を招くコードは悪いコードです。一見すると、最初の閉じ波括弧は外側のif
のように見えますが、実際は内側のif
に属しています
(この答えは、「なぜこれを行うべきではないのか」とは対照的に、「なぜこれはあまり議論されないのか」という精神で質問をします)
これに関するWikipediaの記事( https://en.wikipedia.org/wiki/Indent_style )は、コードの最後の行の後に閉じ括弧を配置する2つのインデントスタイル(リストされている9つのうち)を示しています(単独の行とは対照的に):
ピコ:
while (x == y)
{ something();
somethingelse(); }
舌足らずの発音:
while (x == y) {
something();
somethingelse(); }
あなたが提案するのは、LISPスタイルのようです。ただし、私はあなたのハイブリッドが少しハイブリッドであることを認識しています。最初のブレースは新しい行にありますが、重複するブレースは折りたたまれています。
なぜそれについてあまり議論されていないのかという問題は、おそらくこれが悪いことだと人々が同意しているためでしょう。これが問題を引き起こすいくつかの明白な理由(コメントアウトが難しい、読みにくいなど)と、ブロックの開始が中括弧であるか、ブロックの前のステートメントが実際に適用されないのかという思想的な質問閉じ中括弧(おそらくdo...while
ループ)なので、熱くなることはほとんどありません。
コードブロックには、行を挿入または削除する場所が3つあります。既存の最初の行の前、2つの既存の行の間、最後の既存の行の後です。
2番目は簡単です。最初と3番目は、開始ブラケットと終了ブラケットの位置を決定するものです。ブラケットが既存のコード行と同じ行にある場合、あなたは苦しむことになり、遅かれ早かれ誰かがそれを台無しにするでしょう。
機械がネズミの肘をどうにかして与えないので、明らかに、それはすべて人間の可読性に関するものです。そして、人間に関する限り、「それはすべて見る人の目にかかっている」ので、数学的に明確な答えはあり得ません。しかし、1つの答えは「標準」です。これは、QWERTYキーボードレイアウトが標準になったのとほぼ同じです。しばらくすると、だれでも十分に慣れることができます。
しかし、私の特定のスタイルは、それを採用するか、そのままにするかは、状況によって多少異なります。コードの短いブロックの場合、通常、最後の "}"を別の行に配置しません。たとえば、
if ( this ) {
that1;
that2; }
しかし、より長いブロックの場合
while ( this ) {
that1;
that2;
etc;
} /* --- end-of-while(this) --- */
最後の "}"を別の行に配置するだけでなく、その範囲を示すコメントでラベルを付けます。 (個人的に、私はあなたのためにメイティング区切り文字を点滅させるemacsおよび類似の構文の強調表示が嫌いですが、それは私だけです:)。
だから私の個人的な見解は、スタイルのこの側面の石に刻まれた標準はやり過ぎだということです。あなたが書いているコードを見て、一緒に来てそれを読んで維持しなければならない次の貧しいスロブにとって最も読みやすいスタイルでそれを書いてみてください。