2006年4月10日

#

原文

关于"贫血模型"的讨论几乎没有停止过,在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方法的原则才是我们必须掌握的.

2006年2月5日

#

2006年1月23日

#

2006年1月21日

#

1:abator下载:http://ibatis.apache.org/abator.html

2:将abator安装到eclipse中

3:此时可以新建一种文件类型:Abator for iBATIS Configuration File,建立一个

4:在 jdbcConnection 中设置要mapping的数据库的jdbc连接

classPathEntry 是你的jdbc driver类路径

5:javaModelGenerator,sqlMapGenerator,daoGenerator

分别设置 java dataObject、sql mapping文件和 DAO 接口、实现类的生成位置:targetPackage

目标包,targetProject:eclipse项目

6:daoGenerator 中可以设置属性  type: ibatis 或 spring 指定生成的dao实现类是使用com.ibatis.dao.client.template.SqlMapDaoTemplate

还是

org.springframework.orm.ibatis.support.SqlMapClientDaoSupport

7: table 中 tableName 指定要处理的表名

可以有多个table

8:table中可以包含子元素 generatedKey: 使Insert方法可以返回值--由指定的column mapping

9:generatedKey中的sqlStatement属性可以是获取sequence的SQL,也可以是获取自增值的SQL

比如:Oracle的 select theSequence.nextVal from dual

SQLServer的 SELECT @@IDENTITY as  column_name

10:保存文件,选中文件,右键菜单选择Generate iBATIS Artifacts! ok...使用abtor生成的iBatis代码出现xml解析错误的解决方案如果按上述方式生成的代码有xml解析错误:  请下载这个

注意,该文件名为Abator.rar.txt实际是一个rar文件,只是上传服务器有文件类型限制 所以只好加了扩展名txt。

请去掉.txt后解压。

使用

org.apache.ibatis.abator.core_0.5.1.jar

替换调你的 eclipse\plugins 的同名文件 即可。

然后重新生成代码。 OK 应该可以咯....

我改了一点代码,需要可以留言。

2006年1月20日

#

2006年1月19日

#

java oo_我爱oo,我爱java相关推荐

  1. 让我又爱又恨的Java《打工人的那些事》

    让我又爱又恨的Java<打工人的那些事> 概述 我从事Java行业,差不多有6年了. 对于Java,我是又爱又恨.那么,爱从何说起.恨又从何而谈. 下面我会一一道来. 始于ACM 2014 ...

  2. 爱奇艺的Java缓存之路,你应该知道的缓存进化史!

    本文是上周去技术沙龙听了一下爱奇艺的Java缓存之路有感写出来的.先简单介绍一下爱奇艺的java缓存道路的发展吧. 可以看见图中分为几个阶段: 第一阶段:数据同步加redis 通过消息队列进行数据同步 ...

  3. 谁说待国企就是养老?前阿里P8总结500页Java成长笔记全网首发!爱了爱了!

    前言 2020.11月,这个月是我加盟xxx国企的一年整,这篇分享本来是要提前写的,不过由于前段时间确实繁忙,一直没有机会提笔.今天简单和大家分享下我在国企的一些工作内容,感悟等等,希望能给那些对自身 ...

  4. 专家预言未来机器人性XX爱OO或成常态,并利于身心健康

    最近,性心理学专家Helen发表了一篇关于性XX爱OO机器人的文章,表示关于"恋机器癖"的偏见将很快烟消云散. 有人曾预言,200年后人类造出智能机器人,以满足人类的性需求. 此外 ...

  5. vscode请更新includepath_VS Code Java 九月更新!Coding Pack for Java 带来一键安装新体验!...

    欢迎来到这一期的VS Code Java更新.9月,我们发布了一个新的VS Code安装程序,称为Coding Pack for Java. https://code.visualstudio.com ...

  6. java三年技术差_3年经验Java程序员面阿里P6 差距在哪里

    虽然这位小伙伴觉得自己工作三年了,结果阿里连面都不面就把自己挂了,这让自己感到很伤心.但是还是有网友觉得,三年不到p6,很正常啊,明年再面就没有问题啦! Java程序员3年经验面阿里P6,2面连面都没 ...

  7. java求拼接后的字符串长度,java如何拼接字符串

    java 动态拼接字符串,Java 字符串拼接效率分析及最佳实践,java字符串拼接,java如何拼接字符串 在JAVA 中拼接两个字符串的最简便的方式就是使用操作符"+"了.如果 ...

  8. java 和javafx_9月的十大Java故事:Java 13,JavaFX 13和Jakarta EE 8

    java 和javafx 简而言之,9月对于Java来说是繁忙的月份. 我们不仅发布了JFX 13和Jakarta EE 8,而且Java 13还发布了一些新的JEP和功能预览. 即使天气变凉,Jav ...

  9. Java基础语法(一)——初识Java

    文章目录 一.Java语言概述 1.Java是什么 2.Java 的流行性 3.Java 的特性 (1) 简单性 (2)面向对象 (3) 分布式(微服务) (4) 健壮性 (5) 安全性 (6) 可移 ...

最新文章

  1. 微信小程序实现画布自适应各种手机尺寸
  2. stat_count() must not be used with a y aesthetic
  3. python x y z 1_Python下的数值列表 - range(x,y,z)函数
  4. 这六段代码隐藏着深度学习的前世今生!
  5. 数据库事务的四大特性ACID
  6. 如何修改被编译后DLL文件
  7. 利用注释及自定义加密免杀Webshell
  8. PHP中使用CURL实现Get和Post请求方法
  9. 18-09-16如何从pychram的第三方包导入设计器
  10. 固件升级_洛达1562a固件升级支持空间音频
  11. 2020-09-15
  12. pta c语言期末上机考试题库,PTA 程序设计 判断题-期末复习
  13. MAC如何烧录img文件或ios文件
  14. PyTorch与PyTorch Geometric的安装
  15. 设计简单计算机主机系统,【效率】专为Win7系统设计的最小Pomodoro-MiniPomodoro(随附...
  16. 你听说过史莱姆吗??【oj】
  17. HTML+CSS大风车及十字架的实现
  18. 联邦学习 Federated Learning 相关资料整理
  19. Docker教程(Docker实战)
  20. php网站iis7.5 session,IIS7/7.5下web.config奇葩的问题(伪静态html无法使用session)

热门文章

  1. iOS图标启动图生成器(一)
  2. Linux4.0平台下Oracle10g安装
  3. 一文读懂IaaS,PaaS,SaaS 的区别
  4. 分立器件~二极管三极管
  5. NotFoundError:Tensor name incept5b_1/... not found in checkpoint files /home/cqh2/...
  6. 《把时间当作朋友》 - 书评
  7. 《把时间当朋友》 第六章交流 读书笔记
  8. 高德地图坐标转换为具体地址
  9. Java 生成二维码。
  10. 2013年3月TIOBE编程语言排行榜,Ruby超越Perl