Вопрос проверяет понимание принципа разделения интерфейсов (Interface Segregation Principle, ISP), который является частью SOLID и помогает создавать гибкие и поддерживаемые системы, избегая зависимости от неиспользуемых методов.
Принцип разделения интерфейсов (Interface Segregation Principle, ISP) — это один из пяти принципов объектно-ориентированного дизайна SOLID, предложенных Робертом Мартином. Его основная идея заключается в том, что клиенты (классы, модули) не должны быть вынуждены зависеть от интерфейсов, которые они не используют. Создание "толстых" интерфейсов, содержащих множество методов, приводит к тому, что классы-клиенты реализуют методы, которые им не нужны, что увеличивает сложность и хрупкость системы.
Представьте интерфейс для устройства, которое может печатать, сканировать и отправлять факсы. Если создать один интерфейс IMultifunctionDevice со всеми этими методами, то простой принтер будет вынужден реализовывать методы сканирования и отправки факса, даже если он их не поддерживает. Это нарушает ISP и приводит к пустым реализациям или выбрасыванию исключений.
Вместо этого следует разделить интерфейс на несколько узкоспециализированных:
// Плохо: один "толстый" интерфейс
interface IMultifunctionDevice {
void Print(Document d);
void Scan(Document d);
void Fax(Document d);
}
// Хорошо: несколько специфичных интерфейсов
interface IPrinter {
void Print(Document d);
}
interface IScanner {
void Scan(Document d);
}
interface IFax {
void Fax(Document d);
}
// Класс может реализовывать только нужные интерфейсы
class SimplePrinter : IPrinter {
public void Print(Document d) { /* реализация печати */ }
}
class MultifunctionMachine : IPrinter, IScanner, IFax {
// реализация всех методов
}Этот принцип широко используется при проектировании библиотек, API и микросервисов. Например, в веб-разработке можно создавать отдельные интерфейсы для чтения и записи данных (CQRS), в Java — разделять интерфейсы коллекций (Iterable, Collection, List), а в микросервисной архитектуре — дробить большие контракты на мелкие, чтобы сервисы зависели только от необходимых операций.
Вывод: Применяйте Interface Segregation Principle, когда хотите уменьшить связность между компонентами, упростить тестирование и сделать систему более гибкой к изменениям. Особенно он полезен при разработке библиотек, где клиенты могут выбирать только нужную функциональность.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию