Должен ли я создавать экземпляры других классов в конструкторе? - PullRequest
3 голосов
/ 06 марта 2011

Недавно я увидел своего коллегу, который создавал свои классы в конструкторе, поэтому я начал делать то же самое, например:

class FooBar{
private $model1;
private $model2;
    public function __construct() {
        $this->model1=new Model1();
            $this->model2=new Model2();
    }
}

И теперь я начинаю задумываться: может быть, лучше будет создать экземпляры моделей везде, где они нужны?

Например, функции foo() нужна модель1, а функции bar() нужна модель2, но теперь обе модели загружены.

Итак, вопрос: Является ли это правильным способом создания экземпляров других классов? Или мне просто создавать их экземпляры, когда они мне нужны в функции?

Ответы [ 4 ]

2 голосов
/ 06 марта 2011

Ну, как всегда, нет единого размера, подходящего для всех.

Большую часть времени , класс FooBar агрегирует $model1 и $model2, потому что они нуждаются в них для выполнения своей функции. В этом сценарии FooBar мало что может сделать, если у него нет объектов в этих переменных, поэтому правильно создать их в конструкторе.

Иногда агрегатный объект не требуется для выполнения большой части функции класса FooBar, и создание этого объекта является дорогостоящей операцией. В этом случае имеет смысл создавать его только по требованию с помощью кода, подобного следующему:

class FooBar {
    private $model1;
    private $model2;

    public function Frob() {
        $model = $this->getModel1();
        $model->frob();
    }

    private function getModel1() {
        if ($this->model1 === null) {
            $this->model1 = new Model1;
        }

        return $this->model1;
    }
}

Однако это только , иногда . Если классу FooBar требуется $model1 для половины его операций и $model2 для другой половины, это может указывать на то, что FooBar страдает от случая "давайте бросим все в одном классе" и должен быть разбит на два классы вместо.

2 голосов
/ 06 марта 2011

Мне бы хотелось, чтобы эти зависимости вводились в конструктор в качестве параметров.

1 голос
/ 06 марта 2011

Это не точная наука, и вы должны следовать своим инстинктам в том, как организовать код.

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

Но если вы делаете простые сценарии и время разработки является важным фактором, то того, как вы делаете это сейчас, достаточно.

1 голос
/ 06 марта 2011

На самом деле вы должны загружать их тогда, когда они вам нужны, иначе целая куча ненужных моделей (которые могут иметь свои собственные конструкторы с большим количеством загружаемых моделей!) Появится в памяти каждый раз, когда вам потребуется выполнить тривиальную операцию.

Не создавайте новую модель, если вы не уверены, что будете использовать их (например, модели, необходимые для локализации и т. Д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...