论坛首页 Java企业应用论坛

要领域模型干嘛?

浏览 45165 次
该帖已经被评为良好帖
作者 正文
   发表时间:2008-11-27  
一提领域模型帖子的长度就嗖嗖见长,结果还有一些兄弟不知领域模型为何物。
0 请登录后投票
   发表时间:2008-11-27  
qi4j只是一个解决方案而已,不弄清楚问题,就谈solution很困难。每次谈如何更好实现领域模型的时候,就一堆人跳出来大喊,要那玩意干啥,吃力不讨好的东西。OK,那就让大家先发牢骚,再从牢骚中发掘出问题,再谈解决方案。但似乎大家牢骚并不多,还是已经觉得没啥好讨论的了?
stop thinking是很可怕的事情。我过去确实谈过,并不代表没有新的东西。在研究qi4j的过程中,又有了新的体会。还有rails/grails等动态语言的成功。包括做了更多的项目,实践了一些诡异的做法。不过,这篇帖子只谈问题,不谈理想。
0 请登录后投票
   发表时间:2008-11-27  
天下有鹏 写道
一提领域模型帖子的长度就嗖嗖见长,结果还有一些兄弟不知领域模型为何物。

所以我每隔几个月就来扫一次盲嘛。robin应该给我开工资……至少也要授予一个炒冷饭持续不懈奖。
0 请登录后投票
   发表时间:2008-11-27  
kaipingk@gmail.com 写道
谁来给领域模型下个定义阿,据一个例子什么样的代码叫做领域模型.看你们聊了这么久,也到其他地方搜索了一下,都没有找到什么是领域模型!

http://dddsample.sourceforge.net
0 请登录后投票
   发表时间:2008-11-27  
taowen 写道
天下有鹏 写道
一提领域模型帖子的长度就嗖嗖见长,结果还有一些兄弟不知领域模型为何物。

所以我每隔几个月就来扫一次盲嘛。robin应该给我开工资……至少也要授予一个炒冷饭持续不懈奖。


炒冷饭的时候加一些鲍鱼海鲜等等对开发人员大有裨益的思想和实现方法这种冷饭还是应该炒的!
0 请登录后投票
   发表时间:2008-11-27   最后修改:2008-11-27
taowen 写道
downpour 写道
领域模型目前的意义仅仅在于分担一部分无状态的逻辑。

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

downpour 写道

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

就是要比较一下嘛。两者的好处和坏处都是什么。把逻辑都放到领域模型中显然是有好处,不然不会有人推荐。显然也有坏处,不然不会有这么多人反对。我们要发现最根本它是要解决什么问题。从最根本的问题出发,然后再来讨论解决方案的利弊。


我的观点很明确。代码怎么看起来方便怎么写,代码如何更可维护怎么写。

如果你的一个Service方法写了1000行,那么必然其中有很多可以重构的地方,按照我的经验,至少一半可以被重构到你的Domain Object中。那这样,你的主逻辑就变成了500行。500行的可读性是不是要比1000行略有提高呢?

同样如此,如果你的User类有1000行,那么你必然也有很多地方可以重构出来,放到Service中,从而使得你的代码更加清晰。

所以,我认为在Java的世界,你可以运用一切手段和技巧来达到你的目的,这只是一个技巧问题。你可以引入一个框架来把所有的逻辑放在Domain Object中,这没问题,只要你可以接受一个User类几千行。

如果你要讨论这个问题的本质,那就是一个哲学范畴的问题了,估计很难有人可以得出100%正确的答案,这个需要实践。我的目的是提高生产力,让你的代码趋于更加可维护的境地,所以再次重申我的观点:

1)把程序的主逻辑写在Service的方法里面,可以让我看得更明白,也直接符合Java的语法。如果你硬要把程序的主逻辑放到Domain Object中,就需要借助一定的技巧和框架,同时Domain Object就会越来越臃肿。我坚决反对这种做法。

