Open/Closedの原則
from Clean Architecture 達人に学ぶソフトウェアの構造と設計
ソフトウェアの構成要素は拡張に対しては開いていて、修正に対して閉じていなければならない。
『アジャイルソフトウェア開発の奥義 第 2 版』(SB クリエイティブ)より引用
ソフトウェアの振る舞いを、既存の成果物を変更せず拡張できるようにするのが目的
これを達成するためには
まずシステムを単一責任の原則(SRP)で適切に複数のコンポーネントへ分割する
コンポーネントの利用者が1種類になるようにする
そして、それらの依存関係をインターフェースを用いて整理し、単方向の階層構造にする
オブジェクト指向プログラミングの話だと仮定しています
例えば、プリンターを操作するプログラムについて考える
素朴に考えるとコントローラクラス → プリンタクラスという依存関係になる
プリンタクラスのインターフェースを作ってコントローラクラスと同じモジュールに含め、コントローラクラスはそのインターフェースを介して操作するようにし、プリンタクラスはそのインターフェースを実装するようにする
するとコントローラクラス (with プリンタクラスインターフェース) ← プリンタクラスとなる
階層構造に整理したとき、最上位のクラスはビジネスロジックを持ったクラスになるべき
このように整理することで、階層上位のクラスは下位のクラスに変更があっても影響を受けなくなる