您的位置:知识库 » 软件设计

OO真经——关于面向对象的哲学体系及科学体系的探讨(中)

作者: T2噬菌体  来源: 博客园  发布时间: 2009-04-13 09:48  阅读: 4284 次  推荐: 0   原文链接   [收藏]  
摘要:要想真正描述一个世界,仅有结构式不行的。开始我们说过,世界观主要关注两个方面:一是世界是什么样子的(结构),另一个就是世界时如何演进的(运作)。现在,我们来讨论对象论中关于世界运作的理论。
[1] 世界本没有类
[2] 程序世界
[3] 依赖是如何被倒置的
6.4、程序世界——封建的专制世界

      上文描述了程序世界是多么多么美好,不过如果有一天,你真的跑到里面去了,你可就惨了。不信看下面。话说你一进程序世界,就迫不及待想在程序世界里找个漂亮的女朋友,可以吗?对不起,不成!你想吃法国大餐,对不起,不成!你想上最好的大学,对不起,不成!……搞什么!不是说程序世界什么都可以得到吗。没错,除了选择权!

      程序世界里的对象没有选择权。

      为什么会这样?因为如果对象有选择权,就没法贯彻OCP了!你要是活在程序世界里,不但给你包办婚姻,连吃饭、上学……一切的一切,你都得服从包办,对象一点点选择权也没有。至于谁给你包办的,那是后话。
      看了这些,你还敢去程序世界吗?不过这还不是最恐怖的,告诉你更恐怖的一点:

      程序世界里的对象不认识对象。

      没错,良好的面向对象提倡对象不认识对象!很不可思议?其实,这就是所谓的“低耦合”,我们喊了那么多年的“低耦合”,到底什么是低耦合?所谓低耦合,就是先剥夺对象的选择权,再剥夺对象的感觉。对象间谁也不认识谁,只知道对象能提供什么服务。
      我们现在了解了程序世界是什么样子了,下面,我们讨论程序世界为什么要这样。

6.5、有奶就是娘

      中国有句俗语,叫“有奶就是娘”,往往用来讽刺那种六亲不认,两面三刀,谁给好处就跟谁的无耻小人。不过,面向对象可是非常提倡“有奶就是娘”的行为。如果我们的程序都能做到“有奶就是娘”的地步,那就真是实现了“低耦合”这一教义了,套用梁朝伟的话,在程序世界里,有奶就是娘的行为“是美德”。

      要理解上述道理,我们要先抛却我们脑中的道德、廉耻等概念,从本质上看看“有奶就是娘”体现了什么哲学道理。
     “有奶就是娘”,纯从字面解释,是说任何一个人,只要能给奶喝,就当做自己亲娘。上升到哲学层面,是说这么一个意思:不以其他对象实体本身为交互准则,而以其他对象的行为作为交互准则,与一个对象是否进行交互纯粹是从其行为判断,而不对对象本体有任何概念。
      这种处事哲学,在现实生活中是最被人鄙夷的,但在程序世界里确是最提倡的。如果一个程序世界里,所有对象都能以“有奶就是娘”的哲学去处事,那么,这就是一个最美好运作方式。

6.6、接口横空出世

      上文说到,程序世界中提倡的运作方式是“有奶就是娘”的方式,但要真正实现这种方式,似乎还少点东西。我们回顾一下,世界本来只有对象,我们从对象中抽象出了类,这就是目前我们眼中的世界。这样,我们的交互,要么以对象为准则,要么以类为准则。
      以对象为准则,显然是不行的,因为我们说了,对象间根本互不认识。以类为准则,理论上可行,但这样有问题,就是类本身是对象“实体的抽象”,是为了更好记忆、描述和认识世界而创建的对象,归根到底,还是“实体”范畴的概念,所以在哲学上还是和“以行为作为交互准则”向左。

      认识到以上困难,就能认识到,目前我们的世界还无法实现以行为为交互准则,于是,我们需要为世界再衍生一些内容。第二章说过,世界本身只有对象,而衍生其他概念的基本方法是抽象。所以,这里我们当然要用抽象衍生一些概念出来。进一步,类是对象“实体”的抽象,而我们需要的是以行为为交互准则,很自然的,我们完全可以创建一种新概念,这种概念是行为的抽象,这种新概念,就是接口(Interface)。

      接口(Interface):对象行为的抽象。

      这里要说明,接口和类虽然都是从对象上通过抽象衍生出的概念,但两者本质不同,是从对象的两个不同的哲学角度和动机,抽象出的不同概念,并形成世界两个完全不同的方面(Aspect)。至于两者具体有什么区别,下一小节详细讨论。

