ソースコードでのクラスの記述順序

ひとつのクラスのコードを記述するときに、プロパティやメソッドなどの順序をどう決めているだろうか。

昔、C/C++を使っていた頃は、コンパイラが「ソースコードのそれまでに出現した行から定義を探す」のでその制約から順序を決めていた。このときは

  1. #include
  2. #define
  3. using namespace
  4. static inline functions
  5. static functions
  6. class definitions
    1. fields
      1. private fields
      2. protected fields
      3. public fields
    2. operators
      1. cast operators
      2. binary operators
    3. methods
      1. private methods
      2. protected methods
      3. public methods
  7. global functions

としていた。public 要素は private 要素の組み合わせから成り立つことが多いので、private な要素から書いていくと宣言文を書かなくていいから、この順が楽なのである。(楽というのは、ミスが減ると言うことに直結するので重要。)

でも、最近のコンパイラは定義を自動的に探してくれるので、コンパイラの都合に合わせなくてもいい。そんなわけで、最近はこんな風にしている。

  1. using
  2. main class
    1. constant values
    2. fields
      1. static fields
      2. instance fields
        1. readonly fields
        2. private fields
        3. protected fields
        4. public fields
        5. (temporary fields)
    3. events
    4. constructors
    5. disposers/finalizers
    6. properties
    7. operators
    8. methods
      1. public methods
      2. protected methods
      3. private methods
  3. supplimentary class

フィールド、コンストラクタ、ファイナライザ、プロパティ、イベント、メソッドの順序は重要。データはカプセル化の本質なので最初に来る。コンストラクタとデストラクタはオブジェクトのライフサイクルと安定性を決めるので前のほうかつペアに書く。プロパティは副作用がなく、対外的な性質の公開になるので、短くなることからもここら辺でまとめておく。メソッドは、ユースケース/テスト/APIである public なものから書く。

こうすると、変更されやすい箇所はソースコードの後ろの方にまとまります。