原文

关于"贫血模型"的讨论几乎没有停止过,在openfans.org的开发过程中,我们也讨论了很久,我觉的有很多东西应该记下来:

明确一下意思先:

DAO:数据操作对象,会操作数据库

持久层:能提供对象持久化服务的一系列组件或服务

领域对象:描述领域模型的对象,是通过业务分析进行系统建模的产物

血模型:就是domain

object只有属性的getter/setter方法的纯数据类,所有的业务逻辑完全由一个所谓的Manager来完成(又称

TransactionScript),这种模型下的domain object被Martin Fowler称之为“贫血的domain

object”

常见的类基本结构如下:

一个业务数据类叫做Item,

一个DAO接口类叫做ItemDao

一个DAO接口实现类叫做ItemDaoHibernateImpl

一个业务逻辑类叫做ItemManager(或者叫做ItemService).

观察上面的几个类很容易发现问题:

1:Item和ItemManager实际是操作与数据的关系,实际完成的就是经典OO中的一个对象的能力;

2:当有许多Item时 类组变得很庞大,产生很多 xxxDao xxxImpl xxxManager 其中包含大量重复代码;

按<>的观点,上述代码存在以下臭味:

1:重复的代码   xxxDao xxxImpl xxxManager(通常)

2:霰弹式修改,一个变化影响多个类,类之间不够高内聚 item变化-->Dao,Impl,Manager均要变动

3:依恋情结,两个类之间互相作用过多 itemManager

4:平行继承体系,当增加一个新类时总是要增加另一个类

5:夸夸其谈未来性,在没有任何暗示的情况下考虑扩展  Dao,实际HibernateImpl可能n年内是唯一的Dao实现

6:纯稚的数据类,只有数据的类  item

我觉的 贫血模型 是系统分析设计方向性错误的产物:

1:没有进行领域建模---以数据表结构为中心,而不是业务模型为中心的思考方式,使设计人员选择Item为考虑问题的出发点

2:将DAO与持久层混淆---我们需要的一种持久化服务,DAO紧紧是提供数据操作能力而已,Hibernate是一种高级的服务(他已经包含了DAO,而不是相反),已经完成了所有的持久层服务.

3:过于强调低偶合---将一些本来一些提供单一职责的内容分散在多个单元中使 客户端 依赖更多的接口,而忘记了高内聚原则.

4:Spring的能力限制---由于Spring现阶段不支持对于领域模型的服务注入,使设计人员将操作和数据分开,并将领域变为DataOnly的.

(Spring2.0将在很大程度上解决这个问题)

我认为良好的解决方案:

首先领域建模,建立领域模型-->合并前面所说的Item和ItemManager成为 domainItem;对于数据库服务,

1:如果考虑领域层包含数据操作能力,则建立DAO并选择其它好的DAO方案比如IBATIS或Hibernate之类的组件;

2:如果考虑将数据库(或其他存储界质)存储考虑在领域之外成为持久层,

a:则或者对持久层框架同时建模,同时选择合适的组件为持久层服务提供存储服务(包括DAO--亦可选择IBATIS/Hibernate组件),

b:或者直接使用Hibernate/JDO等框架实现持久化服务,领域层直接使用持久层服务,对领域对象进行持久化和反持久化(从持久层获取以持久化的对象).

其他:

实际上,作为一种解决方案,所谓"贫血模型"的具体使用,并不会有太大的问题,尤其是使用一些代码生成工具或已经做好相应的基本框架时,很多软件的核心价

值都在于对客户提供的服务,而其内部则成为黑盒,我们只要合理的解决业务问题,就是"王道"了,对于代码的臭味,可以慢慢重构--这也需要成本呀.

再其他:

有人说,我们的业务就是CRUD,领域模型只有数据类就足够了.我觉的这是搞错了方向------只有CRUD时,只有处理CRUD的那些类才有必要进行建模(他们才是领域模型),而所谓的User\Item等数据类则完全没有必要进行建模,更不要谈领域了.

贫血之外:

实际上,软件\OO方法的外延大的很,更多问题与数据库存储无关(但也有贫血问题),所以建模才是根本,OO方法的原则才是我们必须掌握的.

posted on 2006-04-10 22:21 兼听则明 阅读(6312) 评论(4)  编辑  收藏 所属分类: oo

评论

# re: DAO-持久层-领域对象-贫血模型

2006-04-11 01:30

mixlee

典型的滥用接口  回复  更多评论

# re: DAO-持久层-领域对象-贫血模型

2007-10-20 13:02

邓英妥

不敢苟同楼主的观点  回复  更多评论

# re: DAO-持久层-领域对象-贫血模型

2008-10-20 17:40

mojie

合并前面所说的Item和ItemManager成为 domainItem,我认为贫血可以使,层次更清晰 ,便于模型维护  回复  更多评论

# re: DAO-持久层-领域对象-贫血模型[未登录]

2015-04-15 20:10

