4.2 KiB
aliases | tags | date | ||
---|---|---|---|---|
|
|
2024-09-27 |
Принцип разделения интерфейсов (Interface Segregation Principle, ISP) гласит: ==лучше создать несколько специализированных интерфейсов, чем один универсальный,== который заставляет классы реализовывать методы, не относящиеся к их функциональности. Каждый интерфейс должен описывать только те действия, которые действительно нужны конкретному клиенту. Этот принцип помогает избежать ненужной связанности и упрощает поддержку кода.
Для реализации ISP следует:
- Создавать узкоспециализированные интерфейсы, соответствующие конкретным задачам.
- Избегать универсальных интерфейсов с множеством методов, которые могут быть неактуальны для некоторых реализаций.
- Делить интерфейсы на логически связанные группы методов.
Преимущества соблюдения ISP
- Снижение связанности: Реализации зависят только от методов, которые они используют.
- Повышенная гибкость: Интерфейсы можно изменять или добавлять новые без влияния на классы, которым эти изменения не нужны.
- Упрощение тестирования: Тестировать реализацию узких интерфейсов проще, так как они охватывают только необходимый функционал.
- Улучшенная читаемость: Логически разделенные интерфейсы делают код более понятным и структурированным.
Пример нарушения ISP
Рассмотрим интерфейс Worker
, который описывает как работу, так и прием пищи:
public interface Worker {
void work();
void eat();
}
public class RobotWorker implements Worker {
@Override
public void work() {
// Робот работает
}
@Override
public void eat() {
// Робот не ест — нарушение ISP
throw new UnsupportedOperationException("Robots do not eat");
}
}
Класс RobotWorker
вынужден реализовывать метод eat
, который ему не нужен. Это нарушение ISP, так как интерфейс содержит лишние методы, не применимые ко всем клиентам.
Разделим интерфейс на два более специализированных:
public interface Worker {
void work();
}
public interface Eater {
void eat();
}
Теперь каждый класс реализует только те интерфейсы, которые ему нужны:
public class HumanWorker implements Worker, Eater {
@Override
public void work() {
// Человек работает
}
@Override
public void eat() {
// Человек ест
}
}
public class RobotWorker implements Worker {
@Override
public void work() {
// Робот работает
}
}
Мета информация
Область:: ../../meta/zero/00 Архитектура ПО Родитель:: SOLID Источник:: Создана:: 2024-09-27 Автор::