Этот вопрос исследует взаимосвязь между принципами единственной ответственности и разделения интерфейсов.
Нарушение SRP приводит к нарушению ISP потому что большие классы с множеством ответственностей требуют таких же больших интерфейсов. Клиенты вынуждены зависеть от методов, которые они не используют. Когда класс делает слишком много, его интерфейс становится раздутым, заставляя клиентов реализовывать ненужные методы, что прямо нарушает принцип разделения интерфейсов.
Принципы SRP и ISP тесно связаны и нарушение одного обычно влечет нарушение другого из-за природы проектирования классов и интерфейсов.
Взаимосвязь принципов:
Большие классы → большие интерфейсы
Класс с множеством ответственностей имеет много методов
Интерфейс такого класса становится слишком общим
Клиенты зависят от неиспользуемых методов
Нарушение ISP как следствие нарушения SRP
Раздутые интерфейсы заставляют клиентов реализовывать лишнее
Высокая связность между несвязанными функциями
Трудности в тестировании и поддержке
Пример проблемы:
interface Worker {
public function code();
public function test();
public function deploy();
public function design();
}
class Developer implements Worker {
public function code() { /* ... */ }
public function test() { /* ... */ }
public function deploy() { /* ... */ }
public function design() { /* Не используется! */ }
}Правильный подход:
interface Coder {
public function code();
}
interface Tester {
public function test();
}
interface Deployer {
public function deploy();
}
class Developer implements Coder, Tester {
public function code() { /* ... */ }
public function test() { /* ... */ }
}Последствия нарушений:
Хрупкость архитектуры
Сложность внесения изменений
Нарушение инкапсуляции