Здравствуйте, Strategy, Вы писали:
S>Вариант 1:
S>Добавить в репозитори метод создания объекта, который запрашивает новый объект в фабрике и добавляет созданный объект в репозитори
S>S>'репозитори использует фабрику для создания объекта
S>dim NewObject = Repository.CreateObject
S>
S>Вариант 2:
S>Перенести добавление созданного объекта в репозитори внутрь фабрики.
S>S>'фабрика возвращает новый объект уже добавленный в репозитори
S>dim NewObject = Factory.CreateObject
S>
Если четко обозначить ответственности, то:
— Фабрика создаёт представление объекта в памяти
— Репозиторий принимает объект для управления его жизненным циклом, и, что важно,
проверяет валидность его состояния при добавлении и обновлении;
Вариант 2 выглядит нелогичным из-за того, что
(1) добавление объекта в Репозиторий внутри Фабрики — это, фактически, сайд-эффект;
(2) Фабрика вынуждена знать о Репозитории, хотя создание объекта может и не предполагать
помещение его в Репозиторий;
(3) операция может завершиться исключением из-за невалидного состояния объекта;
Насколько вообще важна Фабрика в данном случае? Если она просто создаёт пустой объект,
то с этим и Репозиторий вполне справится внутри, например, Repository.CreateObject.
Вообще, этот сценарий не совсем очевиден:
S>1. Запрос создания фабрикой нового объекта
S>2. Добавление созданного объекта в репозитори
S>S>dim NewObject = Factory.CreateObject
S>Repository.Add(NewObject)
S>'дальше модифицируются свойства объекта
S>
Означает ли это, что добавляется всегда пустой объект, затем ему задаются свойства?
По идее, правильный порядок действий таков:
— создать пустой объект
— задать свойства
— отдать в Репозиторий
Такой подход позволяет сделать Репозиторий ответственным за валидацию
как в случае добавления, так и в случае обновления.