锁定老帖子 主题:要领域模型干嘛?
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-01-02
robbin 写道 to lifethinker:
1、我从来没有说过包含了持久化逻辑的领域模型就是充血的,不包含持久化逻辑的领域模型就是贫血的。这是你给我扣的一顶帽子,我不是这样划分的。 2、我理解的充血模型是包含了业务逻辑的领域模型,当然绝大多数情况下领域模型的业务逻辑往往要依赖持久化逻辑。而持久化逻辑可以放在领域模型里面(例如RoR),也可以不放在领域模型里面(例如使用DAO接口) 3、在我的定义里面,如果把持久化逻辑和业务逻辑统统放在领域模型里面,我命名为“胀血模型”。 4、Martin Fowler的充血领域模型是包含业务逻辑,但是不包含持久化逻辑的,领域模型需要注入DAO接口,反过来DAO接口方法参数又需要领域模型,形成了双向循环依赖,因此从Spring/Hibernate框架的编码实现角度来说,我对这种实现持反对态度。 5、JBoss Seam进步体现在完全消除了DAO层,也消除Transaction层的存在,你看到的就是entity bean和business bean。当你把一个entitybean和他的business bean放在一起看待的时候,这就是一个不折不扣的充血领域模型。(Gavin King本人反对进一步把entity和business bean合并,这次他前年来上海的时候对我们说的) 6、考虑到Java语言本身的表达能力的局限性,我不认为胀血模型适合Java,往往RoR的model可以一两行DSL表达的业务逻辑,用Java就要几十行,所以Seam框架限定的模型用法我认为对Java领域模型,已经是最佳实践了。 使用Spring和Hibernate其实也可以基本上消除DAO层,将事务控制这一部分提到Application Service这一层来进行控制,当然一些复杂的查询这些需要写在Repository中,Repository本就是与数据库这些infrastructure相交互的 |
|
返回顶楼 | |
发表时间:2009-01-06
这几天也是对领域模型迷惑了,在论坛上看了一些讨论,结合自己的认识说一下:
其实领域模型定义了一个起点,让你整理领域中的知识,进而模型,而随着对领域的认识加深,以前的领域模型肯定有不适合的,这就可能需要调整,也就可能是变化的需求,其实感觉需求没有变化,而是种种原因我们没有认识清晰,看看DDD那本书,上面更多都是在讲浮现更合适的领域模型。 另外充血也好,贫血也罢,都是根据实际情况,关键是要认清领域中的知识,就是有一样,使用贫血模型,可能导致事务脚本,这样在领域(知识)模型的进化的过程中可能就是有害的。对于贫血和充血,不要仅仅站在数据角度看,如果光看数据,我们也就是在折腾应用的状态。这也就是网友所说的还有流程,不仅如此,我认为还应该有规则。 再者就是对于领域模型的讨论,无一例外都要说到持久,因为这个似乎成了一个绕不过去的坎,我们想隔离实际的领域对象,但是最重要的基础设施的代码持久在干扰你,有框架的问题,也有概念的问题,这一点感觉在j2ee core pattern中倒是有点到。 最后就是重构,其实重构这个玩意,martin大叔开了头,但那本书重构的书名副标题就告诉了你重构的层次,是基于代码的,消除代码上的坏味道,后来有人写重构和模式,提出了更高层次的重构,想着模式的目标走,找到合适的模式来改善设计,再后来DDD中的算是把重构总结了一下,最高境界是向着模型走,浮现好的描述领域知识的模型,而且特意写了一章说突破,不过回过头来看看重构,我们确实这样走过来的,代码改善,引入模式,模式解耦,浮现模型。 我们坚持领域模型说白了就是三层架构和OO。 |
|
返回顶楼 | |
发表时间:2009-01-12
最后修改:2009-01-13
wangyugod 写道 robbin 写道 to lifethinker:
1、我从来没有说过包含了持久化逻辑的领域模型就是充血的,不包含持久化逻辑的领域模型就是贫血的。这是你给我扣的一顶帽子,我不是这样划分的。 2、我理解的充血模型是包含了业务逻辑的领域模型,当然绝大多数情况下领域模型的业务逻辑往往要依赖持久化逻辑。而持久化逻辑可以放在领域模型里面(例如RoR),也可以不放在领域模型里面(例如使用DAO接口) 3、在我的定义里面,如果把持久化逻辑和业务逻辑统统放在领域模型里面,我命名为“胀血模型”。 4、Martin Fowler的充血领域模型是包含业务逻辑,但是不包含持久化逻辑的,领域模型需要注入DAO接口,反过来DAO接口方法参数又需要领域模型,形成了双向循环依赖,因此从Spring/Hibernate框架的编码实现角度来说,我对这种实现持反对态度。 5、JBoss Seam进步体现在完全消除了DAO层,也消除Transaction层的存在,你看到的就是entity bean和business bean。当你把一个entitybean和他的business bean放在一起看待的时候,这就是一个不折不扣的充血领域模型。(Gavin King本人反对进一步把entity和business bean合并,这次他前年来上海的时候对我们说的) 6、考虑到Java语言本身的表达能力的局限性,我不认为胀血模型适合Java,往往RoR的model可以一两行DSL表达的业务逻辑,用Java就要几十行,所以Seam框架限定的模型用法我认为对Java领域模型,已经是最佳实践了。 使用Spring和Hibernate其实也可以基本上消除DAO层,将事务控制这一部分提到Application Service这一层来进行控制,当然一些复杂的查询这些需要写在Repository中,Repository本就是与数据库这些infrastructure相交互的 Repository 也是领域模型的一部分吧,如果使用spring/hibernate,最终的结果是否还是会造成领域模型会依赖这些对象的结果。要想完全消除,很难。如果不考虑spring,应该容易很多。 |
|
返回顶楼 | |
发表时间:2009-02-27
好长的贴.
对于流程类的逻辑,查一下,删一下,发条短信这样流程类的逻辑,我觉得写在service层挺好. 对于业务规则,可以尽可能的放在domain里. 不知道大家看过jBPM的代码没有,个人认为,那个已经是很好的范例进行面向domain的代码了.不过,毕竟jBPM跟我们做的系统类型不一样,不过借鉴一下还是可以的. 望指正. |
|
返回顶楼 | |
发表时间:2009-06-18
给领域对象分配职责,各领域对象各尽其责,各肆其职,易于复用、扩展,便于维护、理解。
掌握行业的领域模型,就可以靠咨询、做顾问为生,大可不必去做开发。 |
|
返回顶楼 | |
发表时间:2009-06-19
最后修改:2009-06-19
robbin 写道 to lifethinker:
1、我从来没有说过包含了持久化逻辑的领域模型就是充血的,不包含持久化逻辑的领域模型就是贫血的。这是你给我扣的一顶帽子,我不是这样划分的。 2、我理解的充血模型是包含了业务逻辑的领域模型,当然绝大多数情况下领域模型的业务逻辑往往要依赖持久化逻辑。而持久化逻辑可以放在领域模型里面(例如RoR),也可以不放在领域模型里面(例如使用DAO接口) 3、在我的定义里面,如果把持久化逻辑和业务逻辑统统放在领域模型里面,我命名为“胀血模型”。 4、Martin Fowler的充血领域模型是包含业务逻辑,但是不包含持久化逻辑的,领域模型需要注入DAO接口,反过来DAO接口方法参数又需要领域模型,形成了双向循环依赖,因此从Spring/Hibernate框架的编码实现角度来说,我对这种实现持反对态度。 5、JBoss Seam进步体现在完全消除了DAO层,也消除Transaction层的存在,你看到的就是entity bean和business bean。当你把一个entitybean和他的business bean放在一起看待的时候,这就是一个不折不扣的充血领域模型。(Gavin King本人反对进一步把entity和business bean合并,这次他前年来上海的时候对我们说的) 6、考虑到Java语言本身的表达能力的局限性,我不认为胀血模型适合Java,往往RoR的model可以一两行DSL表达的业务逻辑,用Java就要几十行,所以Seam框架限定的模型用法我认为对Java领域模型,已经是最佳实践了。 To robbin: 关于第1点,你真的说过,下文引自你的另一个贴子. 我个人很赞同lifethinker的说法,你确实在认定充血贫血时过分强调了持久化. 你还有一个观点就是:用了ROR就必然充血,用了Spring就很难充血,这些应该都是和你这个认识是直接相关的. ------------------------------------------ http://www.iteye.com/topic/17579 二、贫血模型 贫血模型请看 http://forum.iteye.com/viewtopic.php?t=11712 中列举的第二种模型,简单来说,就是domain ojbect包含了不依赖于持久化的领域逻辑,而那些依赖持久化的领域逻辑被分离到Service层。 Service(业务逻辑,事务封装) --> DAO ---> domain object 这种模型的优点: 1、各层单向依赖,结构清楚,易于实现和维护 2、设计简单易行,底层模型非常稳定 这种模型的缺点: 1、domain object的部分比较紧密依赖的持久化domain logic被分离到Service层,显得不够OO 2、Service层过于厚重 |
|
返回顶楼 | |
发表时间:2009-06-19
To robbin:
还是那个贴子里,你给出了贫血充血的认定标准. --------------------------------------- 贫血模型中我提出的按照是否依赖持久化进行划分,这种标准是非常确定的, |
|
返回顶楼 | |