I — Interface Segregation Principle: клиент не должен зависеть от методов, которыми не пользуется. Вместо одного большого («толстого») интерфейса пишут несколько маленьких, по ролям. Каждый класс реализует лишь те роли, которые умеет, а каждый клиент требует только нужную роль.

Нарушение: толстый интерфейс

Machine требует три операции. Многофункциональное устройство умеет всё, а старый принтер умеет только печатать, но вынужден писать scan и fax. Обычно такой класс пишет raise NotImplementedError, и клиент падает, вызвав scan().

Слева толстый `Machine`, справа три ролевых интерфейса
Слева толстый Machine, справа три ролевых интерфейса
python
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")