Рубрики
Uncategorized

Разделите свой код

Разделите свой код, и ваши коллеги будут вам благодарны. Развязка – это не новая концепция, но я начал… Помечено лучшими практиками, качеством кода, ооп, php.

Разделите свой код, и ваши коллеги будут вам благодарны.

Развязка – не новая концепция, но я начал документировать ее довольно недавно. Вот что я узнал.

Что такое “развязка”?

Чтобы понять развязку, вы должны сначала узнать, что такое код связи.

Существует понятие связи, когда 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”