Martin Fowler很早以前就写过一篇文章,题目叫"贫血模型"。文章里面批判贫血的领域模型是不够优雅、不够OO的,提倡使用充血的领域模型。在Java世界里这是一直争论的话题。到底什么是贫血什么是充血呢?
贫血模型:是指领域对象里只有get和set方法,或者包含少量的CRUD方法,所有的业务逻辑都不包含在内而是放在Business Logic层。
优点是系统的层次结构清楚,各层之间单向依赖,Client->(Business Facade)->Business Logic->Data Access(ADO.NET)。当然Business Logic是依赖Domain Object的。似乎现在流行的架构就是这样,当然层次还可以细分。
该模型的缺点是不够面向对象,领域对象只是作为保存状态或者传递状态使用,所以就说只有数据没有行为的对象不是真正的对象。在Business Logic里面处理所有的业务逻辑,在POEAA(企业应用架构模式)一书中被称为Transaction Script模式。
充血模型:层次结构和上面的差不多,不过大多业务逻辑和持久化放在Domain Object里面,Business Logic只是简单封装部分业务逻辑以及控制事务、权限等,这样层次结构就变成Client->(Business Facade)->Business Logic->Domain Object->Data Access。
优点是面向对象,Business Logic符合单一职责,不像在贫血模型里面那样包含所有的业务逻辑太过沉重。
缺点是如何划分业务逻辑,什么样的逻辑应该放在Domain Object中,什么样的业务逻辑应该放在Business Logic中,这是很含糊的。即使划分好了业务逻辑,由于分散在Business Logic和Domain Object层中,不能更好的分模块开发。熟悉业务逻辑的开发人员需要渗透到Domain Logic中去,而在Domian Logic又包含了持久化,对于开发者来说这十分混乱。 其次,因为Business Logic要控制事务并且为上层提供一个统一的服务调用入口点,它就必须把在Domain Logic里实现的业务逻辑全部重新包装一遍,完全属于重复劳动。
如果技术能够支持充血模型,那当然是最完美的解决方案。不过现在的.NET框架并没有ORM工具(不算上开源的NHibernate,Castle之类),没有ORM就没有透明的持久化支持,在Domain Object层会对Data Access层构成依赖,如果脱离了Data Access层,Domain Object的业务逻辑就无法进行单元测试,这也是很致命的。如果有像Spring的动态注入和Hibernate的透明持久化支持,那么充血模型还是能够实现的。
通过实际的例子来表述就很简单了。以我的诗篇在线建站系统来说,如果site对象仅仅具有getter和setter方法,那就是贫血的。如果site对象里面加入:site.getSection(int sid),site.findSection(String sectionname),site.getArticlePage(int pn),site.getArticleByFlag(string flag,int pn)。这样一来就变成充血的了。比如你有一个util函数,将你的对象作为参数来完成必要的功能,这样的对象往往是贫血的,如果你可以直接命令对象完成任务,往往是充血的。
只做数据存储的模型就是贫血的,如果牵扯到业务逻辑活着数据库交互,就算充血的。
分享到:
相关推荐
失血模型简单来说,就是domain object只有属性的getter/setter方法的纯数据类,所有的业务逻辑完全由business object来完成(又称TransactionScript),这种模型下的domain object被Martin Fowler称之为“贫血的domain...
本文解释了当今比较新的设计模式中的贫血和充血模式。对加深理解二模型很有帮助!
贫血模型or领域模型的举例对比,让你初步了解贫血模型与领域模型的区别和概念。附加一个自己创建的代码范例
第一点原因是,大部分情况下,我们开发的系统业务可能都比较简单,简单到就是基于 第二点原因是,充血模型的设计要比贫血模型更加有难度 第三点原因是,思维已固化,转型
NULL 博文链接:https://melin.iteye.com/blog/716507
基于GO的六边形架构框架,可支撑充血的领域模型范式代码实现
(1)每一个数据库表对应创建一个类,类的每一个对象实例对应于数据库中表 (2)领域对象同事封装了业务逻辑 (3)领域对象同时负责数据持久化,在其中封装对数据库的
视频教程
微服务架构首先要关注的不是RPC/ServiceDiscovery/Circuit Breaker这些概念,也不是Eureka/Docker/SpringCloud/Zipkin这些技术框架,而是服务的边界、职责划分,划分错误就会陷入大量的服务...• 充血模型 • 事件驱动
食管黏膜恶性平坦型充血性病变.docx
如果领域模型只是用来处理简单的逻辑(比如贫血模型),那么领域模型的作用微乎其微,甚至可以忽略,数据转换的成本比领域模型带来的好处还多,这种情况其实就是在原有的分层架构中多加了一层,增加了项目的复杂性和...
充血性心力衰竭急诊治疗.ppt
全身性炎症反应综合征(SIRS)是伴发状态之一,可加重充血性心力衰竭(CHF)的严重程度并使难治性CHF转向常规治疗。 我们调查了SIRS症状和体征的停止是否会阻止兔慢性主动脉瓣狭窄引起的CHF进展。 冠状动脉左降支...
充血性心力衰竭的急诊治疗.pptx
充血性心力衰竭急诊治疗剖析.ppt
充血性心力衰竭的急诊治疗概况.pptx
火龙果软件工程技术中心 对于领域模型这个概念,以前没有系统性的认识,只是根据经验,在设计系统时自发的在使用....domainobject3、充血模型Service(事务封装)--->domainobject<--->DAO4、胀血模
贫血模型的优缺点? DDD提倡的充血模型是什么? 体会下充血模型开发微信钱包系统 聚合和聚合根是什么? 领域事件是什么? 看看领域事件的本质(解耦,异步,削峰) 工厂和资源库的作用? 领域服务是什么? 通过用例...
行业分类-物理装置-一种人眼充血检测装置
自动化腹膜透析治疗尿毒症伴充血性心衰的临床应用.pdf