Getting Clean via Emergent Design
-
Kent Beckによる4つのルール
- Runs all the tests
- Contains no duplication
- Expresses the intent of the programmer
- Minimizes the number of classes and methods
- これに従えば、そのシステムは「シンプル」
- 重要度順
Simple Design Rule 1: Runs All the Tests
-
システムが理屈上完璧な設計でも、実際に意図通りに動作することを簡単に検証できないならば、疑わしい
- テストできないシステムは動作を検証できない
- 動作を検証できないシステムはデプロイされるべきではない
-
幸い、テスト可能にすると良い設計へ向かう
- まずい設計だとテストを書くのが困難
-
逆に、テストを書けば書くほど、テストを書きやすい良い設計になる
- Single Responsibility
- 疎結合・高凝集
Simple Design Rules 2-4: Refactoring
- テストがあれば変更が怖くない
- 変更が怖くないので種々のリファクタリングを行える
- 先述のルールのうち3つはこれで適用できる
No Duplication
-
低水準の小さな部分の重複: private関数を抽出する
-
SRP違反も疑い、別クラスに切り出してpublicにすることも検討する
- 【補】単体テスト可能になる
-
- 高水準のアルゴリズムの重複: Template Method Patternを適用する
Expressive
- 長い長い運用のコストを下げるために
- 良い命名
-
関数やクラスを小さくする
- 命名しやすい
- 書きやすい
- 理解しやすい
-
標準の命名法を使用する
- よく知られたデザインパターンから名前をとるなど
-
よくできた単体テスト
- 単体テストの主目的は例示によるドキュメンテーション
-
一番重要なのは、気遣い
- 【補】try の意訳
-
次にそのコードを読む人が読みやすくなるように
- たいてい自分自身ですよ
Minimal Classes and Methods
- クラスやメソッドを小さくしようとしすぎると、数が増えすぎる問題
-
システムのサイズも小さくするために、クラスや関数の数は最小限に
- ただし先述の3ルールよりは優先度低い
-
【補】A Philosophy of Software Design でもこのことには触れられている
- モジュールのインタフェースの数が増えるということは、学習コスト = 認知の負荷が増え、複雑性が増すということ
英語
-
nomenclature
- 命名法