Ответ
Разделение объектов в первую очередь связано с принципом разделения интерфейсов (ISP) из SOLID. Его цель — избегать создания "толстых" интерфейсов, которые вынуждают клиентов (классы) реализовывать методы, которые им не нужны.
Почему это важно:
- Уменьшает связность — классы зависят только от того, что им действительно нужно.
- Повышает поддерживаемость — изменения в одном интерфейсе затрагивают меньшее количество кода.
- Предотвращает загрязнение кода — исчезает необходимость в пустых реализациях методов (например,
throw new NotImplementedException).
Пример на PHP:
// Проблема: "Толстый" интерфейс
interface WorkerInterface {
public function code();
public function test();
public function deploy();
public function cook(); // Не нужно программисту!
}
class Programmer implements WorkerInterface {
public function code() { /* ... */ }
public function test() { /* ... */ }
public function deploy() { /* ... */ }
public function cook() { // Вынужденная пустая реализация
throw new RuntimeException('I cannot cook!');
}
}
// Решение: Разделенные интерфейсы
interface CoderInterface {
public function code();
}
interface TesterInterface {
public function test();
}
interface DeploymentInterface {
public function deploy();
}
interface ChefInterface {
public function cook();
}
// Теперь класс реализует только нужные ему интерфейсы
class Programmer implements CoderInterface, TesterInterface {
public function code() { /* ... */ }
public function test() { /* ... */ }
}
class DevOpsEngineer implements CoderInterface, DeploymentInterface {
public function code() { /* ... */ }
public function deploy() { /* ... */ }
}
На практике это часто применяется при проектировании сервисов или модулей, чтобы они были сфокусированы на одной ответственности.