web-dev-qa-db-ja.com

C#開発者が開き括弧を改行するのはなぜですか?

ここ数年のほとんどを、主にC#とSQLでの作業に費やしてきました。その間私が一緒に働いてきたすべてのプログラマーは、関数または制御フローステートメントの開始ブレースを新しい行に置く習慣がありました。そう ...

public void MyFunction(string myArgument)
{
     //do stuff
}

if(myBoolean == true)
{
    //do something
}
else
{
    //do something else
}

特にif/elseステートメントでは、これがどれほどスペースを無駄にしているかに常に悩まされてきました。そして、私はC#の新しいバージョンに次のような代替案が存在することを知っています。

if(myBoolean == true)
    //do something on one line of code

しかし、ほとんど誰もそれらを使用しませんでした。誰もが中かっこで改行しました。

その後、久しぶりにJavaScriptに戻りました。私の記憶では、JavaScript開発者はまったく同じ中かっこ改行を行っていましたが、ほとんどすべての開発者が新しいライブラリーやその他のものを使用して、宣言の後に開き括弧を置いています。

function MyJavaScriptFunction() {
    //do something
}

クロージャと関数ポインタを使用することはJavaScriptで一般的になったので、多くのスペースを節約し、物事をより読みやすくするので、この意味を理解できます。それで、なぜC#で完了したものと見なされなかったのか疑問に思いました。実際、Visual Studio 2013で上記の構成を試してみると、実際に再構成され、新しい行に左中かっこが配置されます。

今、私はコードレビューSEでこの質問を見ました: https://codereview.stackexchange.com/questions/48035/questions-responses-let-me-tell-you-about-yo 私はあまり馴染みのない言語であるJavaでは、宣言の直後に中括弧をモダンなJavaScript形式で開くことは厳格であると考えられていることを学びました。

C#はもともとJavaに基づいてモデル化されており、同じ基本コーディング標準の多くに準拠していることを常に理解していました。しかし、この例ではそうではないようです。だから私は正当な理由があるはずだと思います:その理由は何ですか? C#開発者(およびVisual Studio)が新しい行に中かっこを開くことを強制するのはなぜですか?

48
Bob Tway

行の終わりにあるブレースは、ブライアンカーニハンとデニスリッチーの本 Cプログラミング言語 から出版された古代のK&R C標準です。 1978年にAT&TでUNIXオペレーティングシステムとCプログラミング言語(ほとんどの場合Cはリッチーによって設計されたと思います)を発明した後。

「1つの真のブレーススタイル」に関する炎上戦争がかつてありました。

RitchieがC言語を発明し、Kernighanが最初のチュートリアルを書きました。コンピューターのディスプレイには数行のテキストしか表示されませんでした。実際、UNICS(後のUNIX)開発は、ユーザーインターフェイスにタイプライター、プリンター、紙テープを使用したDEC PDP-7で始まりました。 UNIXとCは、24行のテキスト端末を備えたPDP-11で完成しました。そのため、垂直方向のスペースは確かに貴重でした。今日、私たちは皆、わずかに優れたディスプレイと高解像度のプリンターを持っていますよね?つまり、あなたのことは知りませんが、現在24インチの1080pディスプレイが3つあります。:-)

また、その小さな本の多く Cプログラミング言語 は、独自の行ではなく行の終わりに中括弧を置くコードサンプルです伝えられるところによると、印刷にかなりの金額を節約しました。

本当に重要なのは、プロジェクト全体の一貫性、、または少なくとも特定のソースコードファイル内の一貫性です。

そこにはare科学的研究もあり、それ自体の行にあるブレース(実際にはコードと同じレベルにインデントされている)は、どのような人々であってもコードの理解を向上させることを示しています彼らは美学について考えると思います。これにより、どのコードがどのコンテキストで実行されるかが視覚的かつ直感的に読者に明確になります。

_if( true )
    {
    // do some stuff
    }
_

ちなみに、C#はalwaysをサポートしており、分岐式の後の単一のコマンドの評価をサポートしています。実際、今でもそれが唯一のことです。分岐式の後にコードを中括弧で囲むと、その1つのコマンドがgotoになります(コンパイラーはjmp命令を使用してスコープを作成します)。 C++、Java、C#、JavaScriptは、ほぼすべてCに基づいており、ほとんどの場合、同じ基本的な解析ルールを使用しています。その意味で、C#は「Javaベース」ではありません。

要約すると、これは少し宗教的/炎上問題です。しかし、areの研究により、コードをブロックに配置するとhumanの理解が向上することが明らかになります。コンパイラーはそれほど気にできませんでした。しかしこれは、中括弧なしの分岐の後にコード行を決して配置しない理由にも関連しています-私または別のプログラマが後でそこに別のコード行を平手打ちし、それがそうしないという事実に陥るのはあまりにも簡単です直前または直後の行と同じコンテキストで実行します。

[〜#〜] edit [〜#〜]Apple _goto fail_バグ この正確な問題の完全な例は、非常に深刻な現実の結果をもたらしました。

_if( true )
    doSomething();
_

になる...

_if( true )
    doSomething();
    doSomethingElse();
_

この場合、doSomethingElse()はテストの結果に関係なく毎回実行されますが、doSomething()ステートメントと同じレベルにインデントされているため、見落とされがちです。これは本当に議論の余地はありません。研究はこれを裏付けています。これは、メンテナンス中にソースコードに導入される大きなバグの原因です。

それでも、JavaScriptクロージャー構文は、独自の行に中括弧が付いていると少しばかげているように見えることを認めます。 :-)

70
Craig

C#開発者がこれを行う理由は、これがVisual Studio自動フォーマッターのデフォルト設定であるためです。この設定は変更できますが、ほとんどの人は変更できないため、チーム内のすべての開発者が過半数を選ばなければなりません。

これがVisual Studioのデフォルトである理由については、わかりません。

31
Timwi

私がここでこの回答で仮説を立てたように、 https://softwareengineering.stackexchange.com/a/159081/29029 -Allmanのブレースを採用する決定は、Pascalの伝統のしるしである可能性があります。 Hejlsbergは、C#を設計する前にDelphiを作成しました。メソッド名のPascalケースと同じ。

個人的に私は「ローマではローマ人がするように」という格言に従うと信じています。 C#ではAllmanを使用していますが、JavaではK&Rを使用しています。私は慣れているので、どちらかの方法で規約を切り替えるのは私にとって不快です。

いくつかの規則の多様性は、実際に「多言語」開発者にとって有益であると私は信じています。これは、現在どの言語でコーディングしているかを思い出し、さまざまな習慣を簡単に区別できるようにするためです。これは、いわば、筋肉の記憶に相当する精神的なものです。

19
Konrad Morawski

Javaに関連付ける規約は、K&Rスタイル、または「One true brace style」であり、もともとはCに由来します。このページ indent-style from the由緒あるJargon Fileは、区別がどのくらい古いかを示しています。

Allmanスタイルとそのバリアントは、作成者がコードについてどのように考えているかを反映しており、一部の言語がコードブロックの「開始」と「終了」を使用する方法と同様に、ブロック区切り文字をキーワードのレベルに引き上げています。

15
John Bickers