Запрос относительно внедрения зависимостей в PHP - PullRequest
2 голосов
/ 09 декабря 2011

Я читал о внедрении зависимостей, и мне кажется, что я довольно хорошо понимаю концепции, включая внедрение конструкторов и внедрение сеттеров.

Однако я не уверен, что бы я делал в следующем сценарии:

Скажем, у меня есть класс, который имеет много методов, но только один из этих методов требуетопределенный другой объект.Как мне предоставить этот объект методу?Если бы я не просто напрямую передал объект методу в качестве параметра, например, так:

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 ]

2 голосов
/ 09 декабря 2011

Вы упомянули эмпирическое правило, поэтому вот оно:

Задайте себе вопрос: Может ли кто-нибудь законно вызвать этот метод дважды для одного и того же объекта, предоставляя разные значениядля аргумента в двух вызовах?

Если да, то оставьте его в качестве параметра.Если нет, тогда это хороший кандидат для внедрения, как вы описываете.

Этот является хорошим примером метода первого типа, где удаление параметра и внедрение зависимости в классевместо этого была бы действительно плохая идея.C # вместо PHP, но вы получите картину.

1 голос
/ 09 декабря 2011

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

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

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

...