なぜC#開発者は括弧を開くのですか?[閉まっている]


44

私はここ数年のほとんどを主に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-you これで私はJavaでそれを学んだ、A私があまり馴染みのない言語です。宣言の直後に中括弧を開くのは、最新のJavaScriptのように厳格であると考えられています。

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


30
コンベンションはそれだけです。
Oded 14

19
Visual Studioは何も強制しません。コードスタイルは構成可能です。何かをデフォルトにする必要があります。どのデフォルトが「より良い」かは、最高次数のbikesheddingです。
Phoshi

23
行末のブレースは、古代のK&R C標準です。KernighanとRitchieは、コ​​ンピューターのディスプレイに25行(ヘッダー行とステータス行を追加した場合は23行)しかなかったときにC言語を発明しました。そうではありませんよね?重要なのは、プロジェクト全体の一貫性です。あります(実際には、コードと同じレベルにインデント)独自のライン上のブレースは、コード改善されることを示す科学的研究にも理解を人々が美学を考える考えるものにもかかわらずが。
クレイグ14

10
ちなみに、C#は条件付きの後の1行のコードの評価を常にサポートしています。実際、今でもそれが唯一の機能です。分岐式の後にコードを中括弧で囲むと、その命令がgotoになります(コンパイラはjmp命令を使用してスコープを作成します)。C ++、Java、C#、およびJavaScriptは、ほぼすべてCに基づいており、ほとんどの部分で同じ基礎となる解析ルールを使用しています。その意味で、C#は「Javaベース」ではありません。
クレイグ14

10
補足として、if(myBoolean == true)私にはほとんど意味がありません。我々がそれにいる間、そうでない間if ((myBoolean == true) == true)?? ちょうどif (myBoolean)それで十分です。申し訳ありませんが、私のペットのピーブ。
コンラッド・モラウスキー

回答:


67

行末のブレースは、Brian KernighanとDennis Ritchieの著書The C Programming Languageにある古代のK&R C標準です。主にRitchieによって設計されました)、AT&Tで。

以前は、「1つの真のブレーススタイル」についてフレーム戦争がありました。

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

また、Cプログラミング言語の小さな本多くは、独自の行ではなく行の最後にブレースを置くコードサンプルであり、印刷にかなりの金額を節約したと言われています。

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

あります(実際には、コードと同じレベルにインデント)独自のライン上のブレースは、人々は、彼らが美学を考える考えるものにもかかわらず、コードの理解を改善することを示す科学的研究も。視覚的にも直感的にも、どのコードがどのコンテキストで実行されるかを読者に非常に明確にします。

if( true )
    {
    // do some stuff
    }

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

要約すると、これちょっとした宗教/炎戦争の問題です。しかし、ブロックにコードを配置することで人間の理解が改善されることをかなり明確にする研究があります。コンパイラはそれほど気にすることができませんでした。しかし、これは、ブレースなしでブランチの後にコード行を配置しない理由にも関係しています。私または別のプログラマーが後で別のコード行を平手打ちして、その前後の行と同じコンテキストで実行します。

編集この正確な問題の完璧な例についてはAppleのgoto failバグをご覧ください。非常に深刻な現実世界への影響がありました。

if( true )
    doSomething();

になる...

if( true )
    doSomething();
    doSomethingElse();

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

それでも、JavaScriptのクロージャー構文は、見た目上、ブレース付きで少し馬鹿げているように見えることは認めます。:-)


13
条件文のブロックに関する部分はやや誤解を招く恐れがあります。Cでは、条件文には常に単一のステートメントがありますが、ブロック(複合ステートメント)は一種のステートメントです。C#はこの先例に従います。とにかく、すべての一般的な命令セットは線形であるため、条件付き評価は常に何らかの条件付きgotoまたは分岐命令を意味します。ブロックのない条件式は、ブロックのある条件式と定性的に違いはありません(スコーピングに関する場合を除く)。
アモン

3
@Craig、これはベル研究所で、ベル研究所が「何でも実用的であることが必ずしも必要ではない「面白いことをする」ためにチャーターされたときだったことを思い出してください。頭のいい人を建物に入れて、面白い研究をするように伝え、「面白くない」ことをやめさせてください。面白いことに、興味深いもの(トランジスタやUnixなど)が飛び出す傾向があります。DARPAは、当初から同じような焦点を当てており、基礎研究の名のもと、多くの優れた研究に資金を提供しました。
ジョンR.ストローム14

3
@Craigは:古いパスカル/ Delphiの時代に、私は通常パスカルの用途として、単一ラインのブロックのためにそれを回避beginし、end見逃すことは本当にハードこのようなエラーになり括弧の代わりに、それはまた、より厳しいセミコロンの配置について-しかし、支出を持ちます昨年4日、組み込みCの問題をデバッグしましたが、これはブレースの配置の不足によるものでした。....制御ステートメントにブレースを必須にするコンパイラオプションがあるはずです。
マークKコーワン14年

