DDD和工厂

时间:2011-09-27 13:05:19

标签: domain-driven-design factory builder fluent invariants

您好我有一些关于域驱动设计和使用工厂/工厂方法的问题。 根据领域驱动设计蓝皮书(Eric EVan的书),它指出复杂的构造函数应该封装在工厂/工厂方法/构建器中,因此有一个一致的位置来检查所有不变量,所以我的问题是这样的:

假设我正在开发一个魔术组织器应用程序,您可以在其中对魔术效果进行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%的时间都能确保不变量。

哪种方法比较好?是否有更平衡的做法?

由于 巴勃罗

1 个答案:

答案 0 :(得分:1)

我认为你的第二种方法更好。 Builder的重点是避免在第一个示例中使用大量参数。 Builder不负责在其构建的对象中强制实施不变量。对象本身强制执行它们。我认为拥有EffectBuilder没有标题或默认标题的实例是完全没问题的。只要MagicEffect本身强制执行'每个效果都应该有一个标题'不变。