也乱弹Book.Save而引OO对话

这几天博客园热闹的几乎是OO讨论.我在这里不会详细解说何为OO.因为我对OO的概念也是一层薄纸,只要随便一捅就很容易穿的……

而我写此随笔主要是我刚看了亚历山大同志的“谈谈book.Save()到底OO还是不够OO ”,下面引用作者的几句话:
如果是EditBook.aspx.cs中出现了book.Save()那么我觉得是不符合OO设计的思想的,因为保存书的行为确实不是书本身发出的。但是,如果有一个用户类User,在User里有个UpdateBook的方法,在这个方法里出现了book.Save(),那么我认为这是很OO的

看来作者对Book.Save()方法是否OO的决定因素则是此方法在哪个行为层出现,这里类似把Book.Save给适配隐藏一下就是OO了,是否正确我不评论,我再引用一下两个人的评论:

# re: 谈谈book.Save()到底OO还是不够OO 2007-09-19 20:54 STS

book.Save是什么意思, 是把編程里的數據保存了, 還是描述現實中把書放回書架??

沒搞清編程和現實的區別,根本不能談OO.


# re: 谈谈book.Save()到底OO还是不够OO 2007-09-20 09:37 dali

你们觉得是
Math.Abs(-1)
OO呢, 还是
-1.Abs()


这里重点的则STS的评论,编程界为什么会出现OO?这是因为程序员想借用OO在程序里来描述一个真实的现实世界。而亚历山大同志的那个Book.Save例子则似乎只是一个数据进库的动作而已,这里为什么却要与OO拉上关系呢?而如果真的想用来描述现实,那也许亚历山大同志的本意则可能是某个用户将某本书入库了,那这样看来行为者则是用户而非书本,但为什么却将书本变为行为者了呢?

下面再谈谈dali的评论,第一个则只是一个包装,类似于亚历山大同志说的将Book.Save方法放于User类去调用一样,第二个-1.Abs()则是用于描述现实世界,因为-1可以看成是自然界里的某个物体,所以它拥有自己的特性动作,这也就是为什么Ruby称自己是“一个真正的面向对象的语言”原因……


2007年09月21日13:43分添注
看了评论,却发现各位还继续停留在book.save这个方法里,在这里我说明一下,我发这文章的本意是:当想用OO描述某个动作时必须区别哪个才是真正的行为者,这才是真正的OO想表达的(注意红色部分,书本不可能有自己入库的能力这是大家都所知道的事实,所以Save(入库)方法在书本本身出现则是不太现实的,这也就是我为什么引用STS的评论原因,他的那句话才是重点。)

2007年09月21日18:30分添注
本来不想讨论book.save对与否的.但看到评论基本都还是围绕着这个,那我将我在亚历山大同志那里回复说的例子转过来吧,希望大家能明白我这里真正想说是要区分对象的"行为者"是谁,才是OO想表达的东西..

# re: 又见手把手系列-面向对象扫盲-通俗的OO第一弹-【封装】 2007-09-21 18:22 Kingthy

观点同@老翅寒暑

假如有A报摊和B报摊,现有一份报纸C,你说C送哪个报摊好呢?根据你的文章,你的选择只有一种就是C内部定义的Save方法.即不是放到A就是B报摊(因为C是一个行为者,所以只能决定一种情况).而如果再继续分出一个BookManager,则此时C的最终去处就是由BookManager来决定的.所以BookManager可以根据情况来决定送给A还是B了..也许你可以说也可以在C的内部方法Save做条件处理啊,但假如不只是有限的报摊A和B,而是有很多(现实就是这样有很多不确定性因素)那你这里的Save方法又怎么办呢?大家都知道现实的情况是如果一份报纸发版后是不可能再重更改印刷的,而行为者由BookManager施发则不同,我们可以实现不同的Manager(就好比添加不同的送报员).因为不会破坏Book的数据定义....

posted @ 2007-09-21 11:04  Kingthy  阅读(2952)  评论(17编辑  收藏  举报