面向数据库与面向对象的一些理解

看了这么多讨论面向对象和面向数据库设计的讨论,这里也发表一些自己的理解。

面向数据库进行系统设计时,首先考虑的是数据库、表如何设计。在做需求调研阶段,向客户了解业务需求时,就忍不住的在脑海里构思库表结构。以后的思路便一直围绕着这些库表展开。根据数据表生成VO,再由VO衍生出对它们进行操作的业务类。说到底,所有的一切,都是为了操作数据库。

面向对象设计系统时,一切围绕对象,需求最先转化为业务类,之后的一切操作都应该面向这些类产生的对象,数据库在这些过程中起到辅助作用,用来存放需要持久化的数据。

所以,面向数据库中存在对象,面向对象同时需要数据库,这两种设计方式的最大区别在于谁是核心,数据还是对象。

数据,由于它本身的流动性,决定了面向数据设计模式的过程性增强,面向数据库的设计大大弱化了对象的优势。而数据是做为对象的属性存在的,采用面向对象设计能充分发挥对象的优势,也更符合人类的思维方式。

一些浅显的认识,权当抛砖引玉。

[该贴被admin于2010-08-09 16:32修改过]

基本正确。

>这两种设计方式的最大区别在于谁是核心,数据还是对象。
这就说明 面向数据库和面向对象本质是矛盾的,是矛盾的两个事物,是不可调和的,因为核心只有一个。

有不少人都否认这种矛盾,还认为实际中两个是并存的,这又是一种以存在即合理为逻辑前提的“傻子”。

在软件中存在两个核心必然导致混乱,就象一个家里,夫妻总是有一个说了算的,否则就是整体吵架;单位里也总有最后拍板的;国家也最有有一个总负责。

所以,漠视“面向数据库和面向对象本质是不匹配矛盾”这个命题的人,他连正常人的逻辑思维都没有,这样的人如何搞软件?


[该贴被banq于2008-11-12 07:19修改过]

看了两天的论坛,对于面向对象还是面向数据库还是有疑问,banq的解释很形象,我想问一下这是否就是考虑问题的出发点不同而已,而最终的程序实现不是一样的吗?

>而最终的程序实现不是一样
是的 完全不一样,质量 健壮性 可拓展性 维护性都不一样。

再打个不太好的比喻:我们自己制造的歼10很了不起,造出来的,但是有人当初就说了,造是造出来了,,它维护性稳定性是恶梦,这不前几天就从天上掉下来了。飞机制造灵魂和软件一样,是复杂系统的简单性,这属于哲学,用老子哲学来解释,就是大道至简,越是复杂的东西我们要让其简单,这样才有好的扩展和维护。

那么怎么样算简单呢?当然和我们人直觉自然相关的才是简单的,面向对象方法将需求分析设计等同于我们日常生活中对板凳 房子 飞机等直觉事物认识,这样,就简单了,你如果用数据建模,那么当然只有学了数学的人,才有这种数字转换思维,这不能叫直观简单啊。

所以,我们现在很多人看不懂我们先人的哲学,如道生一, 一生二 ,二生三,三生万物,怎么可能呢?数字1 2 3在数学中很常见啊,这些都已经说明我们思维被“扭曲”了。做软件也是一样,现在让学了数学算法的你做软件,你就认为软件最牛的是算法了,完全被细节蒙蔽双眼,没有大道哲学了,这些都是教育制度的受害者,是新式孔乙己啊。

http://www.jdon.com/jivejdon/thread/35372.html


[该贴被banq于2009-03-25 09:14修改过]

可能我还没到你的级别吧,认识还是要螺旋提高的。万物归一的哲学思想是不错,但是光知道这一点好像不够啊(可能架构师们是够了)在实际写程序时不知道数据在哪里,好像心里总觉得很虚。什么云计算之类的东西也搞不清楚,真希望能快快的都归一了,大家写网站就像说话聊天一样简单。最终幻想可能就像黑客帝国一样,大家活在梦里。
也借用道德经:不尚贤,使民不争;不贵难得之货,使民不为盗;不见可欲,使民心不乱。 是以圣人之治,虚其心,实其腹, 弱其志,强其骨。常使民无知无欲。 使夫智者不敢为也。为无为,则无不治。
最后只要有圣人,其他就是愚民好了。
唉,真是越学越无知,好在是学得有趣:)。

