【SOLID原則】インターフェース分離の原則とは何か

2023/02/26に公開約1,400字

インターフェース分離の原則

インターフェース分離の原則(ISP: Interface Segregation Principle)

インターフェース分離の原則は、クライアントが必要としないメソッドに依存しないようにするため、インターフェースをクライアントに適した形に分割する必要があるという考え方です。

具体的には、クライアントが必要としないメソッドを含む大きなインターフェースを作成することを避け、複数の小さなインターフェースに分割することを推奨しています。

インターフェース分離の原則を遵守することで、クライアント(呼び出し元)が必要としないメソッドに依存することを回避し、クライアントにとって必要な機能のみを提供することができます。また、インターフェースの変更がクライアントに影響を与えることを最小限に抑えることもできます。

悪いコード(原則に)反している

インターフェース分離の原則に違反する例を挙げると

interface IAnimal {
  eat(): void;
  fly(): void;
  swim(): void;
}

class Bird implements IAnimal {
  eat() {
    // ...
  }

  fly() {
    // ...
  }

  swim() {
    throw new Error('Bird cannot swim');
  }
}

class Fish implements IAnimal {
  eat() {
    // ...
  }

  fly() {
    throw new Error('Fish cannot fly');
  }

  swim() {
    // ...
  }
}

この例では、IAnimalインターフェースが以下の3つのメソッドを含んでいます。

  • fly
  • swim
  • eat

しかし、Birdクラスは泳ぐことができず、Fishクラスは飛ぶことができないためエラーを返却しています。

クライアントは、不要なメソッドに依存している状態ですね。

良いコード(原則に則している)

インターフェース分離の原則を遵守するためには、IAnimalインターフェースを以下のように分割してあげましょう。

interface IAnimal {
  eat(): void;
}

interface IFlyable {
  fly(): void;
}

interface ISwimmable {
  swim(): void;
}

class Bird implements IAnimal, IFlyable {
  eat() {
    // ...
  }

  fly() {
    // ...
  }
}

class Fish implements IAnimal, ISwimmable {
  eat() {
    // ...
  }

  swim() {
    // ...
  }
}

このように、インターフェースを分割することで、クライアントが必要としないメソッドに依存することを回避し、必要な機能のみを提供することができます。

また、インターフェースの変更がクライアントに影響を与えることを最小限に抑えることもできるようになりましたね。

Discussion

ログインするとコメントできます