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

Введение

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

ISP предназначен для того, чтобы система оставалась изолированной, и, таким образом, ее было легче реорганизовать, изменить и повторно развернуть. Система может стать настолько связанной на нескольких уровнях, что больше невозможно будет вносить изменения в одном месте без необходимости множества дополнительных изменений. Использование интерфейса или абстрактного класса может предотвратить этот побочный эффект.

Практический пример (ы)

Нарушение интернет-провайдера

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

Одна проблема возникает, когда мы добавляем еще одну Workable сущность, Tester, которая не умеет кодировать. Теперь мы должны проверить, может ли Tester кодировать, если нет, то они не могут выполнять никакого кодирования, только тестирование. Это нарушение ISP, поскольку Tester теперь должен реализовать code метод, который к нему не применим.

interface Workable
{
    public function canCode();
    public function code();
    public function test();
}
class Developer implements Workable
{
    public function canCode()
    {
        return true;
    }
    public function code()
    {
        return 'coding';
    }
    public function test()
    {
        return 'testing in localhost';
    }
}
class Tester implements Workable
{
    public function canCode()
    {
        return false;
    }
    public function code()
    {
        // Tester is having to implement an unnecessary method
         throw new Exception('Opps! I can not code');
    }
    public function test()
    {
        return 'testing in test server';
    }
}
class ProjectManagement
{
    public function processCode(Workable $member)
    {
        if ($member->canCode()) {
            $member->code();
        }
    }
}

Соблюдение интернет-провайдера

Решение этой проблемы состоит в том, чтобы разделить Workable интерфейс на две отдельные задачи: тестирование и кодирование. Это было то, что мы могли Developer реализовать как конкретный интерфейс Codeable, так и Testable вместо общего интерфейса Workable, как раньше. Мы также можем просто дать Tester интерфейс Testable, чтобы им больше не нужно было безо всякой необходимости реализовывать функцию code.

interface Codeable
{
    public function code();
}
interface Testable
{
    public function test();
}
class Programmer implements Codeable, Testable
{
    public function code()
    {
        return 'coding';
    }
    public function test()
    {
        return 'testing in localhost';
    }
}
class Tester implements Testable
{
    public function test()
    {
        return 'testing in test server';
    }
}
class ProjectManagement
{
    public function processCode(Codeable $member)
    {
        $member->code();
    }
}

Вывод

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