终于又见到这种争论了,记得不久前也是关于这种话题与同事争论过:
他的观点是:先设计表,然后把表的所有字段都映射到类里,一个字段对应一个属性。
我的观点是:先设计类再有表,一个表不一定只对应一个类,也不一定是一个字段只对应一个属性。
最后谁也说服不了谁,因为各自的思维不一样。我想这是技术没谁对谁错的原因吧
其实我很认同banq老师的观点:健壮性 可拓展性 维护性都不一样!当然我是支持面向对象的,因为在这几个“性”上无非他比面向数据库是更强的。也话面向数据库,在开发过程中速度可能更快,但是软件的生命周期我想不只是这样吧?

>只要有圣人,其他就是愚民好了
老子道德经不是从字面上理解的,这个我已经从道生一这个例子说明,你到网上搜索一下去年年底凤凰卫视的世纪大讲堂,专门有对这些对老子误读的批判。

我们的世界和老子的世界完全思维不同,否则中华文明也几千年了,至今再没出现过老子那个时代思想昌盛,关键是,我们还对昌盛思想不认同,不去从多角度理解,不自谦自己的渺小,这是真正的愚。
[该贴被banq于2009-03-26 20:00修改过]

老子谈的愚民的“愚”,不是我们通常意义的愚蠢 没有文化的意思,相反,这个“愚”是指自视甚高,不虚怀若谷,有了一点文化就目空一切,如果很多人都是这样,而唯独君主或君子必须独醒,不能和他们昏昏然,必须保持低调厚道,虚怀若谷,这样就时刻能够接纳各种信息进来,也就是说:必须终身学习,对新鲜事物存有好奇,然后研究学习,骄傲使人落后,谦虚使人进步。这些道德观一直流传至今。

在中国哲学思想上一直就有“象数之争”,而面向对象和面向数据库之争也可以归结为象数之争,“象”意指直觉 象图之意,“数”意指数字。“面向对象”中“象”字,也有直觉、图象UML建模之意,四色图就是明显地用四种颜色之象来阐述需求;数据库则有数字、数学、数据结构、算法等特征。

老子道德经 中医、周易、五行农历等这些中国文化其实都来源于伏羲大禹时代的河图洛图,但是作为中华文明之源的河图洛图却一直有象数之争,到底河图和洛图哪个是象哪个是数就一直有争论,由此可见,面向对象和面向数据库表面上是软件领域问题之争,实际背后是人类认知世界的两大基本方法思维方式。

我个人认为:象数各有所长,象能观趋势,适合表达变化复杂大局;而数是量化,精确,能够精确到点,但对付变化则力不足,或就变得复杂笨拙。对付经常变化的需求,无疑面向对象的分析方法如四色图等象法能够帮助我们迅速抓住全局,避免盲人摸象,而数则在软件运行时起量化作用,数据库则能记录各种变化,并长久保存,数和象之间关系就象点和线一样,线可以细分成点数,而点数个数一多,就成线或成面,形成趋势,总体。

象数区别实际就是知识层面和操作层面的区别,比如中医侧重象,望闻问切,从人体这样一个复杂系统的总体关系上诊断,而西医则是量化,细分方式,哪里不行就动手术,拆了或换了它,这就会造成头疼医头,脚疼医脚的问题,这是数侧重微观细部的不足,而中医因为量化不够,被一些所谓“科学”人士不认同,甚至要废除,走向数的极端。

搞软件的更应该清楚象数先后之分,使用面向对象从知识层面去抽象分析需求,而数据库则是操作实现层面技术,切不可混同关系,用操作层面的数去替代知识层面的象,这样分析设计出来的软件能够不失败吗?

象为道,数为术。

象为道:大象无形,大道无痕,此是无;
数为术 故曰“术数” "算术",此为有。
道术层面完全不一样,无生有!