12
「...ブレースが独自のライン上にあることを示す科学的研究...」への参照を提供してください。少なくとも2つの参照(それ以外の場合は次のようになりますがなければ研究ではなく、研究)、それだけで空気中にランダムに撮影しています。
エリック

2
@Craig、あなたが言及した調査研究を見つけるための手がかりを提供できますか?
グジェゴシアダム・コワルスキー

30

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

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


15
Visual Studioのデフォルトです。これは、Microsoftで広く受け入れられているコーディングスタイルであり、実際、少なくともMicrosoftの一部のチームでは、スタイルが独自の行の中括弧だけでなく、独自の行の中括弧でもあったためです。インデントされます。したがって、これはVisual Studioのオプションでもあります(個人的には好みです)。
クレイグ

20
@クレイグ:Ewwwwwwwww
モニカとの軽さレース

5
@PreferenceBeanうーん。個人的には、K&Rスタイルが嫌いです。なぜなら、括弧は行末のノイズで失われるだけで、テキストは私には塊に見えるからです。縦の空白が好きです。12インチモニターでは、縦方向のスペースが貴重だった昔の24行のテキストで少し異なりまし
クレイグ

10
@Craig:ブレースインデントのための言い訳ません:Pを
モニカと明度レース

2
@Craigマイクロソフトの従業員を悲惨なものにするには?
Mateen Ulhaq

18

-私はここにこの答えに仮説を立てたようhttps://softwareengineering.stackexchange.com/a/159081/29029 -私はオールマンの筋交いで行くという決定は、彼はC#の設計前にHejlsbergは、Delphiを作成したことを考えると、パスカル遺産の兆候かもしれないと仮定します。メソッド名のパスカルの場合と同じです。

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

コンベンションの多様性は、「多言語」開発者にとって実際に有益であると信じています。これは、現在コーディングしている言語を覚えておくのに役立ち、さまざまな習慣を区別しやすくするためです。それは、いわば、筋肉の記憶と精神的に同等です。


7
実際には、「多言語開発者」の行に+1。私は真剣に自分の行にブレースとインデントを好む。しかし、たとえばASP.NET(MVC)プロジェクトでの作業では、「正しい」スタイルのC#と「JavaScript」スタイルのJavaScriptが好きであることがわかりました。これは少し冗談ですが、正直なところ、JavaScriptのクロージャー構文は行末の波括弧でより魅力的です。私は誰...など美学に限り奴隷だので
クレイグ・

メソッド名のPascalCaseは、Microsoftの標準だった長いアンダース・ヘルスバーグは、Microsoftの著名なソフトウェアエンジニアであることをボーランドを出る前の時間。
クレイグ

2
興味深いことに、すべてのブレースブロック言語にAllmanを使用しています。しかし、インデントから中括弧ブロックへの前処理変換がJavaでどのように見えるかについて、ますます興味を持ち始めています。「java」コードは、パターン認識の心を包むと、非常にきれいに見えるかもしれません。私は、Pythonは実際に右のそれを持っているかもしれないと思う:なし本当にありません偉大な言語での括弧の理由は。
tgm1024

空白を使用してプログラムフローを制御するのは狂気です。Pythonは最近人気がありますが、Pythonのこの側面は、最初に登場してから少し変わっています。
クレイグ

ここで@Craig Pythonファン、javascriptで何かを成し遂げようとしています。他の答え、およびについての編集goto failを見て、インデントを使用してプログラムフローを制御することは人間が自然にしたいことなので、表示されるのは実行されます。インデントが間違っている場合、プレーンは機能しません。それらの中括弧が意味するものを解釈する必要があるのは、それらが実際にインデントを反映しているかどうかにかかわらず、プログラムを理解する以上の追加作業です。インデントはブレースに対して冗長です。それで、ブレースが有用な場合、プログラマはなぜインデントを使用するのでしょうか?深いネストは、どの言語でも理解できません。Jus 'sayin'。
Neil_UK

14

Javaに関連付ける規則は、K&Rスタイル、つまり「1つの真のブレーススタイル」であり、元々はCに由来します。このページは、由緒あるJargon Fileのインデントスタイルで、その区別の古さを示しています。

Allmanスタイルとその変形は、著者がコードをどのように考えているかを反映し、一部の言語がコードブロックの「開始」と「終了」を使用するのと同様に、ブロック区切り文字をキーワードのレベルに上げると常に考えてきました。


私は、最近のOTBS(1つの真のブレーススタイル)は、1行のコードであっても、制御ステートメントの後にブレースを残さないことを意味するという印象を受けています。Apple goto failバグを参照してください。
クレイグ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.