コードの折りたたみについてどう思いますか?[閉まっている]
-
08-06-2019 - |
質問
Visual Studio 環境を使用している方は、コードを #regions でラップすることについてどう思いますか?(または、他の IDE にも同様の機能がある場合...)
解決
10 回中 9 回、コードの折りたたみは、 SoCの原理 何の価値があるのか。
私も部分クラスについては多かれ少なかれ同じことを感じています。コードが大きすぎると思われる場合は、非表示にしたり分割したりするのではなく、管理しやすい (そして再利用可能な) 部分に分割する必要があります。
次回誰かがそれを変更する必要があるとき、それはあなたを噛むでしょう、そしてメソッドの 250 行のモンスターに隠されたロジックを見ることはできません。
できる限り、メイン クラスからコードを取り出して、ヘルパー クラスまたはファクトリー クラスに取り込みます。
foreach (var item in Items)
{
//.. 100 lines of validation and data logic..
}
ほど読みにくくはありません
foreach (var item in Items)
{
if (ValidatorClass.Validate(item))
RepositoryClass.Update(item);
}
とにかく私の0.02ドル。
他のヒント
で話題になりました コーディングホラー.
私の個人的な信念は、それらは便利ですが、過剰なものは多すぎる可能性があるということです。
これを使用して、コード ブロックを次のように並べ替えます。
列挙
宣言
コンストラクター
メソッド
イベントハンドラ
プロパティ
場合によっては、#region が推奨または要求されているチームで働いていることに気づくかもしれません。あなたも私と同じで、折り畳まれたコードをいじることに耐えられない場合は、C# のアウトラインをオフにすることができます。
- オプション -> テキストエディタ -> C# -> 詳細タブ
- 「ファイルを開いたときにアウトラインモードに入る」のチェックを外す
#Region を使用して、醜くて役に立たない自動生成コードを非表示にします。これは実際には部分クラスの自動生成部分に属します。しかし、古いプロジェクトやアップグレードされたプロジェクトを扱うときは、必ずしもそんな余裕があるわけではありません。
他の種類の折り方については、私はいつも Functions を折ります。関数に適切な名前を付ければ、何かをテストしたり (再) 書いたりしない限り、関数の内部を調べる必要はありません。
ジェフらが抱えている問題は理解していますが、アル。地域との関わり、私が感じていること しないでください なぜ叩くのか理解しています CTRL+M,CTRL+L ファイル内のすべての領域を展開するのは非常に困難です。
私が使う テキストメイト (Mac のみ) これにはコードの折りたたみ機能があり、関数を折りたたむのに非常に便利です。「getGet」関数が何をするのかはわかっているので、貴重な画面スペースを 10 行も占有する必要はありません。
同じコードを二度見せないように他の人にコードを見せる場合を除き、for ループや if ステートメントなどを非表示にするためにこれを使用することはありません。
私はリージョンではなく部分クラスを好みます。
他人によるリージョンの広範な使用も、どこかで誰かが単一責任の原則に違反し、1 つのオブジェクトであまりにも多くのことを実行しようとしているという印象を与えます。
@トム
部分クラスは、コード生成の完了後にツールで自動生成されたコードを必要なカスタマイズから分離できるように提供されています。これは、codegen を再実行した後もコードはそのまま残り、上書きされないことを意味します。これは良いことです。
私は部分クラスのファンではありません。私は、各クラスが責任を負う非常に明確な単一の問題を持つようにクラスを開発するよう努めています。そのためには、責任が明確なものを複数のファイルに分割すべきではないと考えています。だから私は部分授業が好きではありません。
そうは言っても、私は地域について迷っています。ほとんどの場合、私はそれらを使用しません。ただし、私はリージョンを含むコードを毎日扱っています。リージョンを非常に重視する人もいます (プライベート メソッドをリージョンに折りたたんで、各メソッドを独自のリージョンに折りたたむ)。また、軽めに扱う人もいます (列挙型のフォールド、属性の折りたたみなど)。現時点での私の一般的な経験則では、(a) データが静的なままである可能性が高い場合、またはあまり頻繁に操作されない場合 (列挙型など)、または (b) データが静的である可能性が高い場合、または (b)サブクラス化または抽象メソッドの実装のために必然的に実装されますが、やはりあまり頻繁には触れられません。
リージョンはメソッド内で決して使用してはなりません。これらはメソッドをグループ化するために使用される場合がありますが、コードを読む人が発狂しないように、細心の注意を払って取り扱う必要があります。メソッドを修飾子によって折りたたむのは意味がありません。ただし、折りたたむと可読性が向上する場合があります。たとえば、外部ライブラリを使用するときに問題を回避するために使用する、あまり頻繁にアクセスしたくないいくつかのメソッドをグループ化すると役立つ場合があります。ただし、この特定の例では、コーダーはライブラリを適切なクラスでラップするなどの解決策を常に模索する必要があります。他のすべてがうまくいかない場合は、可読性を向上させるために折りたたみを使用します。
これは、どこにも行き着かない愚かな議論の 1 つにすぎません。地域が好きな方はぜひご利用ください。そうでない場合は、それらをオフにするようにエディターを構成します。そこでは、みんな幸せです。
言語に固有のコードの機能に基づいて領域のグループ化を手動で維持する必要がない場合、領域の折りたたみは問題ありません。たとえば、コンパイラはそれがコンストラクターであることをすでに認識しています。IDE のコード モデルは、それがコンストラクターであることをすでに認識しています。しかし、コンストラクターがグループ化されているコードのビューを見たい場合は、何らかの理由で、コンストラクターを物理的に一緒に配置し、その周りにグループを配置することで、これらがコンストラクターであるという事実を再度表明する必要があります。クラス/構造体/インターフェイスをスライスする他の方法にも同じことが当てはまります。気が変わって、公開/保護/非公開のものを最初にグループに分けて確認し、次にメンバーの種類ごとにグループ化したい場合はどうすればよいでしょうか?
(たとえば) パブリック プロパティをマークアウトするために領域を使用することは、コード自体からすでに認識できる内容に何も追加しない冗長なコメントを入力するのと同じくらい悪いです。
とにかく、その目的でリージョンを使用する必要を避けるために、私は Ora と呼ばれる無料のオープンソース Visual Studio 2008 IDE アドインを作成しました。グループ化されたビューが自動的に提供されるため、物理的なグループ化を維持したり領域を使用したりする必要が大幅に軽減されます。 役に立つかもしれません.
一般的に、C# のイベントのようなコードを扱う場合、実際にはイベント宣言 (EventArgs クラス、デリゲート宣言、イベント宣言) の一部にすぎない約 10 行のコードがあり、それらの周囲に領域を配置してからそれらを折り畳むことがわかります。そうすることで、もう少し読みやすくなります。
うまく使えば便利なツールだと思います。多くの場合、メソッドや列挙、その他頻繁に折り畳まれるものは小さなブラック ボックスであるべきだと感じます。何らかの理由で見なければならない場合を除き、その内容は重要ではないため、できるだけ隠す必要があります。ただし、プライベート メソッド、コメント、内部クラスをフォールドすることはありません。実際に私が折りたたむのはメソッドと列挙型だけです。
私のアプローチは他のいくつかのアプローチと似ており、リージョンを使用してコード ブロックをコンストラクター、プロパティ、イベントなどに編成します。
Roland Weigelt による優れた VS.NET マクロのセットが、彼のブログ エントリから入手できます。 #region のキーボード サポートの改善 ...#エンドリージョン. 。私は何年もこれらを使用して、ctrl+をマッピングしてきました。現在の領域を折りたたむには Ctrl++ を押して展開します。すべてを折りたたんだり展開したりするデフォルトの VS.NET 機能よりもはるかにうまく機能することがわかります。
私は個人的に常に #Regions を使用しています。これは、プロパティや宣言などを互いに分離しておくのに役立つことがわかりました。
これもおそらく良い答えです!
編集:くそ、パットがこれで私を打ち負かした!
私自身は #regions の方が好きですが、昔の同僚は物事が隠されることに耐えられませんでした。7 つの #regions を含むページで作業したときに彼の主張が理解できました。そのうちの少なくとも 3 つは自動生成されており、同じ名前でした。しかし、一般的に、これらは物事を分割し、すべてを少なくするための便利な方法だと思います。雑然とした。
#region を使用してコードを整理することに特に問題はありません。個人的には、通常、プロパティ、イベント ハンドラー、パブリック/プライベート メソッドなどに対して異なるリージョンをセットアップします。
Eclipse は、この一部を Java (またはプラグインを備えた PHP) で独自に実行します。関数などを折りたたむことができます。私はそれを好む傾向があります。関数が何をするのかを知っていて、その関数に取り組んでいない場合は、それを見る必要はありません。
Emacs には折りたたみマイナー モードがありますが、私はそれをたまにしか起動しません。ほとんどの場合、明らかに指導が少なかったか、コーディングの実践にあまり注意を払わなかった他の物理学者から受け継いだ巨大な研究に取り組んでいるときです。
リージョンの使用 (または他の方法でコードを折りたたむ) すべき コードの匂い (または隠蔽) や、人に「簡単に」見られたくないコードを非表示にするその他のアイデアとは何の関係もありません。
リージョンとコードの折りたたみは、実際には、現在作業しているものの周囲に発生する無関係な「ノイズ」の量を最小限に抑えるために、折りたたんだり折りたたんだり非表示にしたりできるコードのセクションを簡単にグループ化する方法を提供することを目的としています。正しく設定した場合 (つまり、実際にリージョンに含まれるメソッドの名前など、役立つ名前を付けます)、現在編集中の関数以外のすべてを折りたたむことができ、他の関数を実際に表示することなく、ある程度のレベルのコンテキストを維持できます。コード行。
おそらく、これらのアイデアに関するベスト プラクティス タイプのガイドラインがいくつかあるはずですが、私はコード ファイルに標準構造を提供するためにリージョンを広範囲に使用しています (イベント、クラス全体のフィールド、プライベート プロパティ/メソッド、パブリック プロパティ/メソッドをグループ化しています)。各メソッドまたはプロパティにはリージョンもあり、リージョン名がメソッド/プロパティ名になります。多数のオーバーロードされたメソッドがある場合、リージョン名が完全なシグネチャとなり、そのグループ全体が関数名だけのリージョンにラップされます。
私は個人的に地域が嫌いです。私の意見では、リージョンに含めるべき唯一のコードは生成されたコードです。ファイルを開くときは、いつも Ctrl+M+O で始めます。これはメソッド レベルに折りたたまれます。リージョンがある場合は、リージョン名だけが表示されます。
チェックインする前に、Ctrl+M+O を押しても問題ないようにメソッド/フィールドを論理的にグループ化します。リージョンが必要な場合、クラス内に多くの行が必要になります。これは非常に一般的なことだとも思います。
地域これはよく整理されたコードのように見えるので、地域を使用します
// 完全にゴミ、ここには構造体がありません
端領域
列挙
プロパティ
.ctors
メソッド
イベントハンドラー
リージョンを使用するのはそれだけです。メソッド内で使用できるとは知りませんでした。
ひどいアイデアのように聞こえます:)
の コーディングホラー 実際の記事を読んで私もこれについて考えさせられました。
一般に、クラスが大きい場合は、スクロールする必要があるテキストの量を減らすために、メンバー変数、定数、およびプロパティの周囲にリージョンを配置し、他のすべてをリージョンの外側に残します。フォームでは、通常、物事を「メンバー変数、定数、プロパティ」、フォーム関数、およびイベント ハンドラーにグループ化します。繰り返しになりますが、これは、いくつかのイベント ハンドラーを確認したいだけの場合に、大量のテキストをスクロールする必要をなくすためです。