オブジェクト指向設計の原則 - パッケージ設計の原則

少し勉強したんで、メモ。

たぶん、今後更新していきます。


まず、パッケージとは、機能のグループ単位、サブシステムのこと。
Javaだと、パッケージの概念はあるけど、もっと広い意味でJarもパッケージに含まれる。

パッケージ内部の凝集度に関する原則

再利用・リリース等価の原則(REP:Reuse-Release Equivalency Principle)


再利用の単位とリリースの単位は等価になる。
パッケージに含まれるクラスは、すべてが再利用されるか、すべてが再利用できないかのどちらかにすべきだ。


リリースの単位はパッケージ毎に行う。
再利用できるパッケージは別に切り出しといて、再利用できないパッケージでそれを使うイメージ。

全再利用の原則(CRP:Common Reuse Principle)


パッケージに含まれるクラスは、すべて一緒に再利用される。
つまり、パッケージに含まれるいずれかのクラスを再利用するということは、その他のクラスのすべてを再利用するすることを意味する。


同じパッケージに含めるクラスは、一緒に使われる傾向にある。
逆に言えば、互いに強い関連性を持たないクラスを同じパッケージにまとめるべきではない。

閉鎖性共通の原則(CCP:Common Closure Principle)


パッケージに含まれるクラスは、みな同じ種類の変更に対して閉じているべきである。
パッケージに影響する変更はパッケージ内のすべてのクラスに影響を及ぼすが、他のパッケージには影響しない。


単一責任の原則のパッケージ版。パッケージの変更理由は一つであるべきだ。

パッケージ同士の結合度に関する原則

非循環依存関係の原則(ADP:Acyclic Dependencies Principle)


パッケージ依存グラフに循環を持ち込んではならない。


パッケージ間はインターフェースのみに依存すべきである。

安定依存の原則(SDP:Stable Dependencies Principle)


安定する方向に依存せよ。


安定度の高い(変更しにくい)パッケージに依存するべき。
当然、不安定なパッケージに依存するとそのパッケージに変更があったときに
影響を受けてしまう。

安定度・抽象度等価の原則(SAP:Stable Absstractions Principle)


パッケージの抽象度と安定度は同程度でなければならない。


安定度の高い(変更しにくい、依存されている)パッケージは抽象度が高くなければならない。
不安定な(変更することを意識して作られた、依存ばかりしている)パッケージは具体的でなければならない。

まとめ

あまり、クラス設計の原則と変わらない印象。
クラスは全く他のクラスに依存しないのは不可能なので、
パッケージ単位で扱う(リリース、再利用)必要がある。
その中で、いかに、オープン・クローズド(拡張に対して開いていて、
修正に対して閉じている)にするかが大切ということだろう。



アジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技

アジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技