最近看了robbin关于再次小结领域模型的种种观点 的大作 摘抄如下:
一、失血模型
失血模型请看
http://forum.iteye.com/viewtopic.php?t=11712
中列举的第一种模型,简单来说,就是domain object只有属性的getter/setter方法,没有任何业务逻辑。
二、贫血模型
贫血模型请看
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层过于厚重
三、充血模型
充血模型和第二种模型差不多,所不同的就是如何划分业务逻辑,即认为,绝大多业务逻辑都应该被放在domain object里面(包括持久化逻辑),而Service层应该是很薄的一层,仅仅封装事务和少量逻辑,不和DAO层打交道。
Service(事务封装) ---> domain object <---> DAO
这种模型的优点:
1、更加符合OO的原则
2、Service层很薄,只充当Facade的角色,不和DAO打交道。
这种模型的缺点:
1、DAO和domain object形成了双向依赖,复杂的双向依赖会导致很多潜在的问题。
2、如何划分Service层逻辑和domain层逻辑是非常含混的,在实际项目中,由于设计和开发人员的水平差异,可能导致整个结构的混乱无序。
3、考虑到Service层的事务封装特性,Service层必须对所有的domain object的逻辑提供相应的事务封装方法,其结果就是Service完全重定义一遍所有的domain logic,非常烦琐,而且Service的事务化封装其意义就等于把OO的domain logic转换为过程的Service TransactionScript。该充血模型辛辛苦苦在domain层实现的OO在Service层又变成了过程式,对于Web层程序员的角度来看,和贫血模型没有什么区别了。
四、胀血模型
基于充血模型的第三个缺点,有同学提出,干脆取消Service层,只剩下domain object和DAO两层,在domain object的domain logic上面封装事务。
domain object(事务封装,业务逻辑) <---> DAO
似乎ruby on rails就是这种模型,他甚至把domain object和DAO都合并了。
该模型优点:
1、简化了分层
2、也算符合OO
该模型缺点:
1、很多不是domain logic的service逻辑也被强行放入domain object ,引起了domain ojbect模型的不稳定
2、domain object暴露给web层过多的信息,可能引起意想不到的副作用。
在这四种模型当中,失血模型和胀血模型应该是不被提倡的。而贫血模型和充血模型从技术上来说,都已经是可行的了。但是我个人仍然主张使用贫血模型。其理由:
1、参考充血模型第三个缺点,由于暴露给web层程序拿到的还是Service Transaction Script,对于web层程序员来说,底层OO意义丧失了。
2、参考充血模型第三个缺点,为了事务封装,Service层要给每个domain logic提供一个过程化封装,这对于编程来说,做了多余的工作,非常烦琐。
3、domain object和DAO的双向依赖在做大项目中,考虑到团队成员的水平差异,很容易引入不可预知的潜在bug。
4、如何划分domain logic和service logic的标准是不确定的,往往要根据个人经验,有些人就是觉得某个业务他更加贴近domain,也有人认为这个业务是贴近service的。由于划分标准的不确定性,带来的后果就是实际项目中会产生很多这样的争议和纠纷,不同的人会有不同的划分方法,最后就会造成整个项目的逻辑分层混乱。这不像贫血模型中我提出的按照是否依赖持久化进行划分,这种标准是非常确定的,不会引起争议,因此团队开发中,不会产生此类问题。
5、贫血模型的domain object确实不够rich,但是我们是做项目,不是做研究,好用就行了,管它是不是那么纯的OO呢?其实我不同意firebody认为的贫血模型在设计模型和实现代码中有很大跨越的说法。一个设计模型到实现的时候,你直接得到两个类:一个实体类,一个控制类就行了,没有什么跨越。
下面就项目中的应用具体对比下:
我们现在做的一个项目 有存在冲突: 一方是要求采用胀血模型 另一方是要求采用贫血模型 。 关于这两两种的模型的优缺点。。。后续
分享到:
相关推荐
论文基于相关数据利用CCR模型与BCC模型计算我国各区域的工业生态效率,实证分析结果表明,目前我国各区域的工业生态效率已经呈现出明显的梯度发展状态,这一结论与依据广义梯度推移理论分析得出的观点相符....
在本文中,作者提出了一个重要的观点,即在带有删失因变量的模型中,回归变量不必限制于标准渐近结果的应用。也就是说,即便在删失数据存在的复杂情况下,回归变量仍然可以呈现增长的趋势,并且这种增长是可接受的。...
- **研究兴趣**:目前专注于计算机体系结构、分子模型绘图和虚拟环境等领域的教学和研究。 #### 二、《人月神话》概述 - **书籍背景**:《人月神话》是软件工程领域的经典之作,首次出版于1975年,至今仍受到广泛...
综上所述,语言型群决策中群体一致性赋权优化模型研究不仅是对群决策理论的深化和发展,也是对实际群决策过程中遇到的种种问题进行有效解决的探索。通过结合语言评价矩阵和智能优化算法,旨在为群决策提供更为可靠和...
在 20 世纪 50 年代初期,就有人开始发表从工程观点研究最短时间控制问题的文章,尽管其最优性的证明多半借助于几何图形,仅带有启发性质,但毕竟为发展现代控制理论提供了第一批实际模型。由于最优控制问题引人注目...
机器人是一种用于移动各种材料、零件、工具、或专用装置,通过可编程动作来执行种种任务并具有编程能力的多功能机械手。机器人的主要特征包括: 1. 机器人的动作结构具有类似于人或其他生物体某些器官(肢体、感官...
报告中还提到了资产定价模型,以及在此基础上进行的稳健性检验,包括使用资产定价模型和FF因子载荷(Fama-French three-factor model)等,这些都是在金融工程领域常用的工具和方法,有助于评估不同投资策略的可行性...
文章标题为《The Good, The Bad, and the Ugly, The UNIX Legacy》,副标题为“专家观点:UNIX的美与丑!”这份文档由贝尔实验室的罗布·派克(Rob Pike)撰写,他在文中探讨了UNIX操作系统的发展历程及其对现代计算...