Принцип DRY неправильно понят
Войти

Принцип DRY неправильно понят

Принцип DRY неправильно понят

Я знаю, о чем вы думаете: «Снова скучная статья о СУХОЙ? У нас уже недостаточно?». Возможно, ты прав. Однако я вижу слишком много разработчиков (младших или старших), применяющих DRY, как будто они делают охоту на ведьм. Полностью беспорядочно или везде они могут.

По-видимому, у нас никогда не было достаточно статей DRY в Интернете.

Небольшое напоминание для тех, кто не отвечает: принцип DRY означает «Не повторяйте себя» и был впервые представлен в «Прагматическом программисте».

Сам принцип был известен и применяется до того, как эта книга ожила. Однако Прагматический Программист точно определил его и надел на него имя.

Не повторяйте знания Даже если предложение не повторяется, звучит достаточно просто, это звучит слишком широко. В «Прагматическом программисте» DRY определяется как «каждая часть знания должна иметь одно, недвусмысленное, авторитетное представление в системе». Это здорово, но ... что это за знания? Я бы определил его как любую часть вашего бизнес-домена или алгоритм.

Чтобы использовать слишком используемые примеры электронной торговли, класс отправки и его поведение будут частью бизнес-области вашего приложения. Отгрузка - это то, что ваша компания использует для отправки продуктов своим клиентам. Это часть бизнес-модели вашей компании.

Поэтому логика этой отправки должна появляться только один раз в приложении. Причина очевидна: представьте, что вам нужно отправлять отправления на склад. Вам необходимо запустить эту логику в 76 разных местах приложения. Нет проблем: вы повторяете логику 76 раз. Через некоторое время ваш босс приходит к вам и просит вас изменить логику. Вместо отправки отправки на один склад вам нужно отправить их на три разных.

Результат? Вы потратите много времени на изменение логики, так как вам придется менять его в 76 местах! Это пустая трата времени, хороший способ создания ошибок и лучший способ выманить вашего босса.

Решение: создать единое представление ваших знаний. Поместите логику, чтобы отправить груз в одном месте, а затем используйте представление этих знаний в любом месте, где оно вам нужно. В ООП отправка отправки может быть методом класса Отгрузка, которую вы можете повторно использовать по своему усмотрению.

Еще один быстрый пример: представьте, что вы закодировали причудливый класс для разбора B-деревьев. Это можно рассматривать и как знание: это алгоритм, который нужно определить один раз. Представление этих знаний должно использоваться везде, не повторяя знания. DRY и дублирование кода Так что СУХОЙ - все о знании? Все о бизнес-логике? Начнем с очевидного:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php 

интерфейс продукта
{
    public function displayPrice ();
}

класс PlasticDuck реализует продукт
{
    / ** @var int * /
    частная цена $;

    публичная функция __construct (int price)
    {
        this-> price = $ price;
    }

    public function displayPrice ()
    {
        echo sprintf («Цена этой пластмассовой утки составляетd евро!», $ this-> price);
    }
}

plasticDuck новый PlasticDuck (2);
PlasticDuck-> displayPrice ();

?>
Этот код выглядит не так уж плохо, не так ли? Дэйв, ваш коллега-разработчик, не согласен. Когда Дэйв видит этот код, он приходит за ваш стол и кричит: Цена слова повторяется 6 раз. Метод displayPrice () повторяется в интерфейсе, реализации и вызывается во время выполнения. Дейв, эксперт-новичок вашей компании, не имеет понятия о ООП. Я вижу тебя, замечательный разработчик, смотрящий на Дейва, как опытный садовник, смотрит на слизню, отвечая: Это переменная (и свойство), и вам нужно повторить их в своем коде. Однако логика (отображение цены) присутствует только один раз, в самом методе. Нет никаких знаний, которые не повторялись ни алгоритмы. Здесь нет НИКАКОГО нарушения. Дэйв безмолвно ощущает вашу мощную ауру, освещающую всю комнату. Как хороший опытный новичок, вы атаковали его опыт, и он злится. Он googles принцип DRY, смотрит на другой код, который вы написали, и возвращается на ваш стол, хлопнув его по лицу:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php 

класс CsvValidation
{
    public function validateProduct (массив product)
    {
        if (! isset ($ product [\'color\'])) {
            throw new \\ Exception («Ошибка импорта: цвет атрибута продукта отсутствует»);
        }

        if (! isset ($ product [\'size\'])) {
            throw new \\ Exception («Ошибка импорта: размер атрибута продукта отсутствует»);
        }

        if (! isset ($ product [\'type\'])) {
            throw new \\ Exception («Ошибка импорта: отсутствует атрибут типа продукта»);
        }
    }
}
?>
Дейв, полный себя, утверждает: «Ты глупый! Этот код не СУХОЙ!». И вы, прочитав эту статью, ответите: «Но бизнес-логика, знания, по-прежнему
Теги:
php