GWの読書感想文。身も蓋もない感想を言ってしまうと、「レガシーコード改善」「リーダブルコード」のほうがサンプルコードもあって頭にすっと入ってきて好み。印象に残った箇所をメモ。
高品質な設計に望ましい特性
最小限の複雑さ
「凝った」設計はだいたい理解するのが難しいので避ける。代わりに「単純」で「理解しやすい」設計にする。ある1つの部分に集中して取り組む際に、プログラムを簡単に無視できないような設計は、その目的を果たしていない。
保守性
保守の容易さとは、保守プログラマのために設計することである。保守プラグラマを顧客と見なし、見ればすぐわかるようなシステムを設計しよう。
疎結合
疎結合とは、プログラムのさまざまな部品間の結び付きを最小限に抑えるような設計である。クラスインターフェイスの抽象化、カプセル化、情報の隠蔽の原則を基に、相互結合のできるだけ少ないクラスを設計する。結びつきが少なければ、その分、統合とテストの保守の作業が少なくなる。
拡張性
拡張性とは、基本的な構造に影響を与えずに、システムの機能を拡張できることである。つまり、他の部分にまったく影響を及ぼさずに、システムの一部を変更できる。
再利用性
再利用性とは、システムの一部を他のシステムで再利用できるようにシステムを設計することである。
高いファンイン
高いファンインとは、そのクラスを使用するクラスがたくさんあることである。また、システムが下位レベルのユーティリティクラスを活用するような設計になっていることも意味する。
低いファンアウト
低いファンアウトとは、1つのクラスが使用する他のクラスの数を少なくすることを意味する。高いファウンアウト(約7個以上)は、クラスが使用する他のクラスの数が多く、そのため複雑になりすぎる可能性があることを示している。
移植性
移植性は、システムを他の環境へ簡単に移行できるように設計することである。
無駄のなさ
無駄がないとは、システムに余分な部分がないように設計することである。コードを変更する際には、余分なコードを開発して、レビューし、テストし、検討しなければならないからだ。ソフトウェアの将来のバージョンは、余分なコードとの下位互換性まで維持しなければならない。
階層化
階層化とは、分解のレベルを階層化して、システムをどのレベルでも参照できるようにし、一貫した視点が得られるようにすることである。他のレベルを見なくても、1つのレベルを見ればわかるように設計する。
標準化手法
システムが一般的でない要素に依存すればするほど、そのシステムを最初に理解することが躊躇されるようになる。標準化された一般的な手法を使用すれば、システム全体に親しみやすい印象を持たれる。