Принцип разделения интерфейсов (ISP) – это принцип проектирования программного обеспечения, который предлагает разбивать программные интерфейсы на более мелкие специализированные интерфейсы, отвечающие конкретным потребностям клиентов. Цель ISP — предотвратить принуждение клиентов к внедрению методов, которые они не используют, тем самым уменьшая загрязнение интерфейса в кодовой базе.

Другими словами, он побуждает разработчиков программного обеспечения создавать интерфейсы, адаптированные к конкретным потребностям клиентов, а не создавать один большой интерфейс, который пытается удовлетворить всех. Тем самым он продвигает более модульную и удобную в сопровождении кодовую базу, упрощая внесение изменений, не затрагивая всю систему.

Нарушение

Давайте рассмотрим пример на Java. Предположим, у нас есть интерфейс с именем Vehicle, который имеет два метода: drive() и fly(). У нас также есть два класса с именами Car и Airplane, которые реализуют этот интерфейс.

public interface Vehicle {
    public void drive();
    public void fly();
}

public class Car implements Vehicle {
    public void drive() {
        // code to drive the car
    }

    public void fly() {
        // OOPS
    }
}

public class Airplane implements Vehicle {
    public void drive() {
        // code to drive the airplane
    }

    public void fly() {
        // code to fly the airplane
    }
}

В этом примере кода класс Car не имеет возможности летать, но все же вынужден реализовать метод fly(), поскольку он является частью интерфейса Vehicle. Это нарушает принцип разделения интерфейса, поскольку интерфейс Vehicle не приспособлен к конкретным потребностям каждого реализующего класса, что может привести к следующим проблемам:

  1. Несоответствующее поведение. Если класс вынужден реализовать метод, который он не использует, возможно, ему придется реализовать его с помощью фиктивного кода или создать исключение, что может привести к ненадлежащему поведению в системе. Например, в примере, где Car реализует метод fly() с некоторым фиктивным кодом, может создаться впечатление, что машина может летать, что не соответствует действительности.
  2. Уменьшенная гибкость. Если интерфейс перегружен ненужными методами, это может затруднить расширение системы новыми функциями. Например, если мы хотим добавить новый класс, который реализует только метод fly(), мы не можем сделать это без реализации метода drive(), который может быть ненужным и запутанным.
  3. Вводящий в заблуждение дизайн. Интерфейс, загрязненный несвязанными методами, может вводить в заблуждение других разработчиков, использующих этот интерфейс. Может создаться впечатление, что реализующий класс поддерживает функции, которых на самом деле у него нет, что может привести к путанице и потенциально неверным предположениям.

Применение принципа разделения интерфейса

Чтобы применить принцип разделения интерфейсов, лучшим подходом было бы создание отдельных интерфейсов для вождения и полета, чтобы классы могли реализовывать только те методы, которые им нужны, например:

public interface Driveable {
    public void drive();
}

public interface Flyable {
    public void fly();
}

public class Car implements Driveable {
    public void drive() {
        // code to drive the car
    }
}

public class Airplane implements Driveable, Flyable {
    public void drive() {
        // code to drive the airplane
    }

    public void fly() {
        // code to fly the airplane
    }
}

Разделив функции вождения и полета на отдельные интерфейсы, мы можем избежать загрязнения интерфейса и создать более модульный и удобный код.

Заключение

В заключение, принцип разделения интерфейса (ISP) является важным принципом разработки программного обеспечения, который может сделать наш код более модульным и удобным в сопровождении. Однако применение ISP требует дополнительного времени и усилий на этапе проектирования и может увеличить сложность кода. Поэтому мы должны применять его на основе опыта и здравого смысла при определении областей, где расширение кода, скорее всего, произойдет в будущем.

В моем следующем сообщении в блоге мы обсудим Принцип инверсии зависимостей (DIP). Вот ссылка.

Спасибо за чтение. Я надеюсь, что этот пост будет полезен для вас. Если у вас есть дополнительные вопросы, не стесняйтесь обращаться к нам. Я всегда рад помочь.

Подключаемся:
LinkedIn
Twitter