この記事は「プリンシプルオブプログラミング」という書籍の、特に重要だと感じた部分を紹介します。この書籍は全部で7章あります。1記事につき1章(項目が多い章は分割)を取り上げていき、今回は第3章(アーキテクチャ根底技法)の部分です。
第3章 「思想」 〜プログラミングのイデオロギー〜
3.11 アーキテクチャ根底技法
よいコードの基礎原理
- 抽象(3.12)
- カプセル化(3.13)
- 情報隠蔽(3.14)
- パッケージ化(3.15)
- 関心の分離(3.16)
- 充足性、完全性、プリミティブ性(3.17)
- ポリシーと実装の分離(3.18)
- インターフェースと実装の分離(3.19)
- 参照の一点性(3.20)
- 分割統治(3.21)
3.12 抽象
- 抽象は「捨象」と「一般化」の2つの観点からまとめられる
- 捨象:対象物の本質をむき出しにすることで、複雑度を下げ、真なる問題に集中できるようにする
- 一般化:複数のものを、共通の特徴によってグルーピングし、「同じ」と見なすこと
- 複雑な対象に取り組むときは「捨象」する -> 余計なものを捨て、本質を捉える
- 異なる複数の対象に取り組むときは「一般化」する -> 共通点を組み合わせ、汎用的な概念を構成する
3.13 カプセル化
- 関連性の強いデータ群とロジック群を、モジュールという膜で包み込むこと
カプセル化のメリット
- 関連のない要素が混じらず、コードが見やすい
- 変更時の影響がモジュール内に閉じる
- 影響度が明確になり、コード変更が容易
- それぞれが独立した部品となり、再利用性が高まる
- 小さい単位に分割されるので、複雑な問題に対処できる
3.14 情報隠蔽
- クライアントが知る必要ない内部の詳細部分は見せない
- インターフェースが小さくなり、やりとりがシンプルになる
- コード全体の複雑性を下げる
カプセル化と情報隠蔽の違い
- カプセル化:関係ある要素を集めてモジュール化、関連の深いデータと関数を1箇所にまとめること
- 情報隠蔽:モジュールの内部状態や内部関数を隠蔽すること
関連
- 「パルナスの規則」
3.15 パッケージ化
- モジュール:コードの関連要素をカプセル化したもの
- パッケージ:モジュール群をグルーピングしたもの
パッケージ化のメリット
- ソフトウェア全体が、パッケージという小さい単位に分割され、複雑性が下がる
- パッケージ内は、関連のないモジュールが混じらず、管理しやすい
- 修正に対して、影響度がパッケージ内に留まる可能性が高く、コード変更がしやすい
- 依存関係が整理され、パッケージを単位とした再利用がしやすい
3.16 関心の分離
- 「関心」=ソフトウェアの機能や目的のこと
- 代表的なパターン:「MVC(Model-View-Controller)」
- 代表的な技術:「アスペクト指向プログラミング(AOP)」
3.17 充足性、完全性、プリミティブ性
- 充足性:モジュールが表現しようとしている抽象が、それを伝えるために十分であるか
- 完全性:モジュールが表現しようとしている抽象が、すべての特徴を備えているか
- プリミティブ性:モジュールが表現しようとしている抽象が、すべて純粋であるか
3.18 ポリシーと実装の分離
- 1つのモジュールで「ポリシー」と「実装」の両方を扱ってはいけない
- ポリシーモジュールはそれぞれのソフトウェアに特化しているため再利用できない
- 実装モジュールは「純粋」なモジュールである、再利用できる
3.19 インターフェースと実装の分離
- インターフェース:クライアントからの使われ方
- 実装:機能の実現方法
- インターフェースに対してプログラミングするのであって、実装に対してプログラミングするのではない
3.20 参照の一点性
- 変数の値を初期化したら、以後、値を変更しない(単一代入) -> 見通しのよいコードになる
3.21 分割統治
- 大きな問題は小さな問題に分け、個別に解決する