Приведите пример интерфейса, нарушающего принцип интерфейсной сегрегации
Что проверяют
Помните ли вы формулировку принципа целиком: клиент не должен зависеть от методов, которыми не пользуется. И умеете ли отличать нарушение от просто большого интерфейса, потому что размер сам по себе ничего не доказывает.
Как отвечать
Дайте короткий пример и сразу назовите признак проблемы.
interface Report {
byte[] renderPdf();
byte[] renderXlsx();
void schedule(Cron cron);
void sendByEmail(String address);
}Класс, которому нужен только PDF, всё равно обязан реализовать рассылку и расписание, и делает это пустой заглушкой или через UnsupportedOperationException. Вот это и есть маркер: реализация врёт о своих возможностях, а компилятор ей не мешает.
Полезно назвать пример из стандартной библиотеки: список, полученный из Arrays.asList, реализует List, но на add бросает исключение. Часть операций объявлена необязательными прямо в документации, и вызывающему приходится знать, какая реализация ему досталась.
Лечится разделением по ролям: отдельно формирование документа, отдельно доставка, отдельно планирование. Класс реализует те роли, что у него есть, а метод принимает самый узкий тип, которого ему достаточно. Добавьте важное уточнение: интерфейс делится по клиентам, а не по количеству методов. Если все вызывающие всегда пользуются всеми методами, дробить нечего.
Где спотыкаются
Затыкают лишние методы реализациями по умолчанию в самом интерфейсе. Компиляция проходит, наследники молчат, а дырявый контракт остаётся: метод, который ничего не делает, обманывает вызывающего ровно так же, как исключение.
Второе: путают принцип с единственной ответственностью. Тот про причины изменения класса, а этот про то, что видит конкретный клиент. Один класс вполне может реализовать несколько узких интерфейсов и не нарушить ни того ни другого.
Третье: доводят дробление до абсурда и получают десятки интерфейсов с одним методом, которые никто не собирает в осмысленные роли. Читать такой код труднее, чем исходный толстый контракт, и это тоже ошибка проектирования.