美文网首页这事情急不得
贫血模型与充血模型

贫血模型与充血模型

作者: 这事情急不得 | 来源:发表于2019-04-14 00:11 被阅读24次

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的透明持久化支持,那么充血模型还是能够实现的。

选择了.NET平台开发,就是选择了开发高效、功能强大应用简单,最适合的模型就是贫血模型,或表数据入口,既有编译器和语言平台很好的支持,也符合微软提倡的开发模式。如果跟潮流在项目中使用充血模型,现有的ORM工具都很复杂难用,光是维护大量的映射文件都成问题。说贫血不够OO,它的Domain Object不够丰富,能把项目做好了,有一定的扩展能力和伸缩行就行了,也不一定要讲究优雅的面向对象。正如SOA,讲究松耦合、高内聚,服务端给客户端提供的服务,也就是一系列的方法调用加上DTO而已,不管服务的内部是不是面向对象的实现,至少它暴露出来的是过程式的服务。

这些只是我一直以来看到网上的讨论结合开发项目的体会,一家之言,希望大家能说说自己的观点^_^。

PS: 现在虽然有Linq,但是它毕竟只是集成查询的语言,Linq to SQL离ORM还有一段距离,听说ADO.NET Entity Framework将会完美支持领域驱动设计,那也只有明年再看了。

【be_slow 评论】贫血模型和充血模型,be_slow较为偏向于充血模型,因为be_slow觉得基于OO的重构会较为简单,代码更为可读。但是凡事都有个度,充血也要适度,如果Domain Object里加入了过多控制(业务)逻辑,也会造成反效果。

相关文章

  • 贫血模型与充血模型

    Martin Fowler很早以前就写过一篇文章,题目叫"贫血模型"。文章里面批判贫血的领域模型是不够优雅、不够O...

  • 充血模型和贫血模型

    本文系转载,后半段领域模型有点不懂了。。。有空细细磨 Martin Fowler很早以前就写过一篇文章,题目叫”贫...

  • 贫血模型和充血模型

    简述: 一、贫血模型 所谓贫血模型,是指Model 中,仅包含状态(属性),不包含行为(方法),采用这种设计时,需...

  • 贫血模型和充血模型

    前言 作为一个java软件开发人员,从开始学习java开始,都一直在说面向对象,但是在日常开发中,一般的开发人员在...

  • DDD领域驱动设计-充血模型、贫血领域模型

    贫血模型即事务脚本模式 充血模型即领域模型模式 贫血模型 最早广泛应用源于EJB2,最强盛时期则是由Spring创...

  • DDD碎片记录 07. 贫血模型与充血模型的取舍

    和平相处 所以不论是贫血模型还是充血模型,他们各有优缺点,到底应当采用贫血模型还是冲血模型。争执了这么多年,但我认...

  • DDD碎片记录 03. 贫血模型与充血模型

    将业务领域模型转换为程序设计 一般有2种设计思路:贫血模型,充血模型 所谓贫血模型,就是在软件设计中有很多POJO...

  • 关于贫血模型和充血模型

    什么是基于贫血模型的传统开发模式? 对于大部分的后端开发工程师来说,MVC 三层架构都不会陌生。它将整个项目分为三...

  • 初识失血,贫血,充血,胀血四种模型

    领域模型分为4大类:失血模型、贫血模型、充血模型、胀血模型。这类理论都是些软件设计领域的大牛(如Martin Fo...

  • DDD碎片记录 08. 聚合是什么

    将领域模型最终转设计,可以落实到三种类型的对象设计, 服务,2. 实体,3. 值对象, 然后进行贫血模型与充血模型...

网友评论

    本文标题:贫血模型与充血模型

    本文链接:https://www.haomeiwen.com/subject/biyiiqtx.html