Разделите свой код, и ваши коллеги будут вам благодарны.
Развязка – не новая концепция, но я начал документировать ее довольно недавно. Вот что я узнал.
Что такое “развязка”?
Чтобы понять развязку, вы должны сначала узнать, что такое код связи.
Существует понятие связи, когда 2 службы с разными обязанностями нуждаются друг в друге для работы. Эти 2 услуги “связаны”.
Наш способ работы с классами увеличит или уменьшит силу сцепления:
- сильная связь достигается, например, когда классы инициализируются внутри других классов. В общем, использование классов напрямую увеличивает сцепление.
- слабая связь существует, когда первый класс не знает, кто и как работает класс, который она использует.
Пример связанного кода:
iniConf = new IniConf('../config.ini');
}
public function renderView()
{
echo '[' . $this->iniConf->getValue('db') . ' : ' . count($this->iniConf->getValue('db')) . ']';
echo '[' . $this->iniConf->getValue('name') . ' : 0' . ']';
}
}
Моему контроллеру необходим доступ к параметрам приложения, которые хранятся в файле .ini . Нет проблем, потому что у меня есть класс, который делает именно это: IniConf , поэтому я им пользуюсь. И я делаю это в нескольких других контроллерах тоже: О контроллере , Контроллер администратора , Контроллер Портфолио
Но что, если завтра я решу изменить адрес своего конфигурационного файла? Или если я захочу сохранить свои параметры в базе данных для большей гибкости? Вы понимаете, к чему это ведет? Каждый раз мне нужно менять свой контроллер (контроллеры).
Количество строк кода, которые я должен изменить, может очень быстро стать экстремальным: я буду тратить больше времени на смену своих контроллеров, чем на написание класса, который хранит конфигурацию в базе данных.
“Развязка” – это решение
Как вы разделяете код, чтобы ограничить этот тип проблем?
Вы можете начать с разделения Ini Conf и Контроллер индекса . Конечно IndexController нуждается IniConf (его зависимость) для правильной работы но он не должен быть тем, кто его инициализирует. Мы сделаем инъекцию зависимостей:
iniConf = $iniConf; }
Там. Таким образом, я могу создать экземпляр Ini Conf один раз и передайте его конструкторам моих контроллеров. Это ограничит количество мест, в которых мне нужно будет изменить адрес файла.
Что касается нашей проблемы с изменением всего метода сохранения параметров приложения, давайте немного отмотаем назад:
первый класс не знает, кто такой и как именно работает класс, который он использует.
Ему нужно знать тип класса, который ему нужен, и как он работает. Для этого мы заключим контракт между IndexController и IniConf .
Способы сделать это различаются в зависимости от используемого языка: с PHP мы будем использовать интерфейсы, с Swift это будут протоколы.
Каким бы ни был мой метод хранения параметров, мне нужно иметь доступ к параметрам и изменять ключи. Вам нужно создать интерфейс Конфигуратор который это делает.
conf = $conf;
}
public function renderView()
{
echo '[' . $this->conf->get('db') . ' : ' . count($this->conf->get('db')) . ']';
echo '[' . $this->conf->get('name') . ' : 0' . ']';
}
}
Следовательно, я меняю код своих контроллеров:
- Конструктор запрашивает объект, который соблюдает контракт
Конфигуратор - Контроллер использует методы контракта, а не методы классов.
- Контроллер не обязательно использует
Конфигурация Ini, он не знает, что он использует на самом деле, мы меняем атрибут в$ это->конференция
Последнее, что нужно сделать, это изменить код с Init Conf чтобы заставить его соблюдать контракт Конфигуратор .
Вывод
Код выглядит хорошо, теперь он развязан. В результате ничего не меняется, новый код делает то же самое, что и предыдущий, но его проще поддерживать.
Мой index.php код:
renderView();
Красота внедрения зависимостей.
Мне нужно изменить адрес моего файла конфигурации:
renderView();
Адрес изменяется в одном месте и приносит пользу всему приложению.
Я переношу свою конфигурацию в базу данных.
'config',
'login' => 'dbuser',
'passwd' => '1234'
]);
$index = new IndexController($conf);
$other = new OtherController($conf);
$index->renderView();
Изменения прозрачны для моих контроллеров, я не меняю код. Я сосредоточился на своей новой функции (класс написания для нового метода хранения) и не терял времени, меняя каждую строку кода, где Появился IniConf .
Для тех из вас, кто хотел бы ознакомиться с ним более подробно, вот ссылка GitHub проекта.
Оригинал: “https://dev.to/mindsers/decouple-your-code-5d”