喔喔

同样不敢沟通楼主观点  回复  更多评论

java中级做dao模型_DAO-持久层-领域对象-贫血模型相关推荐

  1. Java软件开发:自定义MyBatis持久层框架

    自定义MyBatis持久层框架 1 框架概述 1.1 什么是框架 1.2 框架要解决的问题 1.3 软件开发的分层的重要性 2 MyBatis框架 3 JDBC编程 3.1 JDBC程序的回顾 3.2 ...

  2. 1.2 《数据库系统概论》之数据模型(概念模型、逻辑模型--物理模型、层次模型、网状模型、关系模型、面向对象模型、对象关系模型)

    文章目录 0.思维导图 1.数据模型的概念 2.两大类数据模型 客观对象的抽象过程---两步抽象 3.数据模型的组成要素 (1)数据结构 (2)数据操作 (3)数据的完整性约束条件 4.概念模型 (1 ...

  3. 学Java可以做什么?这九大领域任你选!

    Java是时下非常流行的语言,这意味着有很多很多不同的工作可供选择.Java软件工程师入行1-3年,年薪已达到10-15万,而且在IT行业工作经验越多,薪资待遇越高. 工作选择多,薪资待遇好,成了许多 ...

  4. DDD(领域驱动设计)系列主题:失血模型,贫血模型,充血模型和胀血模型详细解读和代码案例说明!

    目录 失血模型,贫血模型,充血模型和胀血模型定义及优点和缺点 失血模型 贫血模型 充血模型 胀血模型 失血模型,贫血模型,充血和胀血代码样例 失血模型代码样例 贫血模型代码样例 充血模型代码样例 DD ...

  5. java充血模型orm框架,关于领域驱动设计和贫血、失血、充血模型

    大部分应用Spring框架的Java Web应用都相当关注单一职责原则和关注分离原则,但是在此之上却诞生了一些不太好的反模式和设计原则,比如: 领域模型对象只是用来存储应用的数据.(领域模型使用了贫血 ...

  6. DDD领域模型、贫血模型、充血模型概念总结

    DDD领域模型 领域模型是对领域内的概念类或现实世界中对象的可视化表示.又称概念模型.领域对象模型.分析对象模型.它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系. 业务 ...

  7. 贫血模型与充血模型再讨论

    贫血模式和充血模式 Martin Fowler很早以前就写过一篇文章,题目叫"贫血模型".文章里面批判贫血的领域模型是不够优雅.不够OO的,提倡使用充血的领域模型.在Java世界里 ...

  8. 领域模型、贫血模型、充血模型概念总结

    领域模型 领域模型是对领域内的概念类或现实世界中对象的可视化表示.又称概念模型.领域对象模型.分析对象模型.它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系. 业务对象模 ...

  9. OpenCV DNN支持的对象检测模型

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 引言 OpenCV DNN不光支持图像 ...

最新文章

  1. 华为云桌面客户端_入冬第一场技术盛宴!DevRun开发者沙龙华为云武汉专场举办...
  2. python jenkins库 api简介
  3. 商业级全局负载均衡器 zeus.ZXTM 实施方案
  4. Win64 驱动内核编程-5.内核里操作文件
  5. 由浅到浅入门批量渲染(一)
  6. java中不能定义为变量名称_Java,“变量名”不能解析为变量
  7. 童家旺:如何用分表存储来提高性能
  8. kubeadm安装的Kubernetes etcd备份恢复
  9. Mac安装Anaconda
  10. 关于动态数组指针操作的两个例子
  11. codeforce 985C Liebig's Barrels
  12. mysql5和8怎么同时安装_WINDOWS服务器同时安装多个版本的MYSQL的方法,MQYSQL5和MQYSQL8的共存。...
  13. 基于matlab的红外图像处理算法研究,基于小波的红外图像去噪算法研究
  14. 钢绞线的弹性模量的计算方法_钢绞线弹性模量的理论计算及其影响因素分析
  15. 图片放大模糊怎么办,Python无损清晰放大,360P变4K
  16. 永川机器人博览会门票_14日 又到永川来看机器人哦
  17. easyexcel结合zip 导出压缩文件(包含多个excel)
  18. 使用WinDbg —— .NET篇 (一)
  19. 软件测试职业发展三步曲之一
  20. 福昕阅读器无法注释的解决

热门文章

  1. oracle之数据处理之课后练习
  2. 前端学习(1297):第三方模块gulp
  3. 前端学习(1032):jquery插件-瀑布流
  4. 前端学习(490):javascript实现
  5. 8.用MyEclipse进行JSP开发
  6. 老华为可以升级鸿蒙,真良心!五年前老机型都能升级华为鸿蒙
  7. 微信小程序:生命周期
  8. display:table-cell的集中应用
  9. 计算机管理器win8.1,没事折腾?Win8.1文件管理器设置几招
  10. IO_ADDRESS()的实现【转】