通常、クラスのリージョンをどのようにレイアウトしますか?


17

クラスの地域をレイアウトするための標準があるかどうか疑問に思っていました。

私は現在使用しています

Fields
Constructor
Properties
Public Methods
Private Methods

FieldsプライベートプロパティでありProperties、パブリックプロパティであること。通常、必要に応じてその中のサブリージョンを使用します。または、他のリージョン(インターフェースやbaseClassメンバーなど)を時折追加します。


1
レイアウト全般について話しているのですか、それとも「#regions」を使用しているのですか?
snmcdonald

1
@snmcdonald #regionタグを使用してセクションを定義する
レイチェル

これはコミュニティWikiの質問ではありませんか?1つの標準があるとは思わず、言語によって答えが変わる可能性があります。
Raveline

7
すべて#regionのsを削除することから始めます
エドS.

3
@Ed S. +1。地域は悪魔だからです。コードファイルが大きすぎて、リファクタリングする必要があるという事実を不明瞭にするだけです。
MattDavey

回答:


4

クラス関連の列挙、または時折構造体/純粋なデータクラス(実際のクラス定義より上)

---クラス定義---

非公開会員

言語にDTORがある場合はCTOR / DTOR

パブリックプロパティ

ユーティリティメソッド(小さなスコープを持つプライベートメソッドまたは保護されたメソッド)

クラス機能(クラスのスコープに応じて複数の領域に分割できます)。


17

サブリージョン?あなたのクラスには単一の責任がありますか?(その意味で...私の回答は「プロパティ、コンストラクタ、メソッドをグループ化することを除いて、ほとんどすべての地域」です...しかし、それでもあまり使用しません)


2
私は今、WPFでプログラミングしています。使用するサブ領域の例は、パブリックプロパティがUI関連のプロパティ、コマンド、データなどに分割されているViewModelです。すぐに探している
レイチェル

2
地域の代わりに大きなコメントバナーを使用しないのはなぜですか? // ----------ViewModel Properties---------- そうすれば、コードを見ることができます(または、アウトラインで折りたたんでメンバーを見ることができます)。リージョンは物を隠すためのものです。コードは、自動生成されたものなどでなければ非表示にしないでください。
キラレッサ

1
@Rachelは作曲を支持します。
MattDavey

10

クラスレイアウト全般ではなく、「#regions」を意味することを確認したいだけです。

リージョンの使用を避けることについて誰も言及していないことに驚きました。OPが地域のレイアウトについて調査したいのは理解していますが、別の視点を上げたいと思います。

地域を避けます。私が作業しているコードを見るのが好きです。探しているものを見つけることが難しい場合は、コードの折りたたみを使用して、同様のクラス構成をグループ化します。

なぜ地域が嫌いなのですか?CTRL+M,Lそして、CTRL+M,Oコードの折りたたみを切り替えます。ただし、折りたたむと領域全体が非表示になります。メソッド/プロパティ/コメントを折りたたむだけです。

リージョンが多すぎると、コードの匂いがして、クラスの作業が多すぎます。ジェフアトウッドは、読む価値のある地域に関する優れた投稿を提供しています。

#regionsでの私のお気に入りの引用:

いいえ、#regionsは使用しません。いいえ、テロリストと交渉しません。黙れ。

- ジェフ・アトウッド

そうは言っても、多くのプログラマーがそれらの使用を主張していることを知っています。この質問は主観的です。私は別の方法を提供すると思っていた。


1
以下は、領域に夢中になっている人々と作業している場合に備えて、領域を拡大して定義するマクロです: stackoverflow.com/questions/523220/awesome-visual-studio-macros / ... メソッドの中に領域を入れる本当に病気の人々と働いています
キラレッサ

非常に便利なマクロ!なぜ彼らがそれをビジュアルスタジオに組み込まなかったのかはわかりませんが、それでもなお、ありがとうございます。
snmcdonald

私の上司は地域を愛し、地域を失います。彼はプライベートな内部クラスと巨大なメソッドも大好きです。コードには、約12のリージョンを含む1つのクラス、3つの内部クラス、およびその内部にサブリージョンを含むダースの最上位レベルのリージョンを持ついくつかのメソッドがあります。
CodexArcanum

4

言語によって異なります。私はDelphiのコーダーなので、次のようなDelphi標準の規則に従う傾向があります。

type
  TMyClass = class(TBaseClass)
  private
    private fields
    private methods
  protected
    protected fields
    protected methods
    protected properties
  public
    constructor(s)
    destructor
    public methods
    public properties
  end;

読みやすく理解しやすい情報を整理する良い方法だと思います。


3
private、protected、public、publishedの両方がアルファベット順とカプセル化の両方で順序付けられており、すべてがPで始まることは非常に驚くべきことです。
ピーターターナー

面白い、私はしません。publicほとんどのユーザーpublic物だけを気にするので、最初にリストする方が自然であることが常にわかっています。
マチューM.

私はいつもこのコンベンションは本当に馬鹿げたアイデアだと思ってきました。可視性は機能と何の関係がありますか?いずれにせよ、パブリック機能を定義するために常にインターフェイスを使用しましたが、クラスで保護されたインターフェイスを実装しました。一貫してグループ化するアイテムは、コンポーネントの発行済みメソッドとプロパティのみです。それ以外の場合は、必要に応じて複数の可視性キーワードを使用して、常にインターフェイスと継承によってグループ化します。クラス実装に固有の(つまり、オーバーライドではない)アイテムは、実際に最初にリストする必要があります。
-S.ロビンズ

3

私はそれらを次のようにレイアウトする傾向があります:

Public fields (usually static constants)
Constructors
Public methods
Private methods
Private fields

