ThoughtWorks アンソロジーの5章オブジェクト指向エクササイズから
9つのルールを学んだのでメモします
#1. 1つのメソッドにつきインデントは1段階まで
巨大なメソッドになればなるほど凝集度が低くなる。
メソッドが1つの仕事を行う場合、制御構造はあって1つ。
制御構造が複数ある時点でメソッドに対して仕事が複数ある。
だから、制御構造を1つに抑える
下記は書籍から引用
リファクタリング前
class Board {
String board() {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
buf.append(data[i][j]);
}
buf.append("\n");
}
return buf.toString();
}
}
リファクタリング後
class Board {
//1つのメソッドにつきインデントは1段階までにする
String board() {
StringBuffer buf = new StringBuffer();
collectRows(buf);
return buf.toString();
}
void collectRows(StringBuffer buf) {
for (int i = 0; i < 10; i++) {
collectRow(buf, i)
}
}
void collectRow(StringBuffer buf, int row) {
for (int i = 0; i < 10; i++) {
buf.append(data[row][i]);
}
buf.append("\n");
}
}
#2. else句を使用しないこと
ガード節(ある条件を満たしていない時にreturnする or 例外を投げる)、早期returnを使う。もしくはポリモフィズムを使用する
#3. 全てのプリミティブ型と文字列型をラップする
プリミティブ型をオブジェクトでラップする
オブジェクトにする事で変数の意味を明確に出来、かつコンパイラにも情報を伝える事ができる
#4. 1行につきドットは1つまでにする
クラスを作成する時は1つのクラスは1つの責務を持つようにして作る
クラスに責務が複数あると凝集度が低くなり、修正が広範囲に広がり、保守性が悪くなるため。
また、ドットが多数繋がっている時点で他のオブジェクトの中を深く掘り進んでいる。つまり、カプセル化に反する
#5. 名前を省略しない
#6. 全てのエンティティを小さくする
50行を超えるクラス、10ファイルを超えるパケッージを作らない
#7. 1つのクラスに付きインスタンス変数は2つまでにする
インスタンス変数を追加すればするほど、凝集度が低くなる
クラスは1つの状態変数は通常持つ。
多くて2つ。
2つに抑えるようにする
#8. ファーストクラスコレクションを使用する
コレクションを持つクラスには他のメンバ変数を持たせないようにする
リストやマップなどのコレクションをラップしたクラスをファーストクラスコレクションと言う
#9. Getter, Setter, プロパティを使用しない
Getter, Setterメソッドを使用しない。
他のクラスでこれらを簡単に使い出すと、振る舞いが他のクラスに記述され、
使われているインスタンス変数の振る舞いが他のクラスにも生じてしまうため使わない。
この9つのルールは厳しいが、意識して行きたい。