オブジェクト指向9つのルール

  1. 1つのメソッドにつき、インデントは1段階までにすること
  2. else句を使用しないこと
  3. すべてのプリミティブ型と文字列型をラップすること
  4. 1行につき、ドットは1つだけにすること
  5. 名前を省略しないこと
  6. すべてのエンティティを小さくすること
  7. 1つのクラスにつきインスタンス変数は2つまでにすること
  8. ファーストクラスコレクションを使用すること
  9. getter、setter、プロパティを使用しないこと

1つのメソッドにつき、インデントは1段階までにすること

メソッド内でインデントがあれば抽出できる可能性が高い。メソッドとして抽出して部品化を検討する。

else句を使用しないこと

if文を使って場合分けする場合は、elseを使わずに条件に合致した時点でreturnするガード節で記述する。

すべてのプリミティブ型と文字列型をラップすること

業務で扱うデータはintやStringで定義せずに、専用の型を用意して定義する。例えば電話番号ならTelephoneクラスを作成して変数と業務ロジックを中に作成する。 このような値を扱うために専用クラスを作るやり方を値オブジェクトと呼ぶ。

1行につき、ドットは1つだけにすること

ドットを使って複数のメソッドを連ねた文は意図がわかりにくくなる。
ドットを使いたい場合、ドットの1つごとに説明用の変数に代入して別の文に分ける。

名前を省略しないこと

クラス名、メソッド名、変数名は省略して名前をつけない。例えばQuantity(数量)はqやqtyとつけずにそのままQuantityとつける。

すべてのエンティティを小さくすること

長いメソッド、巨大なクラス、クラス数の多いパッケージは小さく分解する。

  • メソッドの行数:3行を目標にする
  • クラスの行数:50行を目標にする
  • パッケージのファイル数:10ファイル以内

1つのクラスにつきインスタンス変数は2つまでにすること

インスタンス変数とメソッドが密接に結びついたクラスは目的が単純で意図が明確になる。
インスタンス変数が増えるとクラスが複数の目的に使われ始め、コードが色々な理由で追加され巨大なクラスとなってしまう。

ファーストクラスコレクションを使用すること

配列やコレクションを扱うコードは複雑になりやすい。配列やコレクションを操作するロジックを値オブジェクトと同じように専用の小さなクラスにまとめて整理することで、プログラムがわかりやすくなり変更が容易となる。
例えば顧客情報を複数持つ顧客一覧クラスCustomersの場合、インスタンス変数にList型の変数を1つだけ作成し、Listを操作するロジックは全てCustomersに集める。Customersクラスでは、Customersクラスの意図を明確にしコードを簡潔に保つために、List<Customer>以外のインスタンス変数を持たないようにする。
このようにコレクション型のデータとロジックを特別扱いして、コレクションを1つだけ持つ専用クラスを作るやり方をコレクションオブジェクト、またはファーストクラスコレクションと呼ぶ。

getter、setter、プロパティを使用しないこと

手続き型の言語ではロジックは機能クラスに書き、データはデータクラスに書くというロジックとデータをクラスで分ける設計が普通だった。しかしgetterとsetterを持つデータクラスを利用することは様々な問題が発生する。
例えばgetterはそのまま値を返すだけなので、ロジックをデータクラスを利用する側に記述することになる。そしてデータクラスにアクセスできるクラスが複数あると、様々なクラスにロジックを書けてしまうので同じロジックが重複しやすい。そのため、データクラスは使わずにデータとロジックを1つのクラスにまとめた値オブジェクトを利用する。