冒號(hào)和他的學(xué)生們(連載7)——對(duì)象范式

          冒號(hào)和他的學(xué)生們

          ——程序員提高班紀(jì)事

          1. 對(duì)象范式

          民為貴,社稷次之,君為輕                                            ——《孟子·盡心下》

           

          短憩之后,引號(hào)迫不及待地問:“面向?qū)ο蟮姆妒綉?yīng)該是一種特殊的命令式吧?”

          “面向?qū)ο螅?#8221;冒號(hào)咕噥著,“姑且稱之為OO或?qū)ο笫桨桑炔粯?biāo)新立異,也不以訛傳訛。在回答你的問題之前,請(qǐng)先回答我的:什么是OOP?”

          引號(hào)應(yīng)答如流:“OOP是一種計(jì)算機(jī)編程模式,它以對(duì)象作為問題空間的基本元素,利用對(duì)象和對(duì)象間的相互作用來設(shè)計(jì)程序。所謂對(duì)象,是實(shí)際問題中實(shí)體的抽象,具有一定的屬性和功能。OOP的三個(gè)基本特性是:封裝性、繼承性和多態(tài)性。所謂封裝性就是——”

          冒號(hào)作了個(gè)暫停的手勢(shì):“OOP的的基本特性相信大家早就耳熟能詳了,那么根據(jù)你剛才的定義,能否得出OOP一定是命令式的結(jié)論?”

          引號(hào)歪頭想了一陣,答道:“從定義上好像并不能得出,難道C++JavaC#不是命令式的嗎?”

          冒號(hào)回答:“當(dāng)然是,但這不妨礙Clos成為OO版的Lisp,而Prolog也有不少融入OO特征的擴(kuò)充,如Visual PrologLogtalk等。OOP雖然是在命令式的基礎(chǔ)上發(fā)展起來的,但其基本思想可泛化為:以數(shù)據(jù)為中心組織邏輯,將系統(tǒng)視為相互作用的對(duì)象集合,并用繼承與多態(tài)來增強(qiáng)重用性。這種思想也能應(yīng)用到函數(shù)式和邏輯式中,只不過對(duì)象的方法從命令式中的過程分別換成函數(shù)式中的函數(shù)和邏輯式中的斷言罷了。大致說來,命令式、函數(shù)式和邏輯式互相平行,而OOP與它們正交。”

          問號(hào)提問:“OOP已經(jīng)成為一種潮流,上堂課列舉的十二種流行語言中只有C不是OO的,這是否意味著OOP將要一統(tǒng)天下?”

          “嚴(yán)格說來,VBVB.NET除外)和Javascript也不是OO的,只是基于對(duì)象的(Object Based)。” 冒號(hào)糾正道,“至于OOP是否會(huì)一統(tǒng)天下,答案是否定的。首先,純粹的OOP是不存在的,必須結(jié)合其他范式,只有三類最基本的范式能獨(dú)當(dāng)一面;其次,世上沒有包治百病的萬靈丹方,OOP也不例外。需要指出的是,語言和范式的流行,與大公司支持和商業(yè)推動(dòng)是密切相關(guān)的。有人說OO其實(shí)是MOMoney-Oriented),雖有過激之嫌,但有經(jīng)驗(yàn)的股民都知道,有主力運(yùn)作的股票總是漲得快一些的。當(dāng)然OOP能流行,自有獨(dú)到之處,誰能說說它到底好在哪里?”

          逗號(hào)搶答:“OOP能提高軟件可重用性、可擴(kuò)展性和靈活性。”

          冒號(hào)反問:“為什么過程式編程的可重用性、可擴(kuò)展性和靈活性就差呢?”

          感到來者不善,逗號(hào)有點(diǎn)發(fā)虛:“因?yàn)?/span>OOP具有信息隱藏、繼承和多態(tài)的特征。”

          冒號(hào)并不買帳:“首先,將可重用性、可擴(kuò)展性和靈活性與OOP劃等號(hào),是只見樹木,不見森林——那是所有范式和語言的共同目標(biāo)。其次,以C語言為例,信息隱藏可用關(guān)鍵字static來實(shí)現(xiàn);繼承可用合成( composition)來代替;多態(tài)雖然困難些,也有變通之法。更何況這些只是手段而非目的,只要設(shè)計(jì)合理,C程序同樣具有可重用性、可擴(kuò)展性和靈活性,性能效率還更優(yōu)越。即使在OOP日益風(fēng)行的今天,C的占有率始終穩(wěn)踞前列,許多大型復(fù)雜軟件如操作系統(tǒng)、數(shù)據(jù)庫等仍以C為主,這足以證明其仍堪大用。”

          見逗號(hào)有些理屈詞窮,冒號(hào)語氣放緩:“請(qǐng)不要誤解,我并非OOP的反對(duì)者,相反今后還要重點(diǎn)討論它。但我希望大家少一點(diǎn)照本宣科和人云亦云,多一點(diǎn)獨(dú)立思考和批判精神。”

          稍作停頓,冒號(hào)繼續(xù)發(fā)問:“過程式編程與OOP在設(shè)計(jì)理念上有什么區(qū)別?”

          “過程式編程理念是重在過程,自頂向下,逐步求精。”引號(hào)一出口就自感有些“照本宣科”,見冒號(hào)正用鼓勵(lì)的目光看著他,這才繼續(xù)說下去,“OOP則正相反,重在數(shù)據(jù),自底向上,逐步實(shí)現(xiàn)。”

          冒號(hào)首肯道:“如果把整個(gè)流程看作一顆倒長的大樹,過程式編程自樹根向下,逐漸分支,直到每片樹葉,類似數(shù)學(xué)證明中的分析法,即執(zhí)果索因的逆推法;OOP則從每片樹葉開始,逐漸合并,直到樹根,類似數(shù)學(xué)證明中的綜合法,即執(zhí)因索果的正推法。”

          句號(hào)心領(lǐng)神會(huì):“倘若把樹根看成主函數(shù),離樹根越近,離用戶需求也越近。如果用過程式編程,由于是逆推法,樹干改變?nèi)菀讓?dǎo)致樹枝相應(yīng)改變,因此一旦用戶需求發(fā)生變化,可能會(huì)從樹根波及到樹枝甚至樹葉,維護(hù)起來殊為不易。相反OOP從樹葉開始設(shè)計(jì),離用戶需求較遠(yuǎn),抽象程度較高,受波及的程度較小,因此更易維護(hù)和重用。”

          冒號(hào)拊掌贊道:“好極了!”

          問號(hào)不解:“您剛才不還說C程序同樣具有可重用性嗎?”

          冒號(hào)微微一笑:“數(shù)學(xué)中分析法與綜合法往往是結(jié)合起來使用的,過程式編程與OOP也是如此,只不過各有偏重罷了。句號(hào)的一番話雖不無道理,但也授OOP的反對(duì)者以口實(shí):OOP鼓吹的可重用性來自‘自底向上’的設(shè)計(jì)模式,而這種模式并非OOP的專利。其實(shí)軟件設(shè)計(jì)的最重要的并不是語言,也不是范式,而是抽象思維和前瞻思維。”

          嘆號(hào)不甘寂寞,插言道:“OOP以對(duì)象為基本模塊單位,而對(duì)象是現(xiàn)實(shí)中具體事物和抽象概念的模擬,這使得編程設(shè)計(jì)更自然更人性化。”

          “深合吾意!”冒號(hào)揮動(dòng)著右手,“盡管OOP最大的賣點(diǎn)是其高度的可重用性,相比其他范式卻并不具明顯優(yōu)勢(shì)。但它更接近人類的認(rèn)知模式,編程者更容易也更樂于用這種方式編程,這是它深入人心的一個(gè)重要原因。比較一下兩種用法:.吃(草)吃(牛,草),哪種更接近人類思維?”

          有人在下面嘀咕:“如果把牛換成狗,那么一個(gè)是狗吃屎,一個(gè)是吃狗屎。”

          全班捧腹。

          冒號(hào)也忍不住笑了:“OOP人性化的另一表現(xiàn)是其接口簡潔易記。看看Win32 APIUnix API等之類操作系統(tǒng)接口或OCI之類的數(shù)據(jù)庫接口,函數(shù)的參數(shù)動(dòng)輒七八個(gè)甚至上十個(gè),函數(shù)名和數(shù)據(jù)結(jié)構(gòu)成員也多冗長晦澀,既難記又易錯(cuò)。相比之下,相應(yīng)的JavaAPI顯然平易近人得多。”

          問號(hào)刨根問底:“為什么CAPI不能象Java的那么簡潔呢?”

          冒號(hào)釋疑:“單純這么比較其實(shí)對(duì)C并不公平,因?yàn)?/span>JavaAPI雖然簡潔易用,但功能上與相應(yīng)CAPI并不等同,換句話說,Java接口粗粒度化了。”

          “接口粗粒度化?”引號(hào)質(zhì)疑道,“就是把一些函數(shù)包裝起來吧?我們也可以用C將操作系統(tǒng)、數(shù)據(jù)庫之類的API再包裝一下。”

          “事實(shí)上許多軟件公司都曾這樣做過。”冒號(hào)頷首作答,“但C函數(shù)不像Java對(duì)象,本身沒有狀態(tài),只有依靠參數(shù)傳遞或外部變量來維持相關(guān)函數(shù)之間的聯(lián)系,包裝后的接口肯定不如Java簡潔,但應(yīng)該比Java高效。說白了,OOP就是將相關(guān)的函數(shù)用數(shù)據(jù)粘合,重新包裝后再貼上對(duì)象的標(biāo)簽。從這種角度上看,與其說OOP更具重用性,不如說更具易用性。”

          嘆號(hào)狐疑道:“OOP并不更具重用性?這可是它的金字招牌啊!”

          冒號(hào)冷哼一聲:“不要被金字招牌晃暈了眼,我來問你:是收音機(jī)、電視機(jī)之類的電器產(chǎn)品更具重用性呢,還是與電阻、電容之類的電器元件更具重用性?”

          “當(dāng)然是電器元件啦。”嘆號(hào)沖口而出。

          冒號(hào)因勢(shì)利導(dǎo):“每個(gè)電器元件具備單一的功能,正如過程式中的函數(shù);每個(gè)電器產(chǎn)品是對(duì)多個(gè)相互關(guān)聯(lián)的電器元件的封裝,正如OOP中的對(duì)象。同樣的電器元件可用于不同的電器產(chǎn)品,具有高度的可重用性,而電器產(chǎn)品重用性低,但易用性高。”

          眾人猶自將信將疑。

          “對(duì)一個(gè)沒有獨(dú)立思考習(xí)慣的人來講,與其說他認(rèn)同一個(gè)理論,倒不如說他認(rèn)同該理論倡導(dǎo)者的權(quán)威。而在他仰視權(quán)威的同時(shí),也把自己的思想交托給了權(quán)威。”冒號(hào)頗具犬儒之風(fēng),“你們可以懷疑我的觀點(diǎn),但絕不可放棄自己的思考。關(guān)于OOP今天就談到這里,最后我們引進(jìn)一個(gè)新視點(diǎn)。過程式編程的模塊以函數(shù)為單位,OOP的模塊以對(duì)象為單位,二者的區(qū)別是:函數(shù)是被動(dòng)的實(shí)體,對(duì)象是主動(dòng)的實(shí)體。過程式程序的世界是君主制的,主函數(shù)是國王,其他函數(shù)是臣民,等級(jí)分明,所有臣民在聽命于上級(jí)的同時(shí)也對(duì)下級(jí)發(fā)號(hào)施令,最終為國王服務(wù);OO程序的世界是民主制的,所有對(duì)象都是獨(dú)立而平等的公民,有權(quán)利保護(hù)自己的財(cái)產(chǎn)和隱私并向他人尋求服務(wù),同時(shí)有義務(wù)為他人提供承諾的服務(wù),公民之間通過信息交流來協(xié)作完成各種任務(wù)。”

          眾人頓覺耳目為之一新。

          posted on 2008-05-07 00:05 鄭暉 閱讀(2496) 評(píng)論(15)  編輯  收藏 所屬分類: 冒號(hào)和他的學(xué)生們

          評(píng)論

          # re: 冒號(hào)和他的學(xué)生們(連載7)——對(duì)象范式 2008-05-07 10:50 viMory

          引號(hào)占位學(xué)習(xí)中 ^_^  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載7)——對(duì)象范式 2008-05-07 12:33 dennis

          不知道樓主是做什么的?這個(gè)系列很有意義  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載7)——對(duì)象范式 2008-05-07 15:29 Lone_wolf

          看了這么多了,今天是我第一次發(fā)表評(píng)論..呵呵
          期待樓主的更新..  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載7)——對(duì)象范式 2008-05-08 09:12 kawaii

          冒號(hào)老師舉的例子很生動(dòng)!  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載7)——對(duì)象范式 2008-05-11 10:37 Happy漫步者

          哈哈 太經(jīng)典了 繼續(xù)  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載7)——對(duì)象范式 2008-05-14 14:13 lanser

          大樹的例子很生動(dòng),尤其是把用戶需求拿樹根做比喻這一段,請(qǐng)?jiān)试S我引用,當(dāng)然我會(huì)提前說明“老冒有一個(gè)很好的例子...” :p  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載7)——對(duì)象范式 2008-06-24 19:40 kooyee

          smalltalk不是純粹的OOP嗎?  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載7)——對(duì)象范式 2008-06-24 19:52 鄭暉

          @kooyee
          本文中‘純粹的OOP’并非指一般意義上的‘pure OOP’,而是指‘單純’的不含其他范式的OOP。Smalktalk的OO的確比Java還純,但仍具有命令式的特征(如賦值、迭代等)。(請(qǐng)參見原文中一句話“純粹的OOP是不存在的,必須結(jié)合其他范式”)  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載7)——對(duì)象范式 2008-07-08 18:14 akari

          那個(gè)分析法和綜合法指的是演繹法和歸納法吧。  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載7)——對(duì)象范式 2008-07-08 18:42 akari

          不好意思,上面說錯(cuò)了。分析法和綜合法是對(duì)的。  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載7)——對(duì)象范式 2008-07-08 18:44 akari

          暈死,連地方都發(fā)錯(cuò)了,明明是上一篇的嘛。再次對(duì)不起。:)  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載7)——對(duì)象范式 2008-07-08 18:55 鄭暉

          @akari
          分析法與歸納法、綜合法與演繹法相似但不相同。綜合法從已知求證,演繹法從一般特殊;分析法從求證倒推已知,歸納法從特殊推倒一般。只有在求證命題是已知命題的特殊情形時(shí),它們才有重合之處。但這并不總成立。比如,對(duì)于兩個(gè)等價(jià)命題而言,它們可以彼此互推,但不一定有一般與特殊之分。   回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載7)——對(duì)象范式 2008-07-14 03:40 okayhilter

          建議 打個(gè)包。。。。。。
          非常想要啊。如果不可以,能不能發(fā)份給我。。。 ~ ~   回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載7)——對(duì)象范式 2008-07-14 03:40 okayhilter

          忘了 ...okayhilter@gmail.com~  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載7)——對(duì)象范式 2008-07-14 09:50 鄭暉

          @okayhilter
          請(qǐng)點(diǎn)擊右欄桔黃色公告進(jìn)入“關(guān)于《冒號(hào)和他的學(xué)生們》”,可下載rar。有問題請(qǐng)告知。  回復(fù)  更多評(píng)論   

          導(dǎo)航

          統(tǒng)計(jì)

          公告

          博客搬家:http://blog.zhenghui.org
          《冒號(hào)課堂》一書于2009年10月上市,詳情請(qǐng)見
          冒號(hào)課堂

          留言簿(17)

          隨筆分類(61)

          隨筆檔案(61)

          文章分類(1)

          文章檔案(1)

          最新隨筆

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 福建省| 天长市| 湖州市| 连平县| 凤阳县| 北宁市| 会宁县| 陆川县| 涞水县| 彭水| 茶陵县| 公安县| 平武县| 阆中市| 成都市| 自治县| 柳州市| 和平县| 抚州市| 新巴尔虎右旗| 通山县| 哈尔滨市| 曲沃县| 黄陵县| 越西县| 苍南县| 仁布县| 沂源县| 皋兰县| 吴江市| 革吉县| 黄浦区| 兖州市| 湄潭县| 阳曲县| 南昌市| 灌阳县| 兴仁县| 宜宾市| 从江县| 凯里市|