??xml version="1.0" encoding="utf-8" standalone="yes"?>久久亚洲一区二区三区四区 ,国产精品久久久久久模特,偷拍25位美女撒尿视频在线观看http://www2.blogjava.net/oofrank/category/7124.html交流blog QQ:421057986 <a >oofrank@donews</a>zh-cnThu, 01 Mar 2007 11:17:40 GMTThu, 01 Mar 2007 11:17:40 GMT60DAO-持久?领域对象-贫血模型http://www.aygfsteel.com/oofrank/archive/2006/04/10/40337.html兼听则明兼听则明Mon, 10 Apr 2006 14:21:00 GMThttp://www.aygfsteel.com/oofrank/archive/2006/04/10/40337.htmlhttp://www.aygfsteel.com/oofrank/comments/40337.htmlhttp://www.aygfsteel.com/oofrank/archive/2006/04/10/40337.html#Feedback1http://www.aygfsteel.com/oofrank/comments/commentRss/40337.htmlhttp://www.aygfsteel.com/oofrank/services/trackbacks/40337.html原文


关于"贫血模型"的讨论几乎没有停止过,在openfans.org的开发过E中,我们也讨Z很久,我觉的有很多东西应该C?
明确一下意思先:
DAO:数据操作对象,会操作数据库
持久?能提供对象持久化服务的一pdlg或服?br />领域对象:描述领域模型的对?是通过业务分析q行pȝ建模的?br />? 血模型:是domain object只有属性的getter/setterҎ的纯数据c,所有的业务逻辑完全׃个所谓的Manager来完?又称 TransactionScript)Q这U模型下的domain object被Martin FowlerUC为“血的domain object?br />常见的类基本l构如下:
一个业务数据类叫做ItemQ?br />一个DAO接口cd做ItemDao
一个DAO接口实现cd做ItemDaoHibernateImpl
一个业务逻辑cd做ItemManager(或者叫做ItemService).

观察上面的几个类很容易发现问?
1:Item和ItemManager实际是操作与数据的关p?实际完成的就是经典OO中的一个对象的能力;
2:当有许多Item?cȝ变得很庞?产生很多 xxxDao xxxImpl xxxManager 其中包含大量重复代码;
?lt;<重构>>的观?上述代码存在以下臭味:
1:重复的代码 ?xxxDao xxxImpl xxxManager(通常)
2:霰弹式修改,一个变化媄响多个类,cM间不够高内聚 item变化-->Dao,Impl,Manager均要变动
3:依恋情结,两个cM间互怽用过?item<->Manager
4:ql承体系,当增加一个新cLL要增加另一个类
5:夸夸其谈未来?在没有Q何暗C的情况下考虑扩展  Dao,实际HibernateImpl可能nq内是唯一的Dao实现
6:U稚的数据类Q只有数据的c?item

