У меня есть некоторые библиотеки в моей «инфраструктуре», такие как routing, config, logger, … Я хочу, чтобы они были независимы друг от друга, как это делают некоторые из известных PHP-фреймворков.
Я понимаю все принципы свободной связи, но я не знаю, как следовать как принципам свободной связи, так и сухим. Если я создам библиотеку маршрутизации для этого конфигуратора и регистратора, то я не повторяюсь сам, но если я хочу использовать маршрутизатор самостоятельно, он не будет работать. Точно так же, если я записываю журнал и код конфигурации в свою библиотеку маршрутизации, я бы повторил сам.
Свободная связь обычно означает, что ваши компоненты не ожидают конкретного экземпляра, а всего лишь один экземпляр, имеющий совместимый интерфейс.
Затем каждый сотрудник может быть заменен другим одним и тем же типом. Код больше не зависит от конкретной реализации одного из них.
Так:
Не используй:
глобальные (статические) функции
Foo:bar();
программирование на основе классов (передача имени класса вокруг)
stream_wrapper_register("var", "VariableStream");
глобальные константы
if ( !defined('ABSPATH') ) define('ABSPATH', dirname(__FILE__) . '/');
Но:
Использовать объекты
$foo->bar();
Программа против интерфейсов
public function __construct(LoggerInterface $logger) {
Единичный тест с издевательствами
$logger = $this->getMock('LoggerInterface', array('log'));
См. Также: