0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-09-20

概要

グループでSOLID原則とは何かを学んだので、その内容を記載します。
本記事では、SOLID原則の「インターフェイス分離の原則」について説明します。

SOLID原則とは?

オブジェクト指向で用いられる以下5つの原則のことです。

  • Single Responsibility Principle (単一責任の原則)
  • Open-Closed Principle (オープン・クローズドの原則)
  • Liskov Substitution Principle (リスコフの置換原則)
  • Interface Segregation Principle (インターフェイス分離の原則) ←本記事の内容
  • Dependency Inversion Principle (依存関係逆転の原則)

変更に強く、理解しやすいソフトウェアを作るための基本原則です。

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

インターフェイス実装先で使わないメソッドがないようにインターフェイスをわけること。

原則を守らないとどうなるか?

クラスに使用することのできないメソッドを定義できるため、
無駄なコードになるだけでなく、予期しないバグ発生に繋がる可能性があります。

原則を守った実装方法

1. 必要最小限の機能を持つようにインターフェイスを作成する
2. クラスに必要なインターフェイスを適切に実装する

具体的には...

「剣士」と「魔法使い」がいるとします。
「剣士」は移動、剣を使った攻撃、守りができます。
「魔法使い」は移動、魔法攻撃、守りができます。

必要なメソッドは、移動、剣を使った攻撃、守り、魔法攻撃の4つになります。
 

❌先にダメな例

移動、剣を使った攻撃、守り、魔法攻撃の4つのメソッドを持つインターフェイスを作成。
剣士、魔法使いが上記のインターフェイスを実装すると...

魔法使いが剣を使った攻撃をできる!剣士が魔法を使える!といった意図しない動きができてしまいます。

 
⭕️正しい実装

まずは、インターフェイスの分離を行います。
必要最小限のメソッドを持つようにインターフェイスを作成するので、今回の例では以下のようになります。

①剣士と魔法使いに共通する処理を持つインターフェイス:移動、守り

②剣士のインターフェイス:剣を使った攻撃

③魔法使いのインターフェイス:魔法攻撃

 
次に、クラスに必要なインターフェイスを適切に実装します。
剣士と魔法使いが漏れなく処理を行えるようにするには、先ほど分割した3つのインターフェイスを以下のように実装します。

剣士:①共通インターフェイス(移動、守り)、②剣士のインターフェイス(剣を使った攻撃)

魔法使い:①共通インターフェイス(移動、守り)、③魔法使いのインターフェイス(魔法攻撃)

このように、必要最低限の状態にインターフェイスを分け、必要な処理をもつインターフェイスを適切に実装するのがインターフェイス分離の原則です。
原則が守られていると、意図しないバグを防げるだけでなく、理解しやすく変更に強いコードにもなります!

各インターフェイスで共通インターフェイスを継承

今回の例では、各クラスが共通インターフェイスと専用インターフェイスをそれぞれ実装していますが、共通インターフェイスを継承した専用インターフェイスを実装する方法もあります。

「共通インターフェイスと専用インターフェイスをそれぞれ実装する方法」と「共通インターフェイスを継承した専用インターフェイスを実装する方法」どちらが正しいかは「場合による」みたいです。
どのような場合にどちらの方法を選択すべきか、今後グループで話し合い理解を深めていきたいです。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?