中かっこスープの取り扱い


11

私は何年もC#とVB.NETの両方でプログラミングしましたが、主にVBでプログラミングしました。私はキャリアをC#にシフトしていますが、全体的にはC#の方が好きです。

しかし、私が抱えている問題の1つは、中括弧のスープです。VBでは、各構造キーワードに一致する近いキーワードがあります。次に例を示します。

Namespace ...
    Class ...
        Function ...
            For ...
                Using ...
                    If ...
                        ...
                    End If
                    If ...
                        ...
                    End If
                End Using
            Next
        End Function
    End Class
End Namespace

C#で記述された同じコードは、非常に読みにくくなります。

namespace ... {
    class ... {
        function ... {
            for ... {
                using ... {
                    if ... {
                        ...
                    }
                    if ... {
                        ...
                    }
                }
            }
            // wait... what level is this?
        }
    }
}

VBにそのように慣れているので、読みやすさを改善し、コードが正しい「ブロック」になることを保証するためにCスタイルのプログラマーによって採用されている技術があるのだろうかと思っています。上記の例は比較的読みやすいですが、コードの最後に8レベル以上の中かっこがあり、興味のあるブロックを終了するブレースを特定するために、いくつかのページを上にスクロールする必要がありますに。


83
これは説教に聞こえるかもしれませんし、あなたはそれを必要とする特別な条件を持っているかもしれません(ええ、時にはそれが必要です-ありがたいことにそのような時はまれなはずです)が、通常は 「...どのブレースが私が興味を持っているブロックを終了するかを把握するためにいくつかのページをアップします。
FrustratedWithFormsDesigner

7
私がやったこと、そしてやることに気付いたことが、中括弧の最後にあります。それについてのコメントを追加します。のようなもの// End's using X statement
PiousVenom

14
@FrustratedWithFormsDesignerは、制御フローが混乱しており、やり直す必要があるという事実についてスポットしています。そうは言っても、スコーピングよりも中括弧について不満を言っていると思うので、慣れるだけでいいと思います。あなたが慣れているものとはかなり異なる構文で言語を学習することは、しばらくの間は間違いなくスープのように見えますが、練習はなくなります。あなたの頭脳が構文をより自然に処理し始めるまで、あなたはただ屈んで対処する必要があります。
ジミー・ホッファ

2
@FrustratedWithFormsDesigner-COM相互運用状況で多くのCOMオブジェクトをクリーンアップする必要があります。私はこの記事で提案手法を使用しています:jake.ginnivan.net/vsto-com-interopを。これにより、2つまたは3つのレイヤーが簡単に作成されます。forループ、関数、クラス、および名前空間を(ifステートメントと共に)積み重ねると、簡単に複数のブレース層に到達できます。
JDBは、

5
@TyrionLannister-そして、それらは彼らが属するものと同期しない最速のコメントのいくつかである可能性があります...私はそのような何かを持っているつもりなら、自動生成されることを好むと思います(ディスプレイで) -時間のみ、永続化されない)IDEによって。
時計仕掛けミューズ

回答:


38

次のように、開始中括弧を終了と同じ「ランク」に入れます。

namespace ... 
{
    class ... 
    {
        function ... 
        {
            for ... 
            {
                using ... 
                {
                    if ... 
                    {
                        ...
                    }
                    if ... 
                    {
                        ...
                    }
                }
            }
            // It's the `function` level!
        }
    }
}

15
同意する。エジプトの括弧は頭痛の種です。
-PiousVenom

8
また、ほとんどのIDEは、(おそらく)ブレースのパートナーをクリックすると強調表示されます。
StuperUser

3
@TyrionLannister:そのスタイルの用語をついに教えてくれてありがとう!「誤った位置にあるブレース」以外の名前はありませんでした。
FrustratedWithFormsDesigner

3
@ Cyborgx37:ご使用のIDEには「マッチングブレースに移動」機能がありますか?通常、現在強調表示されている中括弧にカーソルを自動的に移動するキーショートカットにバインドされています。
FrustratedWithFormsDesigner

3
おっと、これがどのように簡単になるかわかりません。どちらの方法でも、キーワードに到達するまでブレースのインデントレベルで画面を調べるだけです。そして、これらすべての余分な行を使用して、さらに調べる必要があります。
Blorgbeardは

14
  • IDEに応じて、カーソルをオープン/クローズブレースに置くと、そのブレースと対応するブレースの両方が強調表示されます。
  • ブロックを折りたたむと、ブロックの開閉位置が表示されます。
  • より小さいコードブロックを記述します。真剣に。をチェックしてClean Code、この問題に二度と出会うことはありません(より読みやすく保守しやすいコードを用意してください)。