使用している言語を使用しPropertiesていないため、レイアウトされていません。他の誰かが自分のコードでこのファイルを使用している場合、彼らは自分自身がパブリックなものであるAPIにのみ関係する必要があるため、私はプライベートメソッドとフィールドを一番下に置きます。そして、私が知っているすべてのテキストエディター、およびIDEでさえ、ファイルを開くときにカーソルを上部に設定します。


プライベートフィールドを下部に配置するための+1。パブリックメソッドを実装するインターフェイスでグループ化し、インターフェイスを実装しないものを最上部のコンストラクタ/デストラクタの直後に配置します。
シェード

2

それは私にとって判断の呼び出しです。読みやすくするために必要なときにリージョンを使用します。

また、Visual Studioの配色で別の色(現在は濃い赤)を使用して、残りのコードから目立つようにします。


#regionを使用する場合の例:XMLの複数行スニペットを必要とする単体テストのテストメソッドを作成すると、XML文字列は通常のインデントを壊します(左側のマージンに沿って開始するため)コードウィンドウ。hideさを隠すために、#regionでラップして、折りたたむことができます。


2

Bob MartinのClean Codeブックは、第5章全体をフォーマット専用にしています。私はそれをうまく要約していると感じるいくつかの重要なポイントがあります。

  • 可視性とクリーンさによって変数とメソッドをグループ化しようとするほとんどの試みはあまり意味がなく、コードを何度もナビゲートします。
  • 互いに垂直に呼び出すメソッドを保持することで、必要なナビゲーションの量が減り、物事を見つけやすくなります。
  • 停止して「このコードのビットはどの地域に属しているのか」と考えなければならない場合、あなたの思考の流れは壊れません。数分ごと。
  • 通常、インスタンス変数は少数であり、どこでも使用される可能性が高いため、クラスの最上位に属し、最も見つけやすい場所にあります。1つのメソッドでのみ使用される変数と宣言は、そのメソッド内に存在する必要があります。いくつかのメソッドのみで使用される場合、それらは垂直に近いはずですが、それらを使用しているいくつかのメソッドの上にある必要があります。

一般的に相互作用する要素を使用してコードを垂直に近づけて配置すると、特定の領域を作成する必要がなくなります。コードが非常に長く、多くのコードを隠すためにリージョンが必要な場合は、おそらく、クラスがやりすぎていることを示すコードの匂いです。おそらく、機能の一部をユーティリティクラスに移動したり、先祖にプッシュしたりできます。

コードが長すぎるか「ugい」ためにコードを「隠す」必要がある場合は、リージョンを使用するかどうかよりも大きな問題を心配する必要があります。個人的にそれらを使用する必要はありませんし、他の誰かのコードに取り組むとき、私は常にとにかくそれらをすべて開く必要があることがわかります。


1
+1-これがこれほど顕著に言及されていなかったことに驚いています。結束の原則は、コードのレイアウト方法にも適用され、アクセス修飾子によるグループ化は(ほとんどの場合)逆効果です。
ダニエルB

0

私は現在、このようなクラスをレイアウトしています:

class types
constructors
destructor
accessors
methods
properties (where properties are present in the language)
member variables

そして、各宣言にアクセスレベルのプレフィックスを付けます(並べ替え、場合によってはアクセスごとにグループ化)。以前はアクセスごとにトップレベルのグループ化を行っていましたが、いつかは、上記とまったく同じように機能しなかった時期がわかりません。たとえば、C ++ / CLI(現時点では使用を余儀なくされています:-()では、これを行うことができますが、アクセスによるグループ化が台無しになります。

public: property int SomeProperty
{
private: void set (int value) { ... }
public: int get () { ... }
}

一番下の「メンバー」とは何ですか?私にとって、それはクラスのすべての部分の包括的な用語です。
メイソンウィーラー

@Mason:混乱を避けるために「メンバー変数」にする必要があります。
スキズ

私はそのようなタイプで物事をグループ化することは本当にありません。メソッドとプロパティの実際の違いは何ですか?クラスのプロパティを探したことは一度もありませんが、プロパティ、メソッドなど、論理的に関連するコードを探します。
エドS.

0

ルナティックフリンジの答え:私は、少なくともC#に関してはそうではありません。Visual StudioとR#の間で、私は魔法のように任意のメンバーまたは実装に移動できるため、このことを気にする必要はありません。カーソルがある場所で入力を開始するだけです。


0

ワイアットや他のいくつかの回答と同様に、私も一般的に地域の使用を避けています。リージョンには1つの目的があります。あなたが見たくないコードを隠すために。あなたが見たくないクラスに多くのコードがあり、したがって、あなたが言ったコードを折りたたむことができるように多くの領域が必要な場合、おそらくあなたはクラスにあまりにも多くのコードがあります。ReSharperは、新しいコードを配置する場所を決定するときに領域を尊重しません(領域を作成する場合を除きます)。

私が受け入れられると思う領域の使用法の1つは、「やむを得ないい」コードを隠すことです。内部的に現在の標準にうまく設計できない特定の実装の詳細を扱うコード。これは通常、高度な難解なコードであり、一般に、一度書いた平均的なジュニアプログラマーが混乱することはありません。これらは次のようなものです:

  • 特定の組み込みインターフェイスの実装(IDisposable、IConvertible、時にはIEnumerableまたはIComparableは、ジェネリックおよび非ジェネリック実装を必要とするため)
  • 埋め込みP / Invoke外部および関連する構造。
  • ファイナライザ/デストラクタ(通常はIDisposableに付属)
  • アンマネージメモリ/ポインター/「安全でない」コードへのフック。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.