ISPとは
ISP(Interface Segregation Principle:インターフェース分離の原則)とは、
「ドメインが異なるメソッドをひとつのインターフェースに混在させ、利用者が使用しないメソッドへの依存を強制させてはいけない」
というルール
ひとつのインターフェースにドメインがバラバラなメソッドを詰め込んでしてしまうと、必要の無いメソッドの実装を強制されたり、本来関係ないところと依存関係が生じたりしてしまう。
そのため、ISPに違反した実装はバグを誘発させたり保守性を悪化させたりする。
すなわち、インターフェースはドメインごとに分割して肥大化させるのはやめましょうという考え方。
具体例
ISPに則り、管理者が商品を出品して、それをユーザーが購入するECサイトを考えると次のようになる。
from abc import ABCMeta
from abc import abstractmethod
# 管理者インターフェース
class administrator_interface(metaclass = ABCMeta):
@abstractmethod
def register(self):
pass # 商品の登録
@abstractmethod
def delete(self):
pass # 商品の削除
# ユーザーインターフェース
class user_interface(metaclass = ABCMeta):
@abstractmethod
def buy(self):
pass # 商品の購入
管理者インターフェースとユーザーインターフェースを設けることで、それぞれのドメインで必要なメソッドだけ定義できていることがわかる。
もし今後、ECサイトの仕様変更などでインターフェースに新たなメソッドを追加する必要があるときは、追加したいメソッドがどのドメインと関係するか吟味する。
その上で、既存のインターフェースに書き加えるべきか、それともインターフェースを新たに作成するか考える。
ISPとSRPの関係
ISPは、インターフェースに関してSRPを適用した原則ととらえることができる。
すわなち、ひとつのインターフェースに対して、ひとつのドメインと関係するメソッドしか定義してはいけない。