1つの注意点として、以下は特定の状況に役立つ有効なc#構文です。

using (var type = new MyDisposable1())
using (var type2 = new MyDisposable2())
{
    /* do what you will with type2 and type2 */
}

強調表示された単一のキャラクターを探していることが、最初にこの質問を投稿するきっかけになりました。
JDBはまだモニカ覚えて

2
@ Cyborgx37:したがって、ポイント3。コードブロック全体が画面に収まる場合、ハントする必要はありません。私が書いたほとんど/すべてのクラスで、画面に収まらない中括弧のペアは名前空間/クラスのみです。
スティーブンエバーズ

ポイント1と2であなたが提案するのは私が今やっていることです...しかし、これは私がコーディングしている場所を離れ、次の行をどこに置くかを理解するためにコードのビューを操作し始める必要があります。ポイント3は、あなたのコードは、いくつかの層が必要です場合は特に、よく取られているが、常に可能ではないusing(参照ブロックをjake.ginnivan.net/vsto-com-interop
JDBはまだモニカ覚えて

@ Cyborgx37:編集をご覧ください。
スティーブンエバーズ

1
@ Cyborgx37あなたが他のすべてから際立った色を選んだ場合(私はしばらく紫色の背景と白いテキストを使用していました、IIRC)、一致する中括弧を探す必要はありません-それは実際にあなたに「私はここにいる! 「。
CVn

5

一般的な規則は、閉じ括弧の後にコメントを追加して、閉じている構造を示すことです。

if {
   ...
} // end if

while (condition) {
   ...
} // end while

など。私はこのコンベンションに自分自身を温めたことがありませんが、一部の人々はそれが役立つと感じています。


16
私は(変更の人がこれを行う見て、彼らは交換時に/ブロックの初めを変更しているwhileforに、スワップif彼らは文)ほとんどない、それらをレンダリング、クロージングコメントを更新するために覚えていないより悪い無用より。この規則はおそらく、一致{する性質が変更されるたびにコメントを維持するように強制できる場合にのみ役立つでしょう。
FrustratedWithFormsDesigner

ええ、私はこれのいくつかをしましたが、それは多くの余分な作業(およびノイズ)です。もっと簡単なものがあればいいのにと思っていました。
JDBは、

5
コメントのみ説明しなければならない理由は決してどのコードがそれらと説明するコメントに頼るの両方を行うのいずれかとして、それらのコードは、コードがコメントしていない修正すべき兆候である読みにくいことを意味します。
ジミー・ホッファ

1
これは誰もエディタを書かなかった理由私が表示されますこれらのコメントことを思ってしまうが、実際のコードでそれらが含まれていません...
ブレンダン・ロング

2
@JimmyHoffa:コメントのより良いルールは、コメントを明確にすることだと思います。通常、それは「なぜ」と答えることを意味しますが、他のことも意味します。ドグマにとらわれすぎて、実際には役立つことをやめさせないでください。たとえば、開始ブレースから遠く離れた終了ブレースにコメントを時々追加するなどです。
ブライアンオークリー

5

一般に、どのスタイルでもブレースを一致させることが困難になると、おそらくメソッドが長すぎてリファクタリングする必要があることを意味します。


5

中かっこで頑張る必要があると思います。最終的にそれらはあなたにとって二番目の性質になり、あなたは彼らなしでどうやって生きてきたのか不思議に思うでしょう。

ただし、それらが適切にインデントされていること、およびいくつかの間隔規則が守られていることを確認してください(どちらでもかまいません)。


1年後、このアドバイスは真実です。:)
JDBは、モニカを

4

名前空間とクラススコープを水平方向に折りたたみ、2レベルのネストを削除します。メソッドが画面の左端と同じ高さになっていることに注意してください。すべてのファイルで2レベルのインデントを失うことには意味がありません。

その後、4レベル以上の深さまでネストすることはほとんどありません。

namespace FooNameSpace {
class Foo {

public void bar()
{
    while(true)
    {
        while(true)
        {
            break;
        }
    }
}

public void fooBar()
{
    foreach(var item in FooList)
    {
        foreach(var b in item.Bars)
        {
            if(b.IsReady)
            {
                bar();
            }
            bar();
        }
        bar();
    }
}

}}//end class, namespace

Iこのアイデアのように、しかし、メーカーはそれをサポートしていないようです(少なくとも、2008年われわれは今年の末までに2012にアップグレードするので、ここで期待しています)ビジュアル
JDBはまだモニカ覚えて

@ Cyborgx37。VIMでテキストを外部で編集するので、問題はありません。しかし、Visual Studioでは次の操作を行います:Control + A、次に「インデントを減らす」ボタンを押します。新しいファイルに対してのみ行ってください。既存のファイルを気にしないでください。ソース管理の差分比較が台無しになります。
mike30

閉じかっこを入力すると、VSによる自動フォーマットが開始されますが、CTRL + Zを押してその提案を拒否することができます。
パリのアレックス

1

私は最近、基本的に次のようなフロー制御構造に関する2つのルールを試してみることにしました。

  • 必要なコードフロー構造だけが必要です
  • コードフロー構造はできる限り小さくする必要があります

あなたが言及し、明確に認識している正確な理由から、これらは従うべき素晴らしいルールだと思います。それらを達成するために使用できるいくつかの簡単なテクニックがあります。

  • できるだけ早くスコープを終了します(これには、ループのスコープと関数が含まれます)
  • 前述のifから関数を終了することで軽減できる他の要素を監視し、前述のスコープ終了手法を適用します
  • if内のコードが外部のコードよりも優れている場合、条件チェックを逆にします
  • ループのサイズが大きくなり、メソッドの残りが不明瞭になると、ループ内のコードを別のメソッドに分解します
  • 別のスコープのみを含むスコープ、たとえば、スコープ全体がifで満たされ、if以外に何も含まれていない関数を監視します

私は詳細にここにこれらはあなたが言ったようにやっている間違ったコードブロックにコードを置くことで終わることができ、以下ではない方法の例悪いとメンテナンス時までトリミングバグの簡単な原因を。


おかげで、リファクタリングできるブロックが1つか2つあるかもしれません。それは役立ちますが、いくつかのネストされたusingブロックをリファクタリングするのは困難です。
JDBは、

実際にブロックを使用している@ Cyborgx37は、ネストされたフルフィルメントスコープの場合、インライン化できます。こちらを参照してくださいstackoverflow.com/questions/1329739/…基本的に、単一行フロー制御構造のように機能します。if(true)if(somethingElse)if(otherThings){doThis(); それを行う(); doWhatever(); }とIFSの巣あなたは(GOD OF FOR THE LOVE、JUST DO THIS WITH USINGS、何もELSEあわやそのコードLIKEを書かないでください)期待通り
ジミー・ホッファ

はい、ブロックを使用したネストについては知っていますが、これは下に単一の行がある場合にのみ機能します。私のコードのほとんどでは、そうではありません。それでも全体的に非常に役立つ投稿です...いくつかのことを学びました(+1)
JDBはまだMonicaを覚えています

@ Cyborgx37ええ、スコープのネストは余分なビットがない場合にのみ機能しますが、それはあなたの使用方法にパターンがあると言いましたか?それが一番上にある場合はその余分なものをコンストラクターに移動し、一番下にある場合は処分することはおそらく実行可能でしょうか?それはパターン化されている場合です。これは問題として取り上げたためであると推測されるため、コード内でネストを頻繁に使用してこれらに遭遇する可能性があります。
ジミー・ホッファ

実際に、COMオブジェクトを「AutoCleanup」クラスにラップするFactory-pattern実装の作業を開始しました。次にusing、ファクトリクラスで1つのステートメントを使用し、それが破棄されると、ラップされたすべてのクラスを自動的に破棄します。これまでのところうまく機能しておりusing、コード内のステートメントの数が大幅に削減されています。
JDBは、モニカを

1

これは、残念ながら、コンピューティングにおける戦争の最も古い原因の1つです。両側から合理的な議論を行うことができます(垂直方向の不動産経済の改善と、開き中かっこと閉じ中かっこを視覚的に一致させる簡単な機能)が、実際には単純なソースコードフォーマッタがすべてを解決します。MS Visual C#には、うまく機能するものが組み込まれています。

ただし、チームの一員として作業している場合は、そのチームが使用する規則に従うことが期待されるため、両方のスタイルにある程度精通し、ブレーススタイルよりも宗教的になることを控えることが重要です。

そのため、学習している間は、学習しやすいスタイルに焦点を当てますが、学習中は相手に目を向けてください。そうすればうまくいきます。


1
それがデフォルトのフォーマッタかReSharperの何かかどうかはわかりませんが、C#を使用していたときは、チェックインの一部としてコードを再フォーマットするオプションセットがありました。そうすれば、作業中に望みどおりにコードをフォーマットできますが、チェックイン時に「プロジェクト標準」に再フォーマットされます。私たちが持っていた唯一の本当のフォーマット標準は、タブの代わりにスペースを使うことだったと思います。
TMN

1

Resharperを使用します。これは、ネストを減らす方法を推奨するのに役立ちます。また、Bob Martinの著書Clean Codeを読んでください。関数は1つのことだけを行うべきであり、したがって、各関数は半ダースの行だけである必要があることを強調しています。


1

エディターには、C#の概要で役立つアドオンがあります。

このアドオンは、ネストされたコードブロックを折りたたみ、展開、強調表示する機能を追加することで、C#のVS20xxエディターを拡張します。これらの機能により、if、whileなどのコードブロックのネストされたコンテンツの編集と読み取りが容易になります。


0

Visual Studioでコードを記述する場合、構築するすべての構造の最初と最後の間に縦のドットを表示するプラグインもあります。

しかし、全体的には、「Curly-Braces-Soup」に慣れるまで少し時間がかかると思います。(ところで、私はその表現が本当に好きです。ビッグバン理論のエピソード名に少し似ています)


0

インデントは、構文の両方のスタイルで、現在地を示します。VBプログラムまたはC#プログラムを1行で書くと、ネストされた構文のどこにいるかをすぐに知ることができなくなります。マシンはブロック終了フレーズまたは中括弧を解析しますが、人間にはインデントが必要です。

ブロックエンディングフレーズは、プログラミングがはるかにインタラクティブで視覚的ではなかった、パンチカードや紙テープの時代に由来します。または、実際にはまったくインタラクティブではありません。プログラムを入力することは困難であったため、プログラマーはコンパイラーに構文解析とエラー回復について非常に巧妙である必要がありました。

過去の時代では、編集-コンパイル-実行のサイクルには、カードパンチャーを使用してパンチカードを準備し、その後、店員がパンチカードを受け取ってマシンに送信するジョブ送信ウィンドウに並ぶ必要がありました。その後、プログラマは別のウィンドウから出力(紙に印刷)を収集します。プログラムにエラーがある場合、出力はコンパイラ診断のみで構成されます。ターンアラウンド時間が長い場合、プログラマは時間の無駄を減らすために1回の反復でできるだけ多くのエラーを修正する必要があるため、診断の品質の向上に役立つ場合end if、単なる入力ではなく入力の追加コスト)が正当化されますジョブ送信ウィンドウでの反復。

