インターフェイス分離の原則
1. 原則
クライアントにクライアントが利用しないメソッドを強制してはならない
- インターフェイスを定義する際、クライアント側が利用しない(あるいはその可能性がある)メソッドの実装を強制してはならない
- インターフェイスはメソッドの実装を強制する為、クライアント側はインターフェイスに定義されていれば使わないことが分かっていても実装するしかない(それは無駄である)
- したがって、インターフェイスは最小限のメソッドを定義し、無用な(または無用になるような)メソッドを定義しないようにするべし
2. 根拠
クライアント側に無駄なコストを負担させることになる
- クライアント側で使わないメソッドの実装を強制されることになり無駄な実装コストが発生する
- クラスの責務として不要/不適切なメソッドが存在することになり、コードの可読性が低下する
- 結果的に、保守性が低下することになる
3. 指針
4. 注意事項
参考資料
Appendix-1 インターフェイス分離の原則に違反するサンプル
class Program(metaclass=ABCMeta):
@abstractmethod
def execute(self):
pass
@abstractmethod
def to_string(self):
pass
@abstractmethod
def to_html(self):
pass
class MyProgram01(Program):
def __init__(self, value):
self.value = value
def execute():
print(self.value)
def to_string():
return self.value
def to_html():
return "<b>{}</b>".format(self.value)
-
Program
はexecute()
、to_string()
、to_html()
という3つのメソッドを実装することを求めている
- このインターフェイスの製作者は処理を実行する
execute()
メソッドと、クラスの内容を文字列化するto_string()
メソッドが必要だと考えたが、それらに加えてクラスの内容をHTMLタグで装飾するメソッドもあった方が良いだろうと考え、to_html()
も追加した
- しかし、実際には
to_html()
を使う場面は無く、以降のプログラムではto_html()
は空のままにされることが多かった(MyProgram02
)
class Program(metaclass=ABCMeta):
@abstractmethod
def execute(self):
pass
@abstractmethod
def to_string(self):
pass
@abstractmethod
def to_html(self):
pass
class MyProgram01(Program):
def __init__(self, value):
self.value = value
def execute():
print(self.value)
def to_string():
return self.value
def to_html():
pass
class MyProgram02(Program):
def __init__(self, value):
self.value = value
def execute():
print(self.value)
def to_string():
return self.value
def to_html():
pass
- インターフェイスは実装クラスにメソッドの実装を強要する為、必要のないメソッドでも宣言だけはする必要がある
- 結果的に宣言だけされて何の処理もしない謎のメソッドを持つクラス群が発生した