象:四色图:


[该贴被admin于2009-03-30 10:25修改过]

谢谢banq老师。讲的很明白,但是我目前的疑惑是如何去做到真正面向对象?
就像中西医的比较,西医相对容易入门,头痛医头脚痛医脚,有个索引就能治:)。而中医必须要全盘考虑人体的平衡,这就需要中医需要对人体的透测了解,同病不同药,这些就对医生的要求很高了,入门比较难。
学习面向对象,我的感觉是理论略有了解,也知道他的好处了。可是进一步如何实施,(因为一实施就会偏了)而且好像现在面向对象数据库也是雷声大雨点小,很难实用化的样子。请banq老师帮忙引导入门一下。谢谢!

面向对象数据库其实是把象和数结合在一起,这两者完全不是两个东西,水火阴阳不容的。

在实施中很难做好,在象的指导下,进行数的实现,这个问题不只是软件,很多领域都存在这个困难,比如股票下降趋势中的反弹大涨,你是否全仓参与呢?这个风险是很大的,因为象是下降,涨只是一个点数,这就是象数结合应用的难点。

我们只要整个项目参与者头脑里认识到做软件,犹如股票投资一样很难把握,那么项目成功可能性就很大,否则,盲目乐观,以为编软件只是小儿科,这种愚民思想必然招致失败。

具体OO分析设计层面上,可参考我在本站宣扬的四色原型 Evans DDD和设计模式等等,将数据库牢牢置于这些设计层面的下层,让数据库设计操作都听命与这些分析设计方法就可以。
[该贴被banq于2009-03-30 10:41修改过]

经典!!

其实面向对象和面向数据就应该象banq讲的这样用

两者排斥了,都是极端。关键是分量的轻重要掌握好

没有完美的个人,只有完美的团队
[该贴被spring7777777于2009-03-30 16:50修改过]

是否不同类别的业务软件适合用不同的方法?

比如信息系统、电子商务、电子政务等记录信息为主,有些还有比较强的统计分析目的,而且业务操作也比较简单,是否这些更适合用“面向数据库”这套思路?

而像编辑器、中间件这些软件更适合用“面向对象”?

>是否不同类别的业务软件适合用不同的方法
你可能还不没有了解我前面讲的象数区别,象能够帮助迅速识别全貌,软件是业务在计算机环境中镜像,或者说,软件是我们在计算机环境这张画布上临摹现实业务画的一张画,我们是画家,也就是软件人员,那么如何识别全貌这个能力对于我们很重要。

>信息系统、电子商务、电子政务等记录信息为主
MF说了:企业软件等大部分软件都是跟踪记录为主,跟踪钱就成电子商务 财务系统,跟踪文件就成了电子政务,跟踪物就成了进销存信息系统,这些系统细节都是使用数据库数据来跟踪记录信息的,这是数,但是他们的诞生都是从象分析开始,MF专门的"分析模式"就谈了如何用OO来分析这些跟踪系统,并提出记账 库存等跟踪模式。

>还有比较强的统计分析目的,而且业务操作也比较简单
MF专门的"分析模式"中就谈了测量和观察模式,就是用来进行统计分析的,医院里有大量化验,如何帮助医生分析这些实验数据?销售公司不同参数就得出不同的统计结果,如何帮助决策人员比较分析这些结果,找到导致业绩变化的原因和本质,这些MF都提炼专门的分析模式。

面向对象大师MF在'分析模式'的前言中说了:通过本书的模型同David Hay的模型进行比较,会很强烈地感受到软件技术如何影响概念建模(banq:软件技术不应该影响业务概念建模,这是常识),我们都尽力想建造概念模型,然而我们的结果却有很大的不同,因为他使用的是关系技术,而我使用面向对象技术。

[该贴被banq于2009-04-01 15:23修改过]

1. 面向对象和面向对象本质上都是对数据做操作,数据+算法=程序,这是不变的本质
2. 面向对象讲究的是类的设计,类=数据+操作,更关注类与类之间的协作
3. 面向数据库讲究的是数据的组织,怎么组织能更好的管理数据