6.7、接口 vs 抽象类

      经常有朋友迷惑一件事情,抽象类和接口有什么区别?何时使用抽象类,何时使用接口?但从功能来讲,抽象类完全可以代替接口,那为什么还要有接口呢?这一小节来分析这些问题。

      这里附带说一个问题,产生这种疑惑的原因,大多是因为朋友们已经习惯了学习一个东西时,只看其什么样子?怎么用?而不习惯于弄清楚一个东西起源于哪?出现的动机是什么?其实,要想学好、用好任何一个东西,后两个问题更关键一些。
      举个例子,有人发明了吹风机,我们如果只搞清楚其是什么样子——“有个把手,有个吹风筒”,以及怎么用——“打开按钮能吹出热风,关闭按钮就停止了”。如果我们只搞清楚这些,那么我们八成用不对这个东西,为什么?因为我们根本不知道这东西是怎么来的,它为什么要被发明出来。也许我们天天拿他吹脸取暖或吹衣服,还一派洋洋得意以为用的很好的样子。殊不知这东西其实是用来吹头发帮助头发快点干起来的。
      不要笑,这种事经常发生在我们身上。因为在软件开发中,有太多的东西,我们只顾着学习其是什么样子,怎么个用法,也许就像吹风机一样,这些并不复杂,然后我们就把它用到不该用的地方,还以为自己用得很好。
      用不用得好吹风机,不在于是否熟练掌握开开关关,而在于是不是用它吹头发。同理,任何东西用得好不好,不在于是不是熟练掌握用法,而在于是不是用对了地方。而要想用对地方,就要弄清楚这个东西的“怎么出来的”和“出来是做什么用的”。

      说了挺多,我们回到接口和抽象类的话题上来。
      首先要说明一点,“抽象类(Abstract Class)”和“类(Class)”在哲学意义上没什么区别,其区别仅仅是实现层面上的,即抽象类只不过是一种特殊的类,编程环境强制不准这种类生成实例,哲学意义上两者没有任何区别。所以,从哲学层面讨论“抽象类与接口对比”和讨论“类与接口对比”是等价的。

      类与接口的不同点有以下几点:
      I. 抽象范畴不同。类是对象“体征”的抽象,接口是对象行为的抽象。
      II. 抽象动机不同。抽象出类是为了帮助记忆、认识世界,抽象出接口是为了实现低耦合交互。
      III. 关注不同。类关注共同的体征,接口关注用来交互的行为。
      IV. 存在范畴不同。类存在于抽象层次树上,接口存在于接口网。
      V. 应用范畴不同。类应用于结构范畴,是静态概念,接口应用于运作范畴,是动态概念。

      上面的条目有点学术了,通俗说来,类是从对象实体的的体征范畴上抽象出来的,用来帮助我们记忆、分析世界不同的对象,主要表明对象“什么样子”;而接口是从对象交互时需要的行为中抽象出来的,关注对象交互时需要的行为。
      还是举个例子吧。
      例如,有一群具体的司机和好多辆具体的汽车,我们可以从司机中抽象出“司机”这个类,从汽车抽象出“汽车”这个类,这种抽象是“体征范畴”的,抽象的目的仅仅是帮助记忆、认识,完全和交互没有关系。而当考虑到交互——司机需要驾驶汽车,于是抽象出一个“可驾驶”这个接口。注意,一但“可驾驶”这个接口被抽象出来,就完全和司机以及汽车没有关系了,除了汽车,拖拉机、轮船、飞机都可以实现这个接口,而不一定是司机,会开车的任何人都可以通过“可驾驶”这个接口去驾驶任何实现“可驾驶”接口的东西。这样一来,“驾驶”这种交互就完全取决于这个接口了,这就是“以行为为交互准则的意思”。

      如果明白了这一小节的内容,相信大家再也不会被“接口和类有什么区别?”、“何时使用抽象类,何时使用接口?”这样的问题迷惑了,而可以挥洒自如的在系统中正确使用接口和类。一个方法:拿不准的时候问问自己,这个抽象是体征抽象还是行为抽象?是为了记忆、分析、设计还是为了交互需要?想明白,再下手。

0
0
标签:面向对象

软件设计热门文章

    软件设计最新文章

      最新新闻

        热门新闻