概要
グループでSOLID原則とは何かを学んだので、その内容を記載します。
本記事では、SOLID原則の「インターフェイス分離の原則」について説明します。
SOLID原則とは?
オブジェクト指向で用いられる以下5つの原則のことです。
- Single Responsibility Principle (単一責任の原則)
- Open-Closed Principle (オープン・クローズドの原則)
- Liskov Substitution Principle (リスコフの置換原則)
- Interface Segregation Principle (インターフェイス分離の原則) ←本記事の内容
- Dependency Inversion Principle (依存関係逆転の原則)
変更に強く、理解しやすいソフトウェアを作るための基本原則です。
インターフェイス分離の原則
インターフェイス実装先で使わないメソッドがないようにインターフェイスをわけること。
原則を守らないとどうなるか?
クラスに使用することのできないメソッドを定義できるため、
無駄なコードになるだけでなく、予期しないバグ発生に繋がる可能性があります。
原則を守った実装方法
1. 必要最小限の機能を持つようにインターフェイスを作成する
2. クラスに必要なインターフェイスを適切に実装する
具体的には...
「剣士」と「魔法使い」がいるとします。
「剣士」は移動、剣を使った攻撃、守りができます。
「魔法使い」は移動、魔法攻撃、守りができます。
必要なメソッドは、移動、剣を使った攻撃、守り、魔法攻撃の4つになります。
❌先にダメな例
移動、剣を使った攻撃、守り、魔法攻撃の4つのメソッドを持つインターフェイスを作成。
剣士、魔法使いが上記のインターフェイスを実装すると...
魔法使いが剣を使った攻撃をできる!剣士が魔法を使える!といった意図しない動きができてしまいます。
⭕️正しい実装
まずは、インターフェイスの分離を行います。
必要最小限のメソッドを持つようにインターフェイスを作成するので、今回の例では以下のようになります。
①剣士と魔法使いに共通する処理を持つインターフェイス:移動、守り
②剣士のインターフェイス:剣を使った攻撃
③魔法使いのインターフェイス:魔法攻撃
次に、クラスに必要なインターフェイスを適切に実装します。
剣士と魔法使いが漏れなく処理を行えるようにするには、先ほど分割した3つのインターフェイスを以下のように実装します。
剣士:①共通インターフェイス(移動、守り)、②剣士のインターフェイス(剣を使った攻撃)
魔法使い:①共通インターフェイス(移動、守り)、③魔法使いのインターフェイス(魔法攻撃)
このように、必要最低限の状態にインターフェイスを分け、必要な処理をもつインターフェイスを適切に実装するのがインターフェイス分離の原則です。
原則が守られていると、意図しないバグを防げるだけでなく、理解しやすく変更に強いコードにもなります!
各インターフェイスで共通インターフェイスを継承
今回の例では、各クラスが共通インターフェイスと専用インターフェイスをそれぞれ実装していますが、共通インターフェイスを継承した専用インターフェイスを実装する方法もあります。
「共通インターフェイスと専用インターフェイスをそれぞれ実装する方法」と「共通インターフェイスを継承した専用インターフェイスを実装する方法」どちらが正しいかは「場合による」みたいです。
どのような場合にどちらの方法を選択すべきか、今後グループで話し合い理解を深めていきたいです。