`
rmzdb
  • 浏览: 83058 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

再次小结领域模型的种种观点

 
阅读更多

关于领域模型的设计问题,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

分享到:
评论

相关推荐

    领域模型代码示例

    领域驱动设计(Domain-Driven Design,简称DDD)是一种软件开发方法,它强调通过与领域专家紧密合作,将复杂的业务逻辑转化为可执行的软件模型。在本示例中,"领域模型代码示例"是一个用于展示DDD实践的演示项目,...

    DDD领域设计模式代码案例

    DDD(领域驱动设计)是一种软件开发方法,它强调以业务领域为中心进行系统设计,通过将复杂的业务逻辑转化为可理解的模型来提升软件质量。在Java环境下,DDD可以帮助开发者更好地理解和实现业务逻辑,提高代码的...

    3dMax2020中国结模型下载

    《3dMax2020中国结模型:深入解析与应用》 3dMax,作为全球广泛应用的三维建模和动画软件,一直以来都是设计师们的得力工具。2020版的3dMax更是集成了许多创新功能和优化,使得模型创建、渲染和动画制作更加高效。...

    RVC懒洋洋模型完整版

    在IT领域,特别是计算机视觉和深度学习的部分,RVC(Robust Video Captioning)模型是一个重要的研究方向。这个"RVC懒洋洋模型完整版"似乎是一个特定版本的RVC模型,可能由用户“睿智君”开源分享。下面将详细解释...

    AI大模型ppt介绍总结了大模型的参数的规模、算力、精度以及发展等各方面情况

    AI大模型,又被称为Foundation Model,是人工智能领域的一项重要进展,尤其在深度学习技术的推动下,它成为了通向通用智能的关键步骤。这些大模型的特点在于它们的“大规模”和“预训练”,即在海量的通用数据上进行...

    基于深度学习和CRF的新闻文章的观点提取.pdf

    本文提出的基于深度学习和CRF的新闻文章的观点提取模型可以有效地提高观点提取的准确度,对于新闻报道中的观点提取具有重要的参考价值。 技术要点: * 深度学习技术在自然语言处理领域中的应用 * CRF模型在观点...

    【3D模型】webGL人体3D动态模型

    在"3D人物模型"的领域中,WebGL被广泛用于创建逼真的角色动画,包括人体动作模拟。在这个"webGL_walker"项目中,开发人员可能利用骨骼动画技术来驱动人体模型的动作,这种技术是通过将3D模型的各个部分与虚拟骨骼...

    姜启源《数学模型》

    数学模型是现代科学技术领域不可或缺的一个工具,它通过抽象和简化的数学形式,能够帮助我们理解和模拟各种复杂现象。随着科学技术的飞速发展,数学模型已广泛应用于电气工程、气象预报、生理医学、城市规划、生产和...

    人工智能大模型介绍.pptx

    人工智能大模型是现代信息技术领域的重要组成部分,其核心目标是构建具有人类智能水平的深度学习模型。这类模型通过处理大规模数据,能够实现自然语言理解、图像识别、自动驾驶等复杂任务,展示了人工智能的巨大潜力...

    基于DDD领域驱动设计通用后台权限系统开发

    1. **领域模型(Domain Model)**:领域模型是业务规则和业务逻辑的载体,它是对特定业务领域的抽象。在后台权限系统中,领域模型可能包括用户、角色、权限、组织结构等实体和值对象。 2. **聚合(Aggregate)**:...

    递推最小二乘法(RLS)及模型阶次辨识(F-Test)

    在IT领域,特别是系统辨识和信号处理中,递推最小二乘法(Recursive Least Squares, RLS)和模型阶次辨识是两个重要的概念。这篇内容将深入解析这两个主题,并结合F-Test法来阐述如何在实践中应用它们。 递推最小...

    F117feko模型文件

    在雷达散射截面积(Radar Cross Section, RCS)的研究领域中,F117feko模型文件是一个重要的工具,它基于先进的电磁仿真软件feko 5.5,专门用于分析F117隐形战斗机的RCS特性。F117战机以其卓越的隐形性能而闻名,而...

    纯电动汽车SIMULINK模型(包括驾驶员模型. 电池模型. 电机模型. 车辆和轮胎动力学模型等).zip

    这个模型集成了驾驶员模型、电池模型、电机模型以及车辆和轮胎的动力学模型,为研究和开发电动汽车控制系统提供了强大的平台。 驾驶员模型在SIMULINK中模拟了人类驾驶员对车辆的操作,例如油门踏板的踩踏深度和刹车...

    Solidworks 3D 人体模型

    这是一款专为设计师和工程师准备的1:1女性3D模型,适用于 SolidWorks 2009 及其后续版本,模型尺寸严格参照了国标GB-1988,确保了精确的比例和尺寸,为人体工程学、服装设计、医疗模拟、工业设计等多个领域提供了...

    卡通小博士3D模型(带贴图和动作),fbx格式

    在游戏开发领域,3D模型是至关重要的组成部分,它们为虚拟世界提供了视觉表现力和交互性。本资源“卡通小博士3D模型(带贴图和动作),fbx格式”是一个专为学习和制作游戏而设计的3D角色模型,具有高度的通用性和...

    基于MATLAB的电弧仿真模型(Mayr/Cassie 电弧模型)

    利用Matlab/Simulink对两种电弧模型(Mayr和Cassie电弧模型)进行了仿真。基于模型可分析模型参数对输出波形的影响,验证与实际故障电弧的相似度,对故障电弧保护装置的设计和研制起到积极作用。Cassie和Mayr电弧模型...

    three官网glb模型.rar

    2. **教育**:通过3D模型进行直观的教学,如生物学、地理学和工程学等领域。 3. **游戏开发**:构建逼真的游戏环境和角色,增强玩家沉浸感。 4. **建筑可视化**:帮助客户预览建筑设计和室内设计。 5. **VR/AR**:...

    Creator模型flt文件

    Creator是一款强大的3D建模与设计软件,被广泛应用于游戏开发、虚拟现实、建筑设计等多个领域。在本压缩包中,"黄石作业3"这个文件可能是用户分享的一个Creator制作的3D模型项目,包含了模型数据以及相关的纹理贴图...

Global site tag (gtag.js) - Google Analytics