Ответ
I в SOLID — это Interface Segregation Principle (ISP), Принцип разделения интерфейсов.
Формулировка: Клиенты не должны зависеть от методов, которые они не используют. Многочисленные специализированные интерфейсы лучше, чем один универсальный.
Проблема — "толстый" интерфейс:
// Нарушение ISP. Принтер вынужден реализовывать метод Scan, который ему не нужен.
public interface IMultiFunctionDevice
{
void Print(Document d);
void Scan(Document d);
void Fax(Document d);
}
public class OldFashionedPrinter : IMultiFunctionDevice
{
public void Print(Document d) { /* OK */ }
public void Scan(Document d) { throw new NotImplementedException(); } // Ненужный метод!
public void Fax(Document d) { throw new NotImplementedException(); } // Ненужный метод!
}
Решение — разделение интерфейсов:
// Создаем несколько узкоспециализированных интерфейсов.
public interface IPrinter { void Print(Document d); }
public interface IScanner { void Scan(Document d); }
public interface IFax { void Fax(Document d); }
// Класс реализует только то, что ему действительно нужно.
public class OldFashionedPrinter : IPrinter
{
public void Print(Document d) { /* Реализация */ }
}
// Современное устройство может реализовать несколько интерфейсов.
public class Photocopier : IPrinter, IScanner
{
public void Print(Document d) { /* ... */ }
public void Scan(Document d) { /* ... */ }
}
Преимущества ISP:
- Уменьшение связанности: Классы перестают зависеть от неиспользуемых методов.
- Повышение стабильности: Изменения в одном интерфейсе (например,
IFax) не затрагивают классы, которые его не используют. - Улучшение читаемости и тестируемости: Интерфейсы становятся более четкими и целенаправленными.