概要
- 本で読んだ中で、今からでも実践可能な過激な実装方法があったため振り返り用にまとめる
参考図書
↓悪いパターンと良いパターンがあるため、実装のイメージが湧きやすい
↓より網羅的にDDDについての記載がある(DB, API, 画面等)。しかし、具体的な実装については想像で補う必要大
過激なコード規約
- 今回は現場で役立つシステム設計の原則-変更を楽で安全にするオブジェクト指向の実践技法-増田-亨を参考に記述する
- 1つのメソッドにつき、インデントは1段落までにする
- else句を使用しない
- すべてのプリミティブ型と文字列型をラップする
- 1行につき、ドットは1つまでにする
- 名前を省略しない
- すべてのエンティティを小さくする
- 1つのクラスにつきインスタンス変数は2つとする
- ファーストクラスコレクションを利用する
- getter, setterを利用しない
getter, setterを利用しない など、オブジェクト指向らしきものを触ってきたものからすると強い違和感と実装方法への不安が湧くが、これはオブジェクト指向の基本であるとのこと。
この規約に違和感を感じる時点で、これまでのオブジェクト指向はオブジェクト指向のふりをした手続き型の書き方であったといえる。
1. 1つのメソッドにつき、インデントは1段落までにする
- インデントは一つの
処理単位
である - オブジェクト指向の基本は、
処理単位
を抽出し、メソッドやクラスにして部品化することである
2. else句を使用しない
- 早期リターン・ガード節(早期リターンを行う書き方)を行う ことで、複文の処理を単文化する
- ロジック毎にメソッドに抜き出すことで、メソッドの独立性を高める働きがある
良いコード-悪いコードで学ぶ設計入門-―保守しやすい-成長し続けるコードの書き方-仙塲こちらでは、分岐処理が必要なタイミングでInterfaceを使うことが中級者であると定義している
3. すべてのプリミティブ型と文字列型をラップする
- 値オブジェクトを作ることで、数値や文字列に対する
判断/加工/計算をすべて一つのクラス内で完結させる
- これを徹底することは、
求めるな、命じよ
に通じ、呼び出す側のクラスの重複、複雑化をなくすことに通じる
Dataクラスを作成して、getter, setterを作成することは呼び出し側のクラスに処理をさせるため好ましくない。
4. 1行につき、ドットは1つまでにする
- 意図がわかりにくくなる、再利用が難しいため、ドットの数(メソッドチェイン)は1つまでとする
実践方法
// よくない実装
function hogeFuga (hoge){
return hoge.fuga.value.delete;
}
// 推奨される実装
function hoge(hoge){
const hogeFuga = hoge.fuga;
const fugaValue = hogeFuga.value;
return fugaValue.delete;
}
// より推奨される実装は、値オブジェクトを作成してそれぞれの変数をメソッドとして独立させ、HogeServiceクラスなどから呼び出して制御することである
// このようにすることで、再利用性と明示的に何をしているかがわかりやすくなる
5. 名前を省略しない
名前を省略すると、コードが読みづらくなる
特別にリソースが不足している等の理由がない限りは、普通の名前を利用する
6. すべてのエンティティを小さくする
大きなメソッドやクラス、パッケージになっている場合は、オブジェクト指向でプログラミングができていない証拠である
対象 | ガイドライン |
---|---|
メソッドの行数 | 3行を目標とする。1行でもよい。 |
クラスの行数 | 50行を目安とする。100行以上は不可。 |
パッケージのファイル数 | 10ファイル以内。 |
このガイドラインに従うとかなりの数のファイルができるが、適切な名前をつけ、適切にパッケージングすることで容易にコードを把握することが可能である。
7. 1つのクラスにつきインスタンス変数は2つとする
インスタンス変数が増えると、クラスの意図がぼやけてしまう
クラスの意図がぼやけると、クラスの巨大化が始まってしまう
インスタンス変数を2つ以内にすることで、クラスの意図を明確化していく
8. ファーストクラスコレクションを利用する
配列やコレクションの操作は複雑になるため、バグが混入しやすい危険なコードである
- この影響を最小限にするために対象の配列/コレクションを1つだけ持つ独立したクラスを作成する
- 配列/コレクションの処理は複雑になりがちであるため、1つの配列/コレクションに対する操作に限定する
9. getter, setterを利用しない
getter
Dataクラスは諸悪の根源である
値を返すだけのgetterは判断/加工/計算を行っていない
メソッドは必ず判断/加工/計算をする必要がある
setter
インスタンス変数を書き換える処理は行ってはいけない
まとめ
- 未だ、増えすぎるファイルをどのように配置するか(パッケージングするか)が理解できていない
- まずは分割が基礎として、分割を行っていった結果としてパッケージングが必須になったタイミングでもう一度パッケージング方法について学ぶとりかいがもう1段深まりそうである