以上是个人理解

>面向对象和面向对象本质上都是对数据做操作,数据+算法=程序,这是不变的本质

这个非常不认同,不能说面向对象本质是对数据操作,数据+算法!=程序,可以这么说: 数据+算法=科学计算程序
加个定语,但也不一定准确,其实科学计算程序也是需要维护的,除非这个科学计算程序是做样子的,做出来就宣布填补空白,然后就不发展,这样可以适用这个等式。

数据+算法可以组成一个能够运行的程序,但是程序只能运行就可以了吗?如果是,那么我们谈模式 谈架构这些干什么呢?我们需要软件的维护性拓展性干什么呢?其实很多软件外行人都存在对软件错误认识,以为软件做出来就可以了,科学界是被国家养的,可以玩些欺骗花样,管理软件 企业软件 网络软件的老板可是私人老板,不是做出来就可以的,还是要不断发展改变,甚至改变发展的成分大于原来的,因为企业和应用需求是不断变化的,如果有人搞出算法能够对付万千变化,那么他超过爱因斯坦 霍金,他们一直致力于TOE万有定理的推算,等TOE出来,你们再叫嚷,用XXX算法可以对付一切变化了,我看你那时也成了上帝,有这种观点的人就是老子所称的愚民。

其实大家从教科书得出这个幼稚的认识是正常的,这也不是靠我在这里呼吁就能改变的,我人轻言微,我是狗屎,不想再说,不过,只要“数据+算法=程序”在Jdon出现一次,我就骂它个臭狗屎(注意 不是骂人,是骂这个观点,尊重每个人发表观点,来Jdon也是讨论学习的,都平等)。

到底什么是软件不变的本质?只有应付变化的方法手段才是不变的本质,但是为什么我们有人看本质看错了呢?还是因为“数”的影响,线是由点数组成,所以有人就说:线的本质是点数,可是我们如果谈论一个没有任何意义的线,还去研究它本质,本身就是愚人做法,我们要看到线背后的“无”,大象无形,不要因为无形,你就不认为它存在,甚至本末倒置,这就是盲人摸象,一叶障目成语由来。

btw:这里有一个小故事:
1687年,牛顿出版了自己最著名的著作《自然哲学的数学原理》,在这本深奥难懂的书中,牛顿用数学方法证明了万有引力定律和三大运动定律,这四大定律被认为是“人类智慧史上最伟大的一个成就”(banq按:这是数的成就),然而这个著名的科学家在12年之后成为了英国皇家铸币局的局长,并工作长达30年之久,1717年,牛顿将黄金价格定为每金衡盎司3英镑17先令10又二分之一便士。从此英镑按黄金固定了价格。

后来出现“南海泡沫”,连大名鼎鼎的科学家牛顿也禁不住购买了蓝海公司股票,当年作为皇家铸币局局长的牛顿年薪为2000 英镑,这笔钱能够建造4个格林威治天文台,然而随着蓝海股票泡沫破裂,牛顿损失超过2万英镑,事后,他不无伤感地写道:我可以准确地计算出天体的运动规律,但我却无法计算出股票市场的变化趋势。

从这个故事看出,软件需求的变化和股票市场变化是一样纷乱没有规律(在当前人类有限“数”能力前提下),但是这不代表我们不能从事软件开发和股票投资,只是必须在这个时候需要象数结合。

搞数学搞多了的人都强调直觉,其实直觉和数学是矛盾的,前者是象后者是数,这些都说明,在对付变化上面,只有“数”算法是不够的,算法能完成某个伟大功能,但是不能应付未来变化,这是基本科学常识,正是因为其具化,就不可能泛化。

真是,我现在成了中学教师,普及基础哲学常识,其实这些道理应该学校老师教的,结果现在应试教育和学好数理化,走遍天下都不怕的教育畸形,很多人中学毕业了,对待科学什么能,什么不能都不知道,盲目迷信科学了,这也是迷信啊。


[该贴被banq于2009-04-06 16:04修改过]