1

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

假设我正在开发一个魔术管理器应用程序,您可以在其中对魔术效果进行类似 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% 的时间满足不变量。

哪种方法更好?有没有更平衡的方法呢?

谢谢巴勃罗

4

1 回答 1

1

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

于 2011-09-27T16:54:08.743 回答