一般社団法人 全国個人事業主支援協会

COLUMN コラム

はじめに

この記事は私が「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原則」の一つである「依存関係逆転の原則」について書く予定です。

 

The following two tabs change content below.

神谷 全俊

2018年からフリーランスのシステムエンジニアになりました。 出身は沖縄県で、プロフィール画像も沖縄で撮った写真です。 個人ブログも書いており、こちらにはそこでの記事の一部を載せる予定です。

最新記事 by 神谷 全俊 (全て見る)

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア