Запрос относительно внедрения зависимостей в PHP
Я читал о внедрении зависимостей, и я думаю, что я в значительной степени понимаю концепции, включая внедрение конструкторов и внедрение сеттеров.
Однако я не уверен, что бы я делал в следующем сценарии:
Скажем, у меня есть класс, который имеет много методов, но только один из этих методов требует определенного другого объекта. Как мне предоставить этот объект методу? Должен ли я не просто напрямую передать объект методу в качестве параметра следующим образом:
class aClass
{
function aMethod(anotherClass $anotherClass)
{
anotherClass->hello();
}
function otherMethods()
{
}
.....
}
Другой вариант - предоставить его всему классу, что кажется ненужным. вот так:
class aClass
{
protected $_anotherClass;
function aMethod()
{
anotherClass->hello();
}
function otherMethods()
{
}
.....
function setAnotherClass(anotherClass $anotherClass)
{
$this->_anotherClass;
}
}
Когда я должен передать объект в метод, и когда я должен использовать внедрение зависимостей через конструкторы / сеттеры? Есть ли эмпирическое правило или лучшая практика, когда использовать один из этих двух вариантов?
Заранее благодарны за Вашу помощь.
2 ответа
Вы упомянули эмпирическое правило, так что вот оно:
Задайте себе вопрос: может ли кто-нибудь законно вызвать этот метод дважды для одного и того же объекта, предоставляя разные значения для аргумента в двух вызовах?
Если да, то оставьте это как параметр. Если нет, то это хороший кандидат для инъекций, как вы описываете.
Это хороший пример метода первого типа, где удаление параметра и внедрение зависимости в класс было бы действительно плохой идеей. C# вместо PHP, но вы получите картину.
Внутренняя работа класса - это не бизнес, а сам этот класс. Если только одна функция требует зависимости, пусть будет так.
В качестве альтернативы вы могли бы задаться вопросом, почему только одна функция имеет зависимость, может, ваш класс делает две разные вещи?
Единственная причина, по которой вы не захотите внедрять зависимости в конструктор, это когда стоимость создания этого ресурса очень высока (подготовка большого файла на диске, подключение к удаленному хосту и т. Д.), Но даже в этом случае вы можете передать в "прокси" или "отложенном" объекте в качестве "обещания", что вы можете получить зависимость, если она вам когда-нибудь понадобится.