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