论坛首页 Java企业应用论坛

[领域模型] 领域模型--Now mission impossible[Java]

浏览 3540 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-01-15  
[领域模型] 领域模型--Now mission impossible[Java]
   潜水N久了,冒个泡,几年前就在javaeye参与过关于领域模型的讨论,越讨论我就越对这个模型越没有信心。
   领域模型是什么? 想到一个笑话: 工作时把我当超人,加薪时把我当隐形人。领域模型就是为实现这么个理想而提

出来的。什么贫血什么充血,其实就是要实现 对象化编程,把数据库当做隐形人。再说白点:就是数据库在与不在一个

样!对象在故我在,所有的方法都自然而然的加注到这么个对象上。
   领域模型的理想:
    还是银行转账这么个例子:
           事务开始:
           finder.find(帐户A)
           帐户A.减(500)。
           finder.find(帐户B)
           帐户B.加(500)。
           流水帐户.记录(XXX)
           事务结束。
    
   但是愿望是美好的,现实是残酷的 持久化是一座难以翻越的高山。就我浅薄的知识范围内来说,我没有找到一个很好

的技术解决方案(java)
          (1)事务范围内所有的对象的状态都要记录。
          (2)事务范围内所有的对象的变化都要记录。
          (3)事务结束是所有变化了的对象都要回写入数据库。
   上面这三件事看似简单,其实也就是所有数据库操作的全部,即使是hibernate也没做到这一点:
          (1)事务开始时就要建立一个对象图。
          (2)访问过的所有对象都要纳入这个事务发起的对象图中
          (3)无侵入的记录对象图中所有字段的变化。
          (4)回写变化了的字段【有可能是增量的】。
          (5)当出现异常时候,需要回滚【对象图是重建还是全部废弃?】
    如果持久化框架能做到上面几点,才能谈真正的领域对象。

    目前来说hibernate已经做到了一部分对象图的功能,但是仅仅是一小部分。


    另外我在论坛上经常看到DAO可以隔离数据的存贮,但我要说的是你如果用上了hibernate的话,想要随时替换成ibats几乎是不可能的,除非hibernate的大部分功能,你不用。

     
   发表时间:2009-01-16  
但我们最起码可以做到:
把领域模型分离出来,更好的封装领域或业务知识,可以一定程度减少需求变化的影响
提炼领域模式,比如Entity, Value Object这些building block

其实,领域模型对软件开发的方方面面都有影响的吧
0 请登录后投票
   发表时间:2009-01-16  
不明白为什么楼主觉得持久化 那里做不到了?
0 请登录后投票
   发表时间:2009-01-16  
1)领域模型的提出就是为了对象化的操作,也就是的属性和行为应该是封装在一起的。操作应该是细粒度的。而这些有血有肉的对象属性的确是和数据库紧紧相连的。

2)很简单,当你做一连窜操作的时候,以事务的起点为根:
   1)取出A对象,操作。
   2) 导航到B对象操作。
   3) 导航到c对象操作。
   4)。。。。H对象操作。
   事务结束。
  
   a-h的对象那些需要回写数据库的? 如何回写?这些都需要对整个对象图进行管理。hibernate目前能做到的也就是 具有级联关系的一些对象而已。

   现在解决方案要么就是在A-H各个对象中弄个DAO来取数据,要么就是直接写在里面,做的最好的hibernate倒是能够无侵入的自动根据配置好的关系在对象图中遨游,但是遨游过后的再次回填,确实做不到的。不过怎么说也算进了一大步了。

   什么时候在对象图遨游般的回填数据库,那么领域模型的春天才算真正到来了。
              

0 请登录后投票
   发表时间:2009-01-19  
我觉得真正的领域模型应该是充血模型,不过现有条件下实现充血模型有点麻烦,大家不要老争论那些所谓能与不能的问题,而且这么做到底有没有意义,效费比高不高
0 请登录后投票
   发表时间:2009-01-20  
持久化对于domain object本身来说真的很重要吗?
domain object为什么要去关注存储与事务?存储是Repository的事情,而事务,是service的事情。当然,他们也是属于领域模型的一部分。
0 请登录后投票
   发表时间:2009-01-20  
nighthawk 写道
持久化对于domain object本身来说真的很重要吗?
domain object为什么要去关注存储与事务?存储是Repository的事情,而事务,是service的事情。当然,他们也是属于领域模型的一部分。

严重同意
0 请登录后投票
   发表时间:2009-01-23  
guooscar 写道
nighthawk 写道
持久化对于domain object本身来说真的很重要吗?
domain object为什么要去关注存储与事务?存储是Repository的事情,而事务,是service的事情。当然,他们也是属于领域模型的一部分。

严重同意

理论上是这样,新手看了配有简单的例子的书都会这么说,但当稍微复杂的领域对象就会遇到问题,最简单的问题就是对象导航的问题,没有透明的持久化对象的支持,你的领域对象内部就会充满了DAO 和并且被事务对象严重侵入了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics