您好我有几个关于领域驱动设计和使用工厂/工厂方法的问题。根据域驱动设计蓝皮书(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% 的时间满足不变量。
哪种方法更好?有没有更平衡的方法呢?
谢谢巴勃罗