论坛首页 Java企业应用论坛

要领域模型干嘛?

浏览 45162 次
该帖已经被评为良好帖
作者 正文
   发表时间:2008-11-27  
yananay 写道
说说个人的理解吧。

领域模型,我觉得更大的用途是在分析阶段,而不是在实现阶段。而 ddd,更重要的是帮助你如何去理解业务,分析业务。

实现?对于应用软件来说,复杂度是有的,但是通常情况下并不那么复杂,复杂的是业务,所以,在分析阶段引入领域模型是非常有意义的。

至于楼主讨论的实现方式,我觉得没什么意义,这个冷饭炒得没前几次好。“到底用什么好”->是一个没有答案的问题,不同的场合,不同的规模,会有不同的实现方式。


顺着你的意思,我的理解是设计阶段就可以不管领域模型了。那分析和设计之间的鸿沟你怎么去填平?
0 请登录后投票
   发表时间:2008-11-27  
我认为领域模型很重要,DDD开发是我觉得最爽的开发方式,个人口味而已
0 请登录后投票
   发表时间:2008-11-27  
downpour 写道
领域模型目前的意义仅仅在于分担一部分无状态的逻辑。

是的,这是现状。你对于现状的陈述我完全同意。

downpour 写道

搞点复杂的逻辑,真正去写一个系统,试试看把所有的逻辑都放到领域模型中,或者把所有的逻辑全放在Service中,然后再比较一下,怎么写比较好,这样不就能得出结论了嘛。

就是要比较一下嘛。两者的好处和坏处都是什么。把逻辑都放到领域模型中显然是有好处,不然不会有人推荐。显然也有坏处,不然不会有这么多人反对。我们要发现最根本它是要解决什么问题。从最根本的问题出发,然后再来讨论解决方案的利弊。
0 请登录后投票
   发表时间:2008-11-27   最后修改:2008-11-27
ronghao 写道
抛出异常的爱 写道
写代码方便
与看代码方便

本身是矛盾的.....

但有些人非要把写代码不方便,
看着也不方便的东西当流行.......非常不适应.


好像领域就比非领域好似的.
不领域就该死一样

其实是一种习惯的问题,当你适应了充血的模型,让你回到贫血下的编程你会感到很不方便。反过来同理。

其实两者可以都解决问题。

写代码方便与看代码方便本身没有任何矛盾。


写结构化的代码一定会比面向oo的代码快.....
oo的代码比结构化的码好懂
速度上你还要加上oo设计时间才能算数
0 请登录后投票
   发表时间:2008-11-27  
fnet 写道
我觉得根据业务需求吧

过于复杂的需求还是用贫血

一般需求用充血

说实话我是喜欢用充血,而这方面ROR里的model做的最好。

充血的model的确更有意义,并且更方便。

你说要领域模型干嘛?可以去比较一下国内的一些面向过程的PHP的CMS,看看如果没有领域模型,是什么样的情况。

为什么复杂的要用贫血呢?
0 请登录后投票
   发表时间:2008-11-27  
Quake Wang 写道
ray_linn 写道

我建议用C#的扩展方法,或者Java用mimix(不知道打错没有),Domain还是POJO,方法在适当的时候“黏合”(C#通过namespace引用)到POJO上,让POJO “充血”,而在充当VO,DTO的时候,POJO又可以“放血”回到“贫血的”状态上。

好处:

1。模型简单。
2。可测试性强。

用mixin实现领域模型是最简洁的做法, 但是受到Java语言的限制,得用大量mark性质的interface和composite模式,反而会让整个结构变得复杂。
相比C#的namespace或ruby自定义dsl(acts_as_xxx),在java玩领域模型需要更多的功力,推荐一下Rickard Öberg的qi4j,它将composite oriented发挥到了极致:
http://www.qi4j.org/

我挖了这么大的一个坑,就是为了把qi4j引出来。唉,这下就没什么玩的了。
0 请登录后投票
   发表时间:2008-11-27   最后修改:2008-11-27
taowen 写道
Quake Wang 写道
ray_linn 写道

我建议用C#的扩展方法,或者Java用mimix(不知道打错没有),Domain还是POJO,方法在适当的时候“黏合”(C#通过namespace引用)到POJO上,让POJO “充血”,而在充当VO,DTO的时候,POJO又可以“放血”回到“贫血的”状态上。

好处:

1。模型简单。
2。可测试性强。

用mixin实现领域模型是最简洁的做法, 但是受到Java语言的限制,得用大量mark性质的interface和composite模式,反而会让整个结构变得复杂。
相比C#的namespace或ruby自定义dsl(acts_as_xxx),在java玩领域模型需要更多的功力,推荐一下Rickard Öberg的qi4j,它将composite oriented发挥到了极致:
http://www.qi4j.org/

我挖了这么大的一个坑,就是为了把qi4j引出来。唉,这下就没什么玩的了。


我觉得倒不是java玩领域需要更多功利,而是java需要更多进化。

C# 4.0之后,有了扩展方法和dynamic这两个利器,用充血就Easy了。 Qi4j仍然稍觉麻烦。

如果C# 能跨平台,真的是很相当完美。
0 请登录后投票
   发表时间:2008-11-27  
题外:Qi4j的logo我喜欢--- 不是咖啡是“拉面!”
0 请登录后投票
   发表时间:2008-11-27  
downpour 写道
领域模型目前的意义仅仅在于分担一部分无状态的逻辑。

对于一个User来说,它的内部你可以封装一些你认为他可以具备的逻辑,但是这些逻辑都是无状态的,也就是与实例无关。比如说:

// 标志当前user不可用
public void disable() {
     this.disabled = true;
}

// 验证是否有效
public boolean authenticate(String password) {
     return this.password.equals(password);
}



我从来认为UserService这个东西是不可少的。只是说,如果把所有的逻辑全部放在UserService中,你的UserService会过于臃肿而不易于维护,把一些无状态的逻辑封装在User中,可以让UserService更加清晰,同时这些逻辑可能会在很多个其他的Service中共享。

至于说到持久化操作,无论是查询还是保存,我们都把相应的逻辑写在Service中吧,否则,User也会变得不可维护。事实上,所谓的把持久化操作,包括查询,修改,保存,都放在领域模型中,只不过是技术上的技巧,并没有在代码上给我们带来质的飞跃。

搞点复杂的逻辑,真正去写一个系统,试试看把所有的逻辑都放到领域模型中,或者把所有的逻辑全放在Service中,然后再比较一下,怎么写比较好,这样不就能得出结论了嘛。


你的无状态的逻辑是如何定义的?
0 请登录后投票
   发表时间:2008-11-27  
ray_linn 写道
题外:Qi4j的logo我喜欢--- 不是咖啡是“拉面!”

官方说法是一碗米饭,设计logo的人是马来西亚人。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics