SOLIDは良いオブジェクト指向設計の5つの原則です
1. SRP : 単一責任原則
- single responsibility principle
- 一つのクラスは一つの責任のみを持たなければならない。
- 変更があるときに影響が少なければ単一責任原則によく従ったもの
2. OCP:開放-閉鎖原則
- Open/closed principle
- 拡張には開いているが、変更には閉じていなければならない。
- Srpingの場合、使用領域と構成領域(AppConfig)に分けることで、
ソフトウェア要素を新たに拡張しても使用領域の変更は閉じているようになった。
3. LSP:リスコフ置換原則
- Liskov substitution principle
-
多型性で下位クラスはインターフェース規約をすべて守らなければならない。
例えば、車のエクセルを押せば、無条件に前に行くように保障しなければならない。
4.ISP:インターフェース分離原則
- Interface segregation principle
- 特定のクライアントのための複数のインターフェイスは、1 つの汎用インターフェイスよりも優れています。
- ex. 自動車インターフェース → 運転インターフェース、整備インターフェースに分離
ユーザークライアント→ドライバークライアント、整備士クライアントに分離 - 分離すれば整備インターフェース自体が変わってもドライバークライアントに影響を与えない。
5. DIP:依存関係逆転原則
- Dependency inversion principle
- インターフェース(抽象化)に依存すべきであり、実装クラス(具体化)に依存してはならない。
- クライアントは役割についてよく知っておくべきであり、特定の実装クラスについてよく知っておくべきコードを組んではならない。
例えば
例えば、DiscountPolicyをFixDiscountからRateDiscountに変更すると、
以下のようにコードを修正すると思います。
// 既存コード
DiscountPolicy discountPolicy = new FixDiscountPolicy();
// 修正コード
DiscountPolicy discountPolicy = new RateDiscountPolicy();
discountPolicy.count();
この場合、
-
SRP、1クラスは1つの責任しか持たないといけないのに,
具現オブジェクトの生成、連結、実行まで様々な責任を持っており、SRPに違反している。 -
OCP、拡張には開いているが、変更には閉じている必要があるが、
クライアントコードを変更する必要があり、OCPに違反している。 -
DIP、実装クラスに依存せず、インターフェース(役割)に依存しなければならないが、
インターフェースだけでなく実装クラスにも依存しており、DIPに違反している。
しかし、上記の原則を守りながら開発をしようとすると、やることが多すぎてスプリングを作ることになった。