怪怪 | Nothing, Everything

"有过一个发疯的时刻,有感觉的钢琴以为它是世界上仅有的一架钢琴,宇宙的全部和谐都发生在它身上." - 狄德罗
随笔 - 104, 文章 - 3, 评论 - 2004, 引用 - 44
数据加载中……

胡言乱语一篇: 所谓面向对象与关系模型的矛盾

神秀身是菩提树,心为明镜台; 时时勤拂拭,勿使惹尘埃。

听起来很美,不是? 到今天大家还纯洁的相信Rows->Entities就是解决之道,代表了基于数据库的软件如何表现面向对象的精髓; 顽固而勤奋的寻找一个又一个的方案, 希望自己的设计水平能够一次又一次的进化,最终能够正确处理好两者之间的关系。不得不说一句,这种生硬的处理方式,要是能没矛盾,倒稀奇了。

DTO能够让IDE提供足够的信息, 能够让编译器做出适当的检查,可即使是Rich Object,在ORM负责的这一段,能发挥的真实作用也不过仅此而已. 到底有啥必要去ORM? 业务逻辑本身什么时候要求所有的数据都要变成对象了? 我们想清楚没有, 到底需要的是什么能力, 想要解决什么问题? 在进行手工的或者自动化的ORM的时候,我们到底是在寻求帮助,还是在添加障碍?

这么多年来,谁说这种方式不对,谁就被当菜鸟; 最后受益的真不知道是所谓的高手们呢,还是各种厂商。 C#这些语言中纯粹面向对象的部分, 不得不说,正在误入歧途。 制造一个麻烦,解决它,然后再制造一个。 也许这样,所有的厂商和程序员都有饭吃, 很好很强大。

即便是伟大的无与伦比的面向对象,要想不受束缚的去设计,就必须隔断数据库和业务逻辑的关系; 这不能是添加一个数据操作层或者ORM去隔断,当咱们这么做的时候,实际上恰恰是在建立一种强联系。 最可笑的是,哪怕最清晰明了的模型,也会变得复杂起来。看看CommunityServer这么一个Web系统几年来的所谓进化吧,里面的一个又一个的死对象不断的浮肿起来,带来了多少不必要的繁文缛节和沉重负担。

一个PetShop,作为一种展示无可厚非,可它又让多少人不得不在所谓的n层之间的接口上徒增烦恼呢?在我看来,什么狗屁解耦,整个PetShop,就是Linus说的围绕一堆“漂亮对象”建立起来的坚固堡垒,想要把箭楼换个位置? 除非你是秦始皇。 我一直反对Linus愤青式的言辞,但不得不说,是所有面向对象爱好者和一部分所谓“经典范例”,给了他们这些人口实。

真正的自由和解耦,是视角和思想上的分离: 我们写下的每一行代码,都应该只基于上下文相关的概念,而不是任何形式的接口。这样需要变动的,就只剩下接口与概念之间的适配物了; 同时我们获得的就是真正意义上接口的自由: 从数据库/表/字段这些接口的变化,到这些数据可以转化为的任意一种对象所体现的接口的变化。

在Linq大行其道的今天,这篇东西有点战斗檄文的意思,就不发首页了。我现在想法还很不成熟,但是深切感觉到这方面问题的兄弟们,如果你愿意了解我在这方面的想法,我一定想办法逐渐把它清晰化,一点一点的呈现出来。

六祖慧能菩提本无树, 明镜亦非台; 本来无一物, 何处惹尘埃?

posted on 2008-03-10 17:03 怪怪 阅读(1688) 评论(7)  编辑 收藏

评论

#1楼    回复  引用    

解決Rows->Entities問題
我個人在嘗試db4o
2008-03-11 08:23 | jerrychen [未注册用户]

#2楼    回复  引用  查看    

是啊,我也一直困扰在这里,这个接口,那个继承,不就是一种耦合关系么??

但什么样的构架方式才是最适合呢??在没有方案的情况下,目前的方案就是最好的方案吧,所以只能带着困扰继续应用petshop那种构架模式。

如果兄台有其他好的方法,不妨抛出来,让我也可以学习学习!
2008-03-11 10:13 | 黑羽飘舞      

#3楼    回复  引用    

学习,你是不是刚跑到 徐少侠 哪里逛了;
嘛时候能很好地写逻辑而不是把时间用在ORM上哦,linq和db4o从两个方向逼近,嘻嘻,等待中

#4楼 [楼主]   回复  引用  查看    

@路人甲被使用了
好久不见老徐了...

其实我感觉,好多事情阅读和辩论都没有意义了,主要是不断尝试,找到最合适的方式...

@jerrychen
db4o要是真能解决问题,早就满大街都是相似的东西了...,关键是数据如何使用的特征。 不会有一劳永逸的解决方案。

@黑羽飘舞
拿PetShop的架构来说吧,我觉得首先要搞明白的是,我们拿这么个架构来干什么? 它的各个组成部分, 哪些是针对哪些问题的? 各种各样的实现手法都不难学,我觉得更关键的是学会放弃。

我现在也处于摸索期, 想要表达还比较有难度, 共同探究,共同进步吧。
2008-03-11 17:42 | 怪怪      

#5楼    回复  引用  查看    

是啊,
初学面向对象的时候觉得一个函数可以解决的问题,非要加个什么类,加什么构造函数...,多麻烦。
初学设计模式的时候觉得直接一个类就可以了,为什么要继承来继承去的。
第一眼看petshop,怎么这么多项目啊?
可能这样说绝对了,我觉得这些特别容易对初学者造成困惑,所以可能你也不用去关注什么模式这些东西,根据需要来做就可以了,当你意识到的时候你写出的东西自然就是模式了
2008-03-12 08:06 | 生鱼片      

#6楼    回复  引用  查看    

@生鱼片
意识到的时候,基本上就是出问题的时候了。为什么不在问题出现之前就尝试去避免?
2008-03-13 17:42 | yzlhccdec      

#7楼    回复  引用  查看    

1、要想不受束缚的去设计,就必须隔断数据库和业务逻辑的关系

我是把数据库(里面的表)当作实体类来看待的,SQL语句就是业务逻辑的体现。

2、@ 生鱼片

在C#语言里函数是不能独立存在的,必须要有一个类,某个类里面的函数。哪怕是静态的,也得有个类作为容器。

所以想象以前那么些的话,在外面套个类就可以了。


设计模式是要通盘考虑的,面对的是大局而不是局部,“一个类就可以了”那只是解决了一个局部的问题,全局的话就要考虑类和类之间的关系了。

当初解决函数与函数之间的关系的时候,出现了“类”,而类比函数高明的地方就是:他自己可以解决类和类(自己和自己)之间的关系,而函数却不能解决函数和函数之间的关系。


3、
一维空间是一条线
二维空间是一个面
三维空间是立体的。

再往下就不好想象了。

同样,
一行一行地写代码 一维
一个函数一个函数的写代码 二维
一个类一个类的写代码 三维


2008-03-15 14:40 | 金色海洋(jyk)      

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-03-10 23:55 编辑过


相关链接: