<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    冒號課堂§2.3:對象范式

     

    冒號課堂

    第二課 重要范式(3)

     

    2.3對象范式——民主制社會的編程法則

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

    關(guān)鍵詞:編程范式,OOP,面向?qū)ο?/span>,過程式編程

    摘要: OOP簡談

     
    ?提問  

    • OOP是一種特殊的命令式嗎?
    • OOP的基本思想是什么?
    • OOP到底好在哪里?
    • OOP將要一統(tǒng)天下嗎?
    • 過程式編程與OOP在設(shè)計理念上有什么差異?


    講解

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

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

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

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

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

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

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

    “嚴(yán)格說來,VBVB.NET除外)和JavaScript也不是OO的,只是基于對象的Object Based[1]。” 冒號糾正道,“至于OOP是否會一統(tǒng)天下,答案是否定的。首先,與能獨當(dāng)一面的三類最基本的范式不同,純粹的OOP是不存在的[2],必須結(jié)合其他范式;其次,世上沒有包治百病的萬靈丹方,OOP也不例外。用軟件業(yè)的行話來說:沒有銀彈(No silver bullet[3]OOP最適用于大型復(fù)雜的、交互式的、尤其是與現(xiàn)實世界密切相關(guān)的系統(tǒng),但在小型應(yīng)用、數(shù)學(xué)計算、符號處理等方面并無優(yōu)勢。需要指出的是,語言和范式的流行,與大公司支持和商業(yè)推動是密切相關(guān)的。有人說OOP其實是MOPMoney-Oriented Programming),即以金錢為導(dǎo)向的。雖有過激之嫌,但有經(jīng)驗的股民都知道,有主力運作的股票總是漲得快一些的。當(dāng)然OOP能流行,自有獨到之處,誰能說說它到底好在哪里?”

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

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

    感到來者不善,逗號有點發(fā)虛:“因為OOP具有信息隱藏、繼承和多態(tài)的特征。”

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

    見逗號有些理屈詞窮,冒號語氣放緩:“請不要誤解,我并非OOP的反對者,相反今后還要重點討論它。但我希望大家少一點照本宣科和人云亦云,多一點獨立思考,甚至不妨標(biāo)新立異。”

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

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

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

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

    冒號拊掌贊道:“好極了!”

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

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

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

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

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

    全班捧腹。

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

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

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

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

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

    嘆號狐疑道:“OOP并不更具重用性?這可是它的金字招牌?。?#8221;

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

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

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

    眾人猶自將信將疑。

    “對一個沒有獨立思考習(xí)慣的人來講,與其說他認(rèn)同一個理論,倒不如說他認(rèn)同該理論倡導(dǎo)者的權(quán)威。而在他仰視權(quán)威的同時,也把自己的思想交托給了權(quán)威。”冒號頗具犬儒之風(fēng),“你們可以懷疑我的觀點,但絕不可放棄自己的思考。請注意,這就是我在第一堂課提到的精神——批判精神。”

    冒號這時停了下來,與在座的每位逐一對視。他仿佛想通過目光把這種精神注入到每個人的身上,就像武俠小說中通過手掌將內(nèi)功傳輸給他人一樣。并不是每個人都能理解冒號的用心,但都或多或少地感受到一種異樣的氣氛。

    “關(guān)于OOP今天就談到這里。”冒號恢復(fù)了常態(tài),“請不要奇怪為何如此流行的編程范式我卻一帶而過,那是因為你們對它相對比較熟悉,而我們這一輪只是在作熱身運動,以后再作專項訓(xùn)練。在結(jié)束之前,我們引進(jìn)一個新視點:過程式編程的模塊以函數(shù)為單位,OOP的模塊以對象為單位,二者的區(qū)別是:函數(shù)是被動的實體,對象是主動的實體。過程式程序的世界是君主制的,主函數(shù)是國王,其他函數(shù)是臣民,等級分明,所有臣民在聽命于上級的同時也對下級發(fā)號施令,最終為國王服務(wù);OO程序的世界是民主制的,所有對象都是獨立而平等的公民,有權(quán)利保護(hù)自己的財產(chǎn)和隱私并向他人尋求服務(wù),同時有義務(wù)為他人提供承諾的服務(wù),公民之間通過信息交流來協(xié)作完成各種任務(wù)。”

    眾人頓覺耳目為之一新。


     插語

    [1]所謂基于對象的,有兩種不同的涵義。一種指“限制版”的OOP,即具備對象概念,但不具備OOP的一些其他特征,如繼承或多態(tài)等。Visual Basic正屬于此類。另一種指基于原型的(prototype-based),或者說基于實例的(instance-based),而不像通常OOP是基于類的(class-based)。JavaScriptNewtonScriptMOO等語言即屬此類。

    [2]這里所謂純粹的OOP”并非指一般意義上的“pure OOP”(即所謂的“一切都是對象”),而指單純的、不含其他范式的OOP

    [3]出自Fred Brooks著名文章《no silver bullet》。他認(rèn)為沒有一項技術(shù)或管理方法的發(fā)展能保證,在十年內(nèi)讓軟件的生產(chǎn)力、可靠性或簡潔性等方面提高一個數(shù)量級。常用來泛指沒有一項軟件技術(shù)或方法是萬能的。

    [4]更準(zhǔn)確地說,這是前文提到的結(jié)構(gòu)化編程思想。


    。
    總結(jié)

    ·         OOP大多是命令式的,但也有函數(shù)式的和邏輯式的OO語言。

    ·         OOP的核心思想可以歸納為:以數(shù)據(jù)為中心組織邏輯,將系統(tǒng)視為相互作用的對象集合,并利用繼承與多態(tài)來增強(qiáng)重用性。

    ·         OOP既不能脫離其他范式,也絕非適用于一切應(yīng)用。

    ·         可重用性、可擴(kuò)展性和靈活性是所有范式和語言的共同目標(biāo),并非OOP所獨有。

    ·         與其說OOP更具重用性,不如說更具易用性。

    ·         過程式編程重在過程,自頂向下,逐步求精。

    ·         對象式編程重在數(shù)據(jù),自底向上,逐步合并。

    ·         過程式程序的世界是君主制的OO程序的世界是民主制的。


    “”
    參考

    [1] WikipediaObject-oriented programminghttp://en.wikipedia.org/wiki/Object-oriented_programming

    posted on 2008-11-04 00:20 鄭暉 閱讀(1442) 評論(3)  編輯  收藏 所屬分類: 冒號課堂

    評論

    # re: 冒號課堂§2.3:對象范式 2008-12-21 20:35 jiqiang

    很喜歡這種不同的思考角度  回復(fù)  更多評論   

    # re: 冒號課堂§2.3:對象范式 2009-02-10 22:23 Todd

    不大認(rèn)同“ 對象式編程重在數(shù)據(jù),自底向上,逐步實現(xiàn)”,自己的經(jīng)驗沒有這種體會,文中的論述也沒有說服我。  回復(fù)  更多評論   

    # re: 冒號課堂§2.3:對象范式 2009-02-11 16:15 鄭暉

    @Todd
    本文只是引子,主要是陳述觀點,而不是論述觀點。具體論述將在以后的專門章節(jié)中展開。  回復(fù)  更多評論   

    導(dǎo)航

    統(tǒng)計

    公告

    博客搬家:http://blog.zhenghui.org
    《冒號課堂》一書于2009年10月上市,詳情請見
    冒號課堂

    留言簿(17)

    隨筆分類(61)

    隨筆檔案(61)

    文章分類(1)

    文章檔案(1)

    最新隨筆

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲欧洲精品国产区| 婷婷亚洲天堂影院| 精品福利一区二区三区免费视频 | 亚洲人成综合在线播放| 色拍自拍亚洲综合图区| 亚洲黄色在线观看| 亚洲综合精品一二三区在线| 亚洲av片劲爆在线观看| 337p欧洲亚洲大胆艺术| 亚洲精品国产啊女成拍色拍| 亚洲国产精品久久网午夜| 久久亚洲精品国产精品婷婷 | 中文字幕亚洲激情| 亚洲毛片αv无线播放一区| 久久九九亚洲精品| 亚洲色偷偷偷网站色偷一区| 亚洲同性男gay网站在线观看| 亚洲日韩国产精品乱-久| 蜜桃传媒一区二区亚洲AV| 新最免费影视大全在线播放| 精品一区二区三区免费观看 | 亚洲乱人伦中文字幕无码| WWW亚洲色大成网络.COM| xxxxxx日本处大片免费看| 国产无遮挡无码视频免费软件| 99在线观看免费视频| 成人毛片18女人毛片免费96 | 啦啦啦www免费视频| 亚洲AV无码乱码精品国产| 一本久久a久久精品亚洲| 亚洲伊人久久大香线蕉苏妲己| 亚洲一区中文字幕在线电影网| 亚洲AV无码AV男人的天堂不卡| 国产福利免费视频 | 色噜噜狠狠色综合免费视频| 久久精品无码免费不卡| 222www免费视频| 国产精品四虎在线观看免费| 国产成人麻豆亚洲综合无码精品| 精品亚洲成AV人在线观看| 亚洲精品理论电影在线观看|