我觉?贫血模型 是系l分析设计方向性错误的产物:
1:没有q行领域建模---以数据表l构Z?而不是业务模型ؓ中心的思考方?使设计h员选择Item虑问题的出发点
2:DAO与持久层h---我们需要的一U持久化服务,DAO紧紧是提供数据操作能力而已,Hibernate是一U高U的服务(他已l包含了DAO,而不是相?,已经完成了所有的持久层服?
3:q于低偶?--一些本来一些提供单一职责的内容分散在多个单元中 客户?依赖更多的接?而忘C高内聚原?
4:Spring的能力限?--׃Spring现阶D不支持对于领域模型的服务注?使设计h员将操作和数据分开,q将领域变ؓDataOnly?
  (Spring2.0在很大E度上解册个问?
 
我认好的解决Ҏ:
  首先领域建模,建立领域模型-->合ƈ前面所说的Item和ItemManager成ؓ domainItem;对于数据库服?
  1:如果考虑领域层包含数据操作能?则徏立DAOq择其它好的DAOҎ比如IBATIS或Hibernate之类的组?
  2:如果考虑数据库(或其他存储界?存储考虑在领域之外成为持久层,
      a:则或者对持久层框架同时徏?同时选择合适的lg为持久层服务提供存储服务(包括DAO--亦可选择IBATIS/Hibernatelg),
      b:或者直接用Hibernate/JDO{框架实现持久化服务,领域层直接用持久层服务,寚w域对象进行持久化和反持久?从持久层获取以持久化的对?.
 
其他:
  实际?作ؓ一U解x?所?贫血模型"的具体?q不会有太大的问?其是用一些代码生成工h已经做好相应的基本框架时,很多软g的核心h 值都在于对客h供的服务,而其内部则成为黑?我们只要合理的解决业务问?是"王道"?对于代码的臭?可以慢慢重构--q也需要成本呀. 
 
再其?
有h?我们的业务就是CRUD,领域模型只有数据cd_?我觉的这是搞错了方向------只有CRUD?只有处理CRUD的那些类才有必要q行建模(他们才是领域模型),而所谓的User\Item{数据类则完全没有必要进行徏?更不要谈领域?

贫血之外:
实际?软g\OOҎ的外延大的很,更多问题与数据库存储无关(但也有血问题),所以徏模才是根?OOҎ的原则才是我们必L握的.


兼听则明 2006-04-10 22:21 发表评论
]]>
白马非马的面向对象分?/title><link>http://www.aygfsteel.com/oofrank/archive/2006/01/19/28649.html</link><dc:creator>兼听则明</dc:creator><author>兼听则明</author><pubDate>Thu, 19 Jan 2006 06:16:00 GMT</pubDate><guid>http://www.aygfsteel.com/oofrank/archive/2006/01/19/28649.html</guid><wfw:comment>http://www.aygfsteel.com/oofrank/comments/28649.html</wfw:comment><comments>http://www.aygfsteel.com/oofrank/archive/2006/01/19/28649.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.aygfsteel.com/oofrank/comments/commentRss/28649.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/oofrank/services/trackbacks/28649.html</trackback:ping><description><![CDATA[ 公孙龙,六国时辩士也。疾名实之散乱,因资材之所长,为“守白”之论。假物取譬,以“守白”辩Q谓白马为非马也?BR><BR>  以马作ؓq行问题域进行徏模,已知存在白马q种cd。显然存在马的超c,q且马类包含一个属性-颜色Q是否需要徏立白马的子类呢?显而易见的是,当马的颜色属性是白色Ӟ马的一些实例表达了一个白马的Ҏ实例?由此我们可以得知Q白马显然是?Q根据里氏替换原则,子类型必能够替换掉它们的基cdQ显然在分析了马的行为模式以后,我们可以得出l论Q白马可以替换马。-Q-Q!N真的要徏立白马、黑马、X马的子类吗?<BR>   我认为可以从以下几方面进行分析?BR><BR>1、类的职?很大E度上等同于服务能力Q操作方?:<BR>    设计一个类Q首先要从类职责的分析入手,一个类要承担响应的职责Q反q来说同L职责应该由同LcL担,否则会造成cL滥,实例孤单的状c如果领域内马和白马承担同样的职责,应该只徏立马一个类Q不应该只见树不见林Q造成不抽象的cȝ产生?BR><BR>2、类的行为模?当类承担响应职责Ӟ如何扩展)Q?BR>   分析一个类要从cȝ行ؓ模式入手Q既然一个类要承担责任,其承担的责Q表现方式是否一样呢呢?q就是她的行为模式,q也是里氏替换原则主要v作用的地方,如果两个cȝ职责相当Q但行ؓ模式不同则不能成cd子类的关p?比如"著名"的正方Ş不是长方形问?。马c,作ؓ类Q基于一些特D的行ؓ方式Q吃草,?..Q对于白马她的行为模式和马是一LQƈ没有不同Q所以白马是马而非马的同根l承子类。对于长方Ş和正方Ş都是h相同计算面积法(职责)的四方Ş的子cR?BR><BR>Q-Q-Q-Q以下是关于此事的一些扩展分析-Q-Q-Q-Q-Q-<BR>3、子cȝ产生Q?BR>    何时需要生子cdQ是对其父类的职责进行扩展,白马没有对父cȝ职责q行扩展Q所以不是马的子cR首先子c要扩展类Q其ơ子cM能重写或废除类的职责?BR><BR>4、属性,状态的区别(cȝ?<BR>   对于一些类Q在状态不同时Q会有不同的表现(状态机模式),所以,cȝgetterQsetter的部分包含两U不同的Ҏ,对于属于状态的部分Q是我们要仔l分析的Q??马则属于属性类(非状?的域, 一般来Ԍ一个类的实例要能提供相应的差异服务(׃状态不?最好用不变模式[生存周期状态不变]或状态机[生存周期有状?但状态不p用者控制]来实现?BR><BR>5、抽象类和接?BR>   ׃java的单根承特性,很多设计人员不敢定义抽象cMؓl承树根Q一定要先定义马的接口,在徏立抽象马Q作ZU?准规?无可厚非Q但我认是不愿承担责ȝ表现Q有行ؓ的基cd该可?必须?)从类定义开始,避免白马c?一旦马成ؓ接口Q白马的产生更?名正a??的出?来如果发生变化可以通过重构(导出接口和用委?Q解决问题?<BR><BR>6、对象的创徏(l装)和用应该分开<BR>   既然对象的状态如此重要,属性有有很大程度的不变?白马在构造时q该是白的Qƈ且一生不?Q而骑马的Z必要求马的属?!),所以,我们应该马的构造和使用分开Q领域模型更清晰。用一些Ioc容器Q比如Springp很好的解册些问题?BR> <BR>7、分析问题的领域<BR>   说了q么多,有一个问题;如果有一个马的研I机构,专门对不同颜色的马进行专题研IӞ马的颜色可能会对马的行ؓ有很大媄响,例如战马如果是黄?l色Q哈?更利于伪装,此时"?可能是一个很关键的问题,颜色会媄响到不同的伪装策略,此时白马作为马的一个子cd是必ȝQ所以问题域不同Q类的设计就不同Q生zM的问题域比较清晰(生物学家和厨师对马的理解不同)Q而Y件徏模时往往问题域؜杂,q也是OO设计时比较困隄问题Q所以分析问题域也是非常重要的设计问题?BR><img src ="http://www.aygfsteel.com/oofrank/aggbug/28649.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/oofrank/" target="_blank">兼听则明</a> 2006-01-19 14:16 <a href="http://www.aygfsteel.com/oofrank/archive/2006/01/19/28649.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ɳ</a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank">ϴ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">߱</a>| <a href="http://" target="_blank">ʳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ؿ˹</a>| <a href="http://" target="_blank">Ͻ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">뵺</a>| <a href="http://" target="_blank">ͭ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ǭ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">廪</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ٳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ҵ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">᯹</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">²</a>| <a href="http://" target="_blank">̨</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">౱</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ӫ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>