閉じ中括弧が欠落している場合、どの開き括弧が閉じられていないかを判断するのは困難です。(コンパイラーは、知識に基づいた推測を行うためにインデントを解析する必要がある場合があります。)関数内の右中括弧を削除すると、ファイルの残りの部分全体がその関数の一部であるように見えます。一方、end function構文がある場合、コンパイラはエラーのある関数がどこで終了するかを推測し、後続の関数を適切に回復、解析し、もしあれば、意味のある追加の診断を提供できます。

コードを自動的にインデントおよび色付けするコード対応テキストエディターで作業している場合、60行以上を表示できる高解像度画面では、これらの種類の不器用な言語の引数は適用されなくなります。プログラムを段階的に編集および再構築できるので、一度に1つのエラーに対処できます。さらに、画面上でプログラムの大きなセクションを同時に表示し、適切なインデントを維持することにより、そもそもこうした種類のネストエラーの発生を減らすことができます。また、優れたプログラミングテキストエディターは、入力時にいくつかの種類の構文エラーにフラグを立てます。さらに、構文に基づいてプログラムのブロックを折りたたみ、構造の「概要のような」ビューを提供する折りたたみエディターがあります。

Lispは最初から括弧を使用しましたが、おそらく偶然ではないが、Lispハッカーは、小さなチャンク(式)でプログラムを受け入れるシステムを構築することで、プログラミングをインタラクティブな体験として開拓しました。

実際、Python言語が示すように、終了記号はまったく必要ありません。インデントは単なるできること構造。人間はすでにマシンが終了記号やフレーズに依存している言語でも、インデントを使用してコードの構造を理解しています。


-1

IDEを使用している場合は、Crtl+ k+ Dを押すだけで、IDEが残りの作業を行います。


どのIDE日食がインデントにctrl-shift-iを使用し、フォーマットにctrl-shift-fを使用するか
ラチェットフリーク

ビジュアルスタジオでチェックイン
Jagz W
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.