2)在Service代码中抽取一些无状态的逻辑到你的Domain Object中,可以让代码更优雅,可以让Service的主流程更清晰。而这些逻辑被封装在Domain Object中,也可以在各处进行共享,达到代码简洁的目的。

3)任何把所有的逻辑写在一个文件或者一个巨大的方法中的方式,都是我不能接受的。
0 请登录后投票
   发表时间:2008-11-27   最后修改:2008-11-27
能放在domain中的代码与能放在service中的代码是有区别的。如果你只是抽象的说,500行代码,那就没有什么好讨论的了。或者把你所说的无状态的领域逻辑下个定义?我的问题就是什么样的500行代码在domain中,什么样的500行的代码在service中。根本上来说,你把代码写到domain中的动机是什么,只是给你500行代码找个地方放吗?那我建一个xxxHelper,xxxUtils不也一样吗?同样,代码写到service中的动机是什么,为什么要放在那,不能放到别的地方。
0 请登录后投票
   发表时间:2008-11-27  
taowen 写道
nihongye 写道
1.实现与模型的分析结果是一致的,没有额外引进分析过程中不存在的service
2.没service+dao+domain那么死板

第一点很好,也就是Eric Evan所说的ubiquitous language。但是argument可以说,贫血的domain就是已经提供了ubiquitous language中的所有名词。剩下的无非就是一些行为(动词)嘛,那叫commitService还是workflowItem.commit差别不大嘛。我们交谈的时候还是说commit,但是实现不一定要是真的workflowItem支持commit嘛。所以呢,光是这点还站不住脚。
死板不死板,不提供价值。我们要切实地好处。

所谓模型应是名词与动词的集合,动词的附着体应是那些名词,而CommitService引进了一个新名词作为动词的附着体。
0 请登录后投票
   发表时间:2008-11-27  
downpour 写道

1)把程序的主逻辑写在Service的方法里面,可以让我看得更明白,也直接符合Java的语法。如果你硬要把程序的主逻辑放到Domain Object中,就需要借助一定的技巧和框架,同时Domain Object就会越来越臃肿。我坚决反对这种做法。

2)在Service代码中抽取一些无状态的逻辑到你的Domain Object中,可以让代码更优雅,可以让Service的主流程更清晰。而这些逻辑被封装在Domain Object中,也可以在各处进行共享,达到代码简洁的目的。

3)任何把所有的逻辑写在一个文件或者一个巨大的方法中的方式,都是我不能接受的。

充血模型不一定就是把所有逻辑全部写在Domain Object中吧。只是业务逻辑的入口位于Domain Object。具体实现Domain Object可以继续分发。

以前把service顶在了最前端,现在改为Domain Object而已。传统意义上的service完全可以作为普通entity关联到Domain Object里去。
0 请登录后投票
   发表时间:2008-11-27  
taowen 写道
能放在domain中的代码与能放在service中的代码是有区别的。如果你只是抽象的说,500行代码,那就没有什么好讨论的了。或者把你所说的无状态的领域逻辑下个定义?我的问题就是什么样的500行代码在domain中,什么样的500行的代码在service中。根本上来说,你把代码写到domain中的动机是什么,只是给你500行代码找个地方放吗?那我建一个xxxHelper,xxxUtils不也一样吗?同样,代码写到service中的动机是什么,为什么要放在那,不能放到别的地方。


好吧,非要这样说,那我给你用代码举个例子:


// 注销某个用户
public void xxx(User user) {

   // 一大堆其他的逻辑

   // 更改用户状态
   user.setDisable(true);
   user.setLastUpdateDate(new Date());
   user.setLastUpdateBy(this.getCurrentUser());
   
   userDao.update(user);

}



可以改成:


// 注销某个用户
public void xxx(User user) {

   // 一大堆其他的逻辑

   // 更改用户状态  
   user.disable();

   // 如果使用hibernate,可以省略 
   userDao.update(user);

}




// 注销某个用户
public void disable() {
    this.setDisable(true);
    this.setLastUpdateDate(new Date());
}



这样你觉得是否满意?
0 请登录后投票
论坛首页 Java企业应用版

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