贫血模型和充血模型
来源:互联网 发布:不动声色的大人了 知乎 编辑:程序博客网 时间:2024/03/29 06:41
贫血模型和充血模型
分类: DESIGN PATTERN 2008-01-24 16:54 6040人阅读 评论(4)收藏 举报
domainobject领域模型accesshibernate单元测试
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的透明持久化支持,那么充血模型还是能够实现的。
- 贫血模型和充血模型
- 贫血模型和充血模型
- 贫血模型和充血模型
- 贫血模型和充血模型
- 贫血模型和充血模型
- 充血模型和贫血模型
- 贫血模型和充血模型
- 贫血模型与充血模型
- 浅析:领域模型、贫血模型和充血模型
- 领域模型,贫血模型,充血模型
- 说说领域驱动设计和贫血、失血、充血模型
- 说说领域驱动设计和贫血、失血、充血模型
- 失血模型,贫血模型,充血模型,胀血模型
- 谈谈领域模型--贫血还是充血?
- 领域模型、贫血模型、充血模型概念总结
- 领域模型、贫血模型、充血模型概念总结
- 领域模型中的贫血、充血模型(非常经典)
- 领域模型系列:贫血、充血模型(非常经典)
- linux系统调用编写方法变化
- Autodesk 的 Inventor API培训教材模块
- NS2中MCMI获取接口信道利用率
- 实现JAX-WS,如果忘了jaxws-spring这个jar的奇怪现象
- 接口隔离原则
- 贫血模型和充血模型
- extract-cpio.sh
- windows Dos命令大全
- D. Train Problem I
- ClassLoader.class.getResource
- 从网上找的Android实用代码,记录备用
- vs2010多种字符解决方式
- 线性时不变(LTI)系统能实现频谱搬迁么?
- 寻找投资品的基础(以澳元为例——大道至简之十九)