【Java初心者向け】SOLID原則の「I(インターフェース分離の原則)」をやさしく解説!

こんにちは。ゆうせいです。
今回はSOLID原則の「I:インターフェース分離の原則(Interface Segregation Principle)」について解説します。
Javaのコード例を使って、インターフェースってそもそもなに?という方でも分かるように、順を追って説明していきます!


インターフェース分離の原則(ISP)とは?

一言で説明すると?

「クライアント(利用する側)は、使わないメソッドに依存してはいけない」という原則です。

どういうこと?

大きすぎるインターフェースを作ってしまうと、必要ない機能まで実装を強制されてしまう
その結果、関係のない機能変更にも巻き込まれてしまいます。


よくある例:ISPに違反しているコード

1つのインターフェースに全部盛り!

public interface Machine {
    void print();
    void scan();
    void fax();
}

このインターフェース、印刷もスキャンもFAXも全部含まれています。

単機能プリンターが困る!

public class SimplePrinter implements Machine {
    public void print() {
        System.out.println("印刷しています");
    }

    public void scan() {
        throw new UnsupportedOperationException("スキャンできません");
    }

    public void fax() {
        throw new UnsupportedOperationException("FAXできません");
    }
}

これはまさに「使わない機能に依存している」状態。例外を投げて対応しているのは危険なサインです!


良い例:インターフェースを分ける

必要な機能だけを持つインターフェースに分離!

public interface Printer {
    void print();
}

public interface Scanner {
    void scan();
}

public interface Fax {
    void fax();
}

使う側は必要なものだけ実装すればOK!

public class SimplePrinter implements Printer {
    public void print() {
        System.out.println("印刷しています");
    }
}

public class MultiFunctionPrinter implements Printer, Scanner, Fax {
    public void print() {
        System.out.println("印刷しています");
    }

    public void scan() {
        System.out.println("スキャンしています");
    }

    public void fax() {
        System.out.println("FAXしています");
    }
}

必要な機能だけを選んで使える=インターフェース分離の原則を守っているということです。


例え話で理解しよう!

あなたがレストランで「ハンバーガーだけ頼みたい」のに、「ポテトとドリンクも強制的に付いてくる」セットしかないとしたらどう感じますか?

無駄な機能がついてくることは、開発者にも使う人にもストレスです。
「欲しいものだけを注文できるインターフェース」こそが理想です!


インターフェース分離の原則を守るメリット

メリット解説
実装が簡単になる必要な機能だけ実装すれば良い
不要な依存を避けられる無関係な変更の影響を受けない
クラスの責任が明確になる単一責任の原則とも相性が良い

注意点:小さくしすぎても逆効果?

もちろん、細かく分けすぎると逆に混乱することもあります。
目安としては、「1つのインターフェースに関連性の高い操作をまとめる」くらいの感覚でOKです。


設計時に考えるべき3つの質問

  1. すべてのメソッドがそのクラスにとって意味があるか?
  2. 使わない機能まで実装を強制していないか?
  3. インターフェースが肥大化していないか?

数式的に表すなら?

  • 悪い設計: インターフェースA = a + b + c + d + ...(全部盛り)
  • 良い設計: インターフェースA = aインターフェースB = b、…

必要な機能だけを選んで組み合わせる設計が、拡張性の高いシステムをつくります!


まとめと次の学習ステップ

インターフェース分離の原則は、「使わない機能は持たせない」という、シンプルながら非常に重要な設計指針です。

新人エンジニアがまず意識すべきこと

  • 「インターフェースにメソッドを追加したくなったら、それは分けるサインかも」
  • 「1つのインターフェースに5つ以上のメソッドがあるなら、分離を検討」
  • 「大は小を兼ねない」と思って設計しよう!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。