关于领域模型的设计问题,JavaEye已经组织过n多次大规模讨论,几乎每过一段时期就会出现一次。最近出现了一个新的趋势,Craig Walls在自己的blog上面写一篇文章,介绍如何使用Spring2.0和AspectJ的新特性给domain object注入DAO依赖,即如何实现post-instantiation,请见:
http://jroller.com/page/habuma?entry=spring_2_0_vs_the
与此同时,ajoo也给出了nuts的post-instantiation方案,请见:
http://www.javaeye.com/display/ajoo/Dependency+Injection+For+Rich+Domain+Model
因此,从技术手段来上说,对于Spring/Hibernate架构,Martin的Rich domin model变得可行了,那么让我们看看究竟有哪些领域模型,以及他们的优缺点:
一、失血模型
失血模型请看
http://forum.javaeye.com/viewtopic.php?t=11712
中列举的第一种模型,简单来说,就是domain object只有属性的getter/setter方法,没有任何业务逻辑。
二、贫血模型
贫血模型请看
http://forum.javaeye.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认为的贫血模型在设计模型和实现代码中有很大跨越的说法。一个设计模型到实现的时候,你直接得到两个类:一个实体类,一个控制类就行了,没有什么跨越。
关于领域模型的问题,限于时间原因,暂时不能展开详谈,待有空,写篇更加详细的文章。
原文:http://www.javaeye.com/topic/17579
分享到:
相关推荐
贫血模型or领域模型的举例对比,让你初步了解贫血模型与领域模型的区别和概念
【中国结3D模型】是一种数字化的艺术创作,它将传统中国文化中的中国结元素与现代3D建模技术相结合,使得这种古老的民间艺术得以在虚拟世界中生动呈现。3D模型是一种利用计算机图形学原理,通过专业软件构建的三维...
DDD(领域驱动设计)是一种软件开发方法,它强调以业务领域为中心进行系统设计,通过将复杂的业务逻辑转化为可理解的模型来提升软件质量。在Java环境下,DDD可以帮助开发者更好地理解和实现业务逻辑,提高代码的...
板块模型小结.doc
本书是Eric Evans的《领域驱动模型》一书的精简版,让你在短时间内理解领域驱动设计的内容。这本书没有介绍任何新的概念,它只是概要总结了领域驱动设计的本质, 抽取了Eric Evans原书中关于这一主题的大部分内容,...
领域模型驱动设计domain driver design(PDF)
总的来说,大模型微调是NLP领域的前沿技术,它通过改进预训练模型,使其能够理解和执行人类的自然语言指令,进而提高模型在各种任务中的表现。随着研究的深入,这一技术有望带来更加智能、灵活和实用的AI应用。
krigingmodel_Matlab 是一个基于Matlab实现的Kriging代理模型工具包,它在工程优化、仿真分析和预测等领域中有着广泛的应用。Kriging代理模型是一种统计插值方法,通过构建高斯过程回归模型来逼近复杂函数,以进行...
在IT领域,特别是计算机视觉和深度学习的部分,RVC(Robust Video Captioning)模型是一个重要的研究方向。这个"RVC懒洋洋模型完整版"似乎是一个特定版本的RVC模型,可能由用户“睿智君”开源分享。下面将详细解释...
最后,通过实验验证模型的准确性和泛化能力,并对识别出的垃圾观点文档进行统计和分析,总结出垃圾观点文档的共同特征,这些特征可用于识别新数据集中垃圾观点文档的可能性。在此过程中,还需要讨论如何处理评论中的...
模型算法大全(20+种常用算法模型+代码实现)模型算法大全(20+种常用算法模型+代码实现)模型算法大全(20+种常用算法模型+代码实现)模型算法大全(20+种常用算法模型+代码实现)模型算法大全(20+种常用算法模型+...
AI大模型,又被称为Foundation Model,是人工智能领域的一项重要进展,尤其在深度学习技术的推动下,它成为了通向通用智能的关键步骤。这些大模型的特点在于它们的“大规模”和“预训练”,即在海量的通用数据上进行...
预测控制课程小结是对该课程深入学习和理解的一种体现,它可以分为三个类别:A类、B类和C类。 A类小结要求学生结合个人的研究方向,撰写一个体现预测控制思想的课题工作方案。这可能涉及到将预测控制理论应用到具体...
Phong模型是计算机图形学中一个经典的简单光照模型,由Bui-Tung Phong在1973年提出。这个模型主要用于模拟现实世界中的光照...不过,对于初学者来说,理解并掌握Phong模型是进入计算机图形学和游戏开发领域的基础步骤。
在IT行业中,3D人体骨骼模型是数字艺术、游戏开发、医疗模拟、动画制作等领域的重要资源。这些模型通常由专业的3D建模师通过复杂的软件和技术构建,以便精确地再现人体结构。本压缩包提供了五款不同的3D人体骨骼模型...
人工智能大模型是现代信息技术领域的重要组成部分,其核心目标是构建具有人类智能水平的深度学习模型。这类模型通过处理大规模数据,能够实现自然语言理解、图像识别、自动驾驶等复杂任务,展示了人工智能的巨大潜力...
模型分为多个章节,包括产品域模型、客户域模型、定价域模型、计费事件域模型和账务域模型,以及地域模型等。 在产品域模型中,详细描述了电信产品和服务的各种组件,如产品、产品包、商品、服务提供、动作等实体,...
在IT行业中,尤其是在遥感和地理信息系统(GIS)领域,"土壤水分反演的水云模型"是一个重要的概念。这个模型主要用于分析和估计地表土壤的水分含量,它结合了物理学、数学和遥感技术,为环境监测和农业管理提供了...
在IT领域,特别是系统辨识和信号处理中,递推最小二乘法(Recursive Least Squares, RLS)和模型阶次辨识是两个重要的概念。这篇内容将深入解析这两个主题,并结合F-Test法来阐述如何在实践中应用它们。 递推最小...