Запрос относительно внедрения зависимостей в 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, но вы получите картину.

Внутренняя работа класса - это не бизнес, а сам этот класс. Если только одна функция требует зависимости, пусть будет так.

В качестве альтернативы вы могли бы задаться вопросом, почему только одна функция имеет зависимость, может, ваш класс делает две разные вещи?

Единственная причина, по которой вы не захотите внедрять зависимости в конструктор, это когда стоимость создания этого ресурса очень высока (подготовка большого файла на диске, подключение к удаленному хосту и т. Д.), Но даже в этом случае вы можете передать в "прокси" или "отложенном" объекте в качестве "обещания", что вы можете получить зависимость, если она вам когда-нибудь понадобится.

Другие вопросы по тегам