DDD и фабрики - PullRequest
       46

DDD и фабрики

1 голос
/ 27 сентября 2011

Привет У меня есть несколько вопросов, касающихся доменного дизайна и использования фабрики / фабрики. В соответствии с Синей книгой по дизайну, управляемой доменом (книга Эрика Эвана), в ней говорится, что сложные конструкторы должны быть инкапсулированы внутри фабрик / фабричных методов / сборщиков, чтобы было единое место, где вы проверяли все инварианты, поэтому мой вопрос относительно этого:

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

Так как у меня довольно много инвариантов, у меня есть EffectBuilder, который создает объекты MagicEffect и проверяет все инварианты.

Можно ли делать что-то подобное в пользовательском классе?

public class User {
// Several attributes and business methods

public MagicEffect publishEffect(final String title, final String content, final Long duration, final Collection<String> elements) [
EffectBuilder builder = new EffectBuilder();

builder.withAuthor(this);
builder.withTitle(title);
builder.withContent(content);
builder.withDuration(duration);
builder.withElements(elements);

return builder.build();
}
};

Или я должен сделать что-то вроде:

public class User {
// Several attributes and business methods

public EffectBuilder publishEffect() [
EffectBuilder builder = new EffectBuilder();

builder.withAuthor(this);

return builder;
}
};

И где-то еще

User user = userRepository.findById(userId);
MagicEffect effect = user.publishEffect().withTitle(title).withContent(content).withDuration(duration).withElements(elements).build();

userRepository.save(user);

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

Какой подход лучше? Есть ли более сбалансированный подход к этому?

Спасибо Pablo

1 Ответ

1 голос
/ 27 сентября 2011

Я думаю, что ваш второй подход лучше.Смысл Builder в том, чтобы избежать большого списка параметров, как у вас в первом примере.Builder не несет ответственности за применение инвариантов в объекте, который он создает.Объект сам их усиливает.Я думаю, что вполне нормально иметь экземпляр EffectBuilder без заголовка или с заголовком по умолчанию.Пока MagicEffect сам обеспечивает "", каждый эффект должен иметь инвариант заголовка .

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