Что означает буква I в принципах SOLID?

«Что означает буква I в принципах SOLID?» — вопрос из категории ООП, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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) не затрагивают классы, которые его не используют.
  • Улучшение читаемости и тестируемости: Интерфейсы становятся более четкими и целенаправленными.