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

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

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

    冒號和他的學生們(連載7)——對象范式

    冒號和他的學生們

    ——程序員提高班紀事

    1. 對象范式

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

     

    短憩之后,引號迫不及待地問:“面向對象的范式應該是一種特殊的命令式吧?”

    “面向對象?”冒號咕噥著,“姑且稱之為OO或對象式吧,既不標新立異,也不以訛傳訛。在回答你的問題之前,請先回答我的:什么是OOP?”

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    全班捧腹。

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

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

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

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

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

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

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

    “當然是電器元件啦。”嘆號沖口而出。

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

    眾人猶自將信將疑。

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

    眾人頓覺耳目為之一新。

    posted on 2008-05-07 00:05 鄭暉 閱讀(2483) 評論(15)  編輯  收藏 所屬分類: 冒號和他的學生們

    評論

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

    引號占位學習中 ^_^  回復  更多評論   

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

    不知道樓主是做什么的?這個系列很有意義  回復  更多評論   

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

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

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

    冒號老師舉的例子很生動!  回復  更多評論   

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

    哈哈 太經典了 繼續(xù)  回復  更多評論   

    # re: 冒號和他的學生們(連載7)——對象范式 2008-05-14 14:13 lanser

    大樹的例子很生動,尤其是把用戶需求拿樹根做比喻這一段,請允許我引用,當然我會提前說明“老冒有一個很好的例子...” :p  回復  更多評論   

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

    smalltalk不是純粹的OOP嗎?  回復  更多評論   

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

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

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

    那個分析法和綜合法指的是演繹法和歸納法吧。  回復  更多評論   

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

    不好意思,上面說錯了。分析法和綜合法是對的。  回復  更多評論   

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

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

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

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

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

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

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

    忘了 ...okayhilter@gmail.com~  回復  更多評論   

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

    @okayhilter
    請點擊右欄桔黃色公告進入“關于《冒號和他的學生們》”,可下載rar。有問題請告知。  回復  更多評論   

    導航

    統(tǒng)計

    公告

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

    留言簿(17)

    隨筆分類(61)

    隨筆檔案(61)

    文章分類(1)

    文章檔案(1)

    最新隨筆

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 免费又黄又爽又猛的毛片| 久草视频免费在线| 亚洲麻豆精品国偷自产在线91| 亚洲最大黄色网址| 久热中文字幕在线精品免费| 亚洲熟妇无码久久精品| 99热在线观看免费| 亚洲免费在线视频观看| 成人无码区免费视频观看| 精品亚洲AV无码一区二区三区| 免费精品国偷自产在线在线| 亚洲w码欧洲s码免费| 成人毛片18女人毛片免费96| 久久亚洲精品成人无码| 亚洲精品视频久久久| a级成人免费毛片完整版| 亚洲s色大片在线观看| 2019中文字幕在线电影免费| 456亚洲人成影院在线观| 国产免费人视频在线观看免费| 人人公开免费超级碰碰碰视频| 亚洲色精品aⅴ一区区三区| 午夜不卡久久精品无码免费| 亚洲国产夜色在线观看| 日本免费人成视频播放| japanese色国产在线看免费| 亚洲欧洲国产精品你懂的| 国产va免费精品观看精品 | 亚洲国产精品成人久久久| 波多野结衣在线免费观看| 亚洲av无码成人精品区一本二本| 亚洲国产人成中文幕一级二级| 免费成人在线电影| 亚洲天堂2017无码中文| 亚洲国模精品一区| 亚洲黄色片免费看| 男女超爽视频免费播放| 亚洲人成依人成综合网| 国产精品深夜福利免费观看| 久久国产乱子伦精品免费一| 亚洲熟女www一区二区三区|