2011-09-27 75 views
1

嗨我有几个关于域驱动设计和使用工厂/工厂方法的问题。 %的领域驱动设计蓝皮书(埃里克·埃文斯书)就指出,复杂的构造函数应该内工厂/工厂方法/建设者封装所以,你检查所有的不变量一致的地方,所以我的问题是关于这个:DDD和工厂

比方说,我开发一个神奇的组织程序,您可以进行CRUD像魔法效果的操作(比如在博客+几个属性般的效果持续时间,使用的材料后的字符串(列表)与魔法效果有关,行话)一些不变式是魔法效果必须始终有一个标题,魔术效果的内容,持续时间和可选的模式,并且必须由在应用程序中注册的用户发布。

所以,因为我有好几个不变量我有一个建立MagicEffect对象和检查所有的不变量一EffectBuilder。

是否确定这样做的用户类?

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

我认为你的第二个方法是更好的。 Builder的全部意义在于避免像第一个例子中那样的大量参数。构建器不负责在构建的对象中实施不变量。对象本身强制执行它们。我认为没有标题或缺省标题的EffectBuilder的实例是完全正确的。只要MagicEffect本身执行'每个效果应该有一个标题'不变。

+0

是的,我因子评分的,太多,但我觉得用第二种方法就像我,告诉我做什么我其实没有做。 我的意思是代码表示用户发布了一个效果,但是直到客户端在返回的EffectBuilder上调用构建方法时才会创建效果。 但我会采用这种方法避免长参数列表。 –

+0

也许* publishEffect *责任不属于一个用户对象。 – Dmitry

+0

事实上,将Builder(标题,内容等)作为参数传递给* publishEffect *可能会更好。 – Dmitry