web-dev-qa-db-ja.com

C#クラスをレイアウトする最良の方法は何ですか?

C#ファイルをレイアウトする標準的な方法はありますか?フィールド、プロパティ、コンストラクタなどのように?

これが私が通常行うことですが、標準的な方法があるかどうか疑問に思っていますか?

  1. ネストされたクラスまたは列挙型
  2. 田畑
  3. プロパティ
  4. イベント
  5. コンストラクタ
  6. パブリックメソッド
  7. プライベートメソッド

人々はフィールドを一緒にグループ化しますか、それともプロパティと一緒に配置しますか?または、人々は注文を心配しませんか? Visual Studioを使用すると、実行が非常に難しくなります。

編集:ReSharperに関する他の部分をここに移動しました: Resharperにコード順序の設定を尊重させます

40
Ray

私は Microsoft StyleCop を使用する傾向があります。これは、規則に従って順序が設定されています SA1201

原因C#コードファイル内の要素が、コード内の他の要素との関係で順不同です。

ルールの説明このルールの違反は、ファイル内のコード要素が標準の順序付けスキームに従っていない場合に発生します。

このルールに準拠するには、ファイルのルートレベルまたは名前空間内の要素を次の順序で配置する必要があります。

  • 外部エイリアスディレクティブ
  • ディレクティブの使用
  • 名前空間
  • 代議員
  • 列挙型
  • インターフェース
  • 構造
  • クラス

クラス、構造体、またはインターフェース内では、要素は次の順序で配置する必要があります。

  • 田畑
  • コンストラクタ
  • ファイナライザ(デストラクタ)
  • 代議員
  • イベント
  • 列挙型
  • インターフェース
  • プロパティ
  • インデクサー
  • 方法
  • 構造
  • クラス

要素タイプに基づく標準の順序付けスキームに準拠すると、ファイルの可読性と保守性が向上し、コードの再利用が促進されます。

インターフェースを実装するとき、インターフェースのすべてのメンバーを隣同士にグループ化することが望ましい場合があります。インターフェースに異なるタイプの要素が含まれている場合、このルールに違反する必要がある場合があります。この問題は、部分クラスを使用することで解決できます。

  1. クラスがまだパーシャルでない場合は、パーシャル属性をクラスに追加します。

  2. 同じ名前の2番目の部分クラスを追加します。これを同じファイルの元のクラスのすぐ下、または2番目のファイル内に配置することができます。

  3. インターフェイスの継承とインターフェイス実装のすべてのメンバーをクラスの2番目の部分に移動します。

58
chills42

最善の方法はないと思います。レイアウトに関しては、2つの重要な考慮事項があります。最初に最も重要なことは一貫性です。アプローチを選択し、チーム全体がレイアウトに同意して適用することを確認します。次に、クラスが大きくなり、厄介なプロパティが存在する場所を検索する場合(または領域を実装して見つけやすくする必要がある場合)、クラスが大きすぎる可能性があります。匂いを嗅ぎ、匂いに基づいてリファクタリングすることを検討してください。

リシェイパーの質問に答えるには、オプションタイプメンバーレイアウトの下(C#ノードの下)を確認します。簡単ではありませんが、レイアウトの順序を変更することは可能です。

9
Michael Meadows

リージョンが必ずしも悪いコードの兆候であるとは思いません。しかし、あなたが持っているものを見直す必要があることを決定するために。私が述べたように here これは私のコードを地域化する方法です。


列挙
宣言
建設業者
方法
イベントハンドラ
プロパティ

しかし、重要なのは、一貫性と目的を保つことです。

2
Pat

これを支援するためにRegionerateを試すことができます。私は本当にそれが好きで、スコット・ハンセルマンのピックです。

1
Daver

私は個人データをまとめたり、関連するメソッドやプロパティを機能グループにまとめたりする傾向があります。

public class Whatever {
   // private data here
   int _someVal = kSomeConstant;

   // constructor(s)
   public Whatever() { }

#region FabulousTrick  // sometimes regionize it
   // fabulous trick code
   private int SupportMethodOne() { }
   private double SupportMethodTwo() { }
   public void PerformFabulousTrick(Dog spot) {
       int herrings = SupportMethodOne();
       double pieces = SupportMethodTwo();
       // etc
   }
#endregion FabulousTrick
   // etc
}
1
plinth

言われたように、私はそのような最善の方法があるとは思いません。しかし、一部の組織はプログラマを支援します。

長いプロジェクトで、関数の1つを見つけるために1つ以上のソースファイルを上下に移動する時間をどれくらいの頻度で費やしましたか。

だから私は#regionこのような方法で多くのことを行います-

  1. region Events:このクラスが使用するすべてのイベント参照(少なくともこの特定の部分クラス)。

  2. region Controls:フォーム上のコントロールと直接対話するすべての関数。

  3. region MDI:MDIを設定します

    次に、インターフェイスではなく機能に関係するものがあります。

  4. 地域の正規表現検索

少しずつ作り直していきますが、いつも使っているのと同じパターンを使っています。私の仕事を取り上げている一部のプログラマーから、フォローが簡単だと言われたり、厄介だと言われたりしました。

半分の時間を半分の時間、残りの4分の1の時間、残りの4分の1の時間を自分を含めてみんなを混乱させることができます。 Winston Chrchilはそう言ったと思います。

1
Rob Rassler

あなたの生産性を高めるものは何でも。プロパティアクセサーの横のプライベートフィールドのようなものもあれば、コンストラクターの上にあるフィールドのようなものもあります。助けることができる最大のことは、「好きな」要素をグループ化することです。私は個人的に私的な方法や私有財産などをまとめることが好きです。

何度か試してみてください。何を感じても生産性が向上し、コードを維持するのに役立ちます。

0
Chad Moran

それぞれ独自のものですが、MSDNヘルプと同じ順序に従う傾向があります。

また、クラスまたは列挙型をネストするのは好きではありません。代わりにそれらのために個別のファイルを作成します。これにより、単体テストの記述も簡単になります(テストを追加/修正/リファクタリングする必要があるときに、関連するテストファイルを簡単に見つけることができるため)。

私見順序はそれほど重要ではありません。VSではすべてのメンバーを非常に簡単に見つけることができるため(特に、ファイルごとに1つのクラス/インターフェイス/列挙型のアプローチに従う場合)、ドキュメントを構築する場合はサンドキャッスルがそれらをグループ化するので、私はd意味のある名前を付けることについて、より心配します。

0
si618

クラスファイルでリージョンの一貫したセットを維持することに加えて、リージョンのすべてのコンポーネントをアルファベット順に維持します。コードの読み取りに関しては、少し "視覚的記憶"を持っている傾向があり、ナビゲーションドロップダウンを使用してファイル内のコードを見つける必要があることに夢中になっています。

0
womp

次のレイアウトを使用します。

イベントグローバル/クラス全体のフィールドプライベート/内部プロパティメソッドパブリック/保護されたプロパティメソッドネストされたクラス(可能な限りこれらを回避しようとしますが)

また、ファイルごとに1つのコード「もの」(クラス、インターフェース、または列挙型)があり、ファイル名は「もの」名と同じであると確信しています。はい、それはより大きなプロジェクトになりますが、それはものを見つけることを無限に簡単にします。

0
Scott Dorman