I — Interface Segregation Principle: клиент не должен зависеть от методов, которыми не пользуется. Вместо одного большого («толстого») интерфейса пишут несколько маленьких, по ролям. Каждый класс реализует лишь те роли, которые умеет, а каждый клиент требует только нужную роль.
Нарушение: толстый интерфейс
Machine требует три операции. Многофункциональное устройство умеет всё, а старый принтер умеет только печатать, но вынужден писать scan и fax. Обычно такой класс пишет raise NotImplementedError, и клиент падает, вызвав scan().
Machine, справа три ролевых интерфейсаfrom abc import ABC, abstractmethod
class Machine(ABC): # a fat interface
@abstractmethod
def print_doc(self, doc): ...
@abstractmethod
def scan(self): ...
@abstractmethod
def fax(self, doc): ...
class MultiFunction(Machine):
def print_doc(self, doc):
return f"print {doc}"
def scan(self):
return "scan"
def fax(self, doc):
return f"fax {doc}"
class OldPrinter(Machine): # forced to implement what it cannot do
def print_doc(self, doc):
return f"print {doc}"
def scan(self):
raise NotImplementedError("no scanner")