java oo_我爱oo,我爱java
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相关推荐
- 让我又爱又恨的Java《打工人的那些事》
让我又爱又恨的Java<打工人的那些事> 概述 我从事Java行业,差不多有6年了. 对于Java,我是又爱又恨.那么,爱从何说起.恨又从何而谈. 下面我会一一道来. 始于ACM 2014 ...
- 爱奇艺的Java缓存之路,你应该知道的缓存进化史!
本文是上周去技术沙龙听了一下爱奇艺的Java缓存之路有感写出来的.先简单介绍一下爱奇艺的java缓存道路的发展吧. 可以看见图中分为几个阶段: 第一阶段:数据同步加redis 通过消息队列进行数据同步 ...
- 谁说待国企就是养老?前阿里P8总结500页Java成长笔记全网首发!爱了爱了!
前言 2020.11月,这个月是我加盟xxx国企的一年整,这篇分享本来是要提前写的,不过由于前段时间确实繁忙,一直没有机会提笔.今天简单和大家分享下我在国企的一些工作内容,感悟等等,希望能给那些对自身 ...
- 专家预言未来机器人性XX爱OO或成常态,并利于身心健康
最近,性心理学专家Helen发表了一篇关于性XX爱OO机器人的文章,表示关于"恋机器癖"的偏见将很快烟消云散. 有人曾预言,200年后人类造出智能机器人,以满足人类的性需求. 此外 ...
- vscode请更新includepath_VS Code Java 九月更新!Coding Pack for Java 带来一键安装新体验!...
欢迎来到这一期的VS Code Java更新.9月,我们发布了一个新的VS Code安装程序,称为Coding Pack for Java. https://code.visualstudio.com ...
- java三年技术差_3年经验Java程序员面阿里P6 差距在哪里
虽然这位小伙伴觉得自己工作三年了,结果阿里连面都不面就把自己挂了,这让自己感到很伤心.但是还是有网友觉得,三年不到p6,很正常啊,明年再面就没有问题啦! Java程序员3年经验面阿里P6,2面连面都没 ...
- java求拼接后的字符串长度,java如何拼接字符串
java 动态拼接字符串,Java 字符串拼接效率分析及最佳实践,java字符串拼接,java如何拼接字符串 在JAVA 中拼接两个字符串的最简便的方式就是使用操作符"+"了.如果 ...
- java 和javafx_9月的十大Java故事:Java 13,JavaFX 13和Jakarta EE 8
java 和javafx 简而言之,9月对于Java来说是繁忙的月份. 我们不仅发布了JFX 13和Jakarta EE 8,而且Java 13还发布了一些新的JEP和功能预览. 即使天气变凉,Jav ...
- Java基础语法(一)——初识Java
文章目录 一.Java语言概述 1.Java是什么 2.Java 的流行性 3.Java 的特性 (1) 简单性 (2)面向对象 (3) 分布式(微服务) (4) 健壮性 (5) 安全性 (6) 可移 ...
最新文章
- 微信小程序实现画布自适应各种手机尺寸
- stat_count() must not be used with a y aesthetic
- python x y z 1_Python下的数值列表 - range(x,y,z)函数
- 这六段代码隐藏着深度学习的前世今生!
- 数据库事务的四大特性ACID
- 如何修改被编译后DLL文件
- 利用注释及自定义加密免杀Webshell
- PHP中使用CURL实现Get和Post请求方法
- 18-09-16如何从pychram的第三方包导入设计器
- 固件升级_洛达1562a固件升级支持空间音频
- 2020-09-15
- pta c语言期末上机考试题库,PTA 程序设计 判断题-期末复习
- MAC如何烧录img文件或ios文件
- PyTorch与PyTorch Geometric的安装
- 设计简单计算机主机系统,【效率】专为Win7系统设计的最小Pomodoro-MiniPomodoro(随附...
- 你听说过史莱姆吗??【oj】
- HTML+CSS大风车及十字架的实现
- 联邦学习 Federated Learning 相关资料整理
- Docker教程(Docker实战)
- php网站iis7.5 session,IIS7/7.5下web.config奇葩的问题(伪静态html无法使用session)
热门文章
- iOS图标启动图生成器(一)
- Linux4.0平台下Oracle10g安装
- 一文读懂IaaS,PaaS,SaaS 的区别
- 分立器件~二极管三极管
- NotFoundError:Tensor name incept5b_1/... not found in checkpoint files /home/cqh2/...
- 《把时间当作朋友》 - 书评
- 《把时间当朋友》 第六章交流 读书笔记
- 高德地图坐标转换为具体地址
- Java 生成二维码。
- 2013年3月TIOBE编程语言排行榜,Ruby超越Perl