この記事は私が「Clean Architecture 達人に学ぶソフトウェアの構造と設計」を読んだ際の備忘録です。
本記事を読んで興味を持たれたら是非読んでみてください。
本記事では、参考書籍にて語られている「インターフェース分離の原則」に関わる部分についてまとめています。
「インターフェース分離の原則」は、「クライアントに対し、利用しないインターフェースへの依存を強制しないべき」という原則です。
例として自動ドアのインターフェースを考えてみます。
ドアを開閉する機能とセンサーのイベントを想定すると以下のようになります。
interface AutomaticDoor {
void openDoor();
void closeDoor();
void onSense(Sensor sensor);
}
後からボタン式の自動ドアにも対応したくなり、以下のように変更しました。
interface AutomaticDoor {
void openDoor();
void closeDoor();
void onSense(Sensor sensor);
void onPressButton(Button button);
}
上記のインターフェースは、センサー式ではonPressButtonが、ボタン式ではonSenseが無駄になります。
これは「インターフェース分離の原則」に違反している状態です。
このように、後から対応範囲を広げようとする時には「インターフェース分離の原則」に違反しやすいです。
今回の例では以下のように修正すると「インターフェース分離の原則」を守れます。
interface AutomaticDoor {
void openDoor();
void closeDoor();
}
interface SensorAutomaticDoor extends AutomaticDoor {
void onSense(Sensor sensor);
}
interface ButtonAutomaticDoor extends AutomaticDoor {
void onPressButton(Button button);
}
「インターフェース分離の原則」に違反すると、インターフェースの利用者と実装者に問題が発生します。
インターフェースの利用者は、無駄な引数の設定を強要されたり、不要な機能に依存することになります。
インターフェースの実装者は、不要なメソッドや不要な引数を持つような実装を強制されます。
これはバグの原因や技術的負債になりやすく、これらへのテストのための無駄な工数も発生します。
ここまで読んでいただきありがとうございます。
次回は、「SOLID原則」の一つである「依存関係逆転の原則」について書く予定です。