Представляет ли мой объект Factory глобальное состояние? - PullRequest
5 голосов
/ 08 апреля 2011

Итак, вот сделка.Мне удалось создать фреймворк без использования глобальных или статических классов / функций.

Я использую форму внедрения зависимостей с использованием Factory.Поскольку фреймворк будет использоваться для разных целей, я создаю более универсальную фабрику, которая будет создавать ваш класс с его рекурсивными зависимостями.

Дело в том, что для сохранения памяти каждый раз, когда создается объект,Фабрика хранит ссылку на него, поэтому, если другой объект имеет зависимость от этого объекта, Фабрике нужно будет только вернуть ссылку.Таким образом, нам не нужно создавать экземпляр одного и того же объекта дважды.

Это означает, что во многих классах у нас будет много разных ссылок на один и тот же объект.Например, если я объявлю Blog_model, Blog_controller, Blog_view, Form_validation для запроса объекта Config, каждый из них будет создан со ссылкой на тот же объект Config, хотя и с инъекцией.

Я не знаком смодульное тестирование или любой вид автоматического тестирования.Я только что обнаружил, что использование глобальных и статических данных плохо (именно поэтому я переписываю фреймворк, который использую).Что я хочу спросить, так это ввести глобальное состояние?Это как-то мешает тестированию?

---- Обновление ------

Это среда MVC, написанная на PHP.

Ответы [ 2 ]

3 голосов
/ 08 апреля 2011

Насколько я прочитал этот вопрос, вы по существу создали Контейнер для инъекций зависимостей , который поддерживает только один образ жизни.

С DI тесно связана концепция управления жизненным циклом . Если мы запрашиваем экземпляр определенного типа несколько раз, получаем ли мы одну и ту же ссылку каждый раз, или каждый раз получаем новый экземпляр?

Если мы получим один и тот же экземпляр каждый раз, когда будем называть его Singleton lifestyle - не путать с шаблоном проектирования Singleton.

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

Существуют также другие типы образов жизни, такие как ограниченный объем, объединение и т. Д., Но два вышеупомянутых являются наиболее базовыми.

Мне кажется, что ваш DI-контейнер поддерживает только стиль жизни Singleton. Это не совпадает с глобальным состоянием , но состояние является общим для одного экземпляра контейнера. Однако, если вы отбрасываете экземпляр контейнера, вы также отбрасываете общее состояние, поэтому от него легче избавиться, чем от глобального состояния.

2 голосов
/ 08 апреля 2011

Да, он вводит глобальное состояние, поскольку ваша фабрика возвращает ссылку на только что созданный объект.

Вы не сказали, какой язык вы используете, но если вы используете c ++, ваш фабричный метод должен вернуть shared_ptr (тип для shared_ptr должен быть базовым классом объекта, который вы создаете).

...