为什么把持久化放到Domain Object是不OO的.

    争论会一直在人群中存在,它消失就代表人类文明也灭亡了...

    很久以前,在园子曾经出现过关于ORM的争论.而就是在那段时期,我对OO及ORM的概念在硝烟弥漫的文字里逐步建立起来.最近对于是不是该把持久化放入到book的讨论,我想跟之前的ORM争议颇有相似之处.

    说到ORM,大家应该会赞成信息系统的开发,可以分为以数据库为中心、和以OO为中心的两种主要方式吧.

    1.以数据库为中心.显而易见,开发的初期会先设计好数据库结构,包括表/字段/关系基于存储过程等等对象.然后再依据数据库来做上层的业务逻辑,以及表现层等等.按照这种方式开发的系统,其实Domain Object已经没有存在的必要了.你完全可以在aspx.cs文件中开一个datareader读出数据库的内容再显示出来.而其实所谓强类型的数据集,其实就是物理数据库在内存中的一个映射.业务实体等这些东西是没有必在的必要性的.

    2.以OO为中心来设计系统.首先第一步是设计业务流程和实体类,然后再根据需要来设计数据库结构等,在实体类和数据库中间再用ORM桥接起来.对以OO为中心的设计来说,在设计时间,业务流程/逻辑/实体类这些才是中心要点所在,在初期甚至设计的主要阶段,数据库/持久化这些等等东西都是不会被优先考虑的.在这个立场上来看,持久化是因为内存太小,电脑会掉电才不得不需要的东西.而在后期数据将会被持久化到哪里,还并不是一个十分确定的问题.

    另我找到 一篇贴子,是讲Martin Fowler的贫血模型和rich domain object(不敢乱翻)的.个人觉得讲得不错.里面的第一种就类似于以数据库为中心的一种方式,贫血模型下的实体除了能提供强类型外,并没有带来多余的价值;第二种也就是Martin Fowler提倡rich domain object.可以看到 Item 实例了一些业务逻辑,然后最后的持久化是由ItemManager来完成的.原文也提出了在Item中不应依赖于ItemDao.

    最后该文还有提到第三种方法,这种方式与之前亚历山大同志提出的在book.Save中实现对象的自我持久化很相似.

    对于这种方式,我并没有要否定它的意思.可是,这种方式怎么能算是OO呢?如果你是以OO的方式来设计系统的话,在设计实体类的时候怎么会考虑到持久化这个问题呢,是不是在这一点上就已经偏离了OO的理念?

    需要厘清的是我本人认为实体类应该实现一定的业务逻辑,类似于亚历山大同志提出来的Man需要Borrow和Lend方法的例子.而非常不赞同的是亚历山大同志提出来的在Book中实现持久化方法Save是一种很OO的设计.

    而令我十分困惑,明明Book.Save实现持久化的话,那就意味着Book对象对持久层产生了依赖.怎么还有那么多人说这是解耦!非常地困惑啊!

转载于:https://www.cnblogs.com/Klesh/archive/2007/09/24/martin-fowler-rich-domain-object.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值