當(dāng)前位置:
首頁 >
基于对象和面向对象编程范式辨析和主流编程语言中的应用
發(fā)布時間:2025/3/21
50
豆豆
生活随笔
收集整理的這篇文章主要介紹了
基于对象和面向对象编程范式辨析和主流编程语言中的应用
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?
基于對象和面向?qū)ο缶幊谭妒奖嫖龊椭髁骶幊陶Z言中的應(yīng)用 前言 本文的目的是想告訴大家,為什么C++的模板這么強大。為什么Ruby的Duck Typing(像鴨子那樣編程)這么強大! 基于對象和面向?qū)ο缶幊谭妒?/font> 關(guān)于基于對象和面向?qū)ο缶幊谭妒?#xff0c;我有著不同于傳統(tǒng)的理解。我認為我的理解更能體現(xiàn)出這2個范式的本意。 基于對象,就是使用類封裝操作和操作依賴的數(shù)據(jù)。用類來表示一個概念。類的公共成員,包括函數(shù)和數(shù)據(jù),就是類的接口,也叫作抽象數(shù)據(jù)類型(ADT)。 面向?qū)ο?#xff0c;就是使用類的接口實現(xiàn)機制來表示操作。一個接口使用一組相關(guān)的公共函數(shù)代表一個概念的操作。一些類實現(xiàn)這個接口。這個實現(xiàn)類可以互換。 在使用中,使用接口的指針或者引用來調(diào)用對象。具體的對象是接口的某個實現(xiàn)類。可以不改變代碼,僅僅改變實際的對象來實現(xiàn)動態(tài)修改系統(tǒng)的行為。 這就是“動態(tài)多態(tài)”的能力。 面向?qū)ο蟮膭討B(tài)多態(tài)能力,使抽象能力比函數(shù)更進一步。 動態(tài)多態(tài),在實現(xiàn)中是使用了“虛函數(shù)”機制來實現(xiàn)的。 對象指向的本類的虛函數(shù)表來查得真正需要調(diào)用的方法。 語言特性對比表 C++Java?????? .NET???? Ruby??????????? 類型強類型強類型強類型強類型 靜態(tài)/動態(tài)靜態(tài)靜態(tài)檢驗類型動態(tài)解釋執(zhí)行動態(tài) 支持面向過程是否否否 支持基于對象是否是是 支持范型否是是否 支持模板是否否否 C++通過抽象基類來作為接口,通過對抽象基類的繼承來實現(xiàn)這個接口。 Java和.NET都提供了Interface接口類型。實現(xiàn)接口的類實現(xiàn)了這個機制。 所以說,C++,Java,.NET都支持面向?qū)ο蟮木幊谭妒健L貏e是java,它只支持面向?qū)ο?#xff08;也就是動態(tài)多態(tài))這一種編程范式。其他一概不支持! 動態(tài)類型語言,如Ruby,JavaScript都沒有接口。為什么呢? 考慮一下,動態(tài)類型語言盡管有類型。但是變量都是沒有類型的。如 //偽代碼 Class Dao1{ Public void save(model){ //保存數(shù)據(jù) } } Class Dao2{ Public void save(model){ //保存數(shù)據(jù) } } Class Service{ @dao; Public void save(model){ this.dao.save(); } } //調(diào)用代碼: New Service(new Dao1).save(model); New Service(new Dao2).save(model); 這里,Dao1,Dao2這2個類需要實現(xiàn)一個共同的接口嗎? 動態(tài)類型語言中,盡管對象是有類型的,但是變量(實際是指向?qū)ο蟮闹羔?#xff09;是沒有類型的。Service類的變量dao可以是任何類型!只要那個對象所屬的類型有Public void save(model);這樣簽名的函數(shù)即可! 動態(tài)類型語言中,根本不需要Java等靜態(tài)語言中的接口的概念。這就是動態(tài)類型語言著名的Duck Typing“像鴨子一樣編程”的理念。 Java這樣的靜態(tài)類型語言當(dāng)然也有自己的優(yōu)點。那就是通過強制實現(xiàn)接口。可以保證程序員不會因為筆誤而調(diào)用錯誤的類型。 但是,在實踐中,動態(tài)類型語言的Duck Typing卻是更加靈活,更勝一籌! 動態(tài)語言既然沒有接口,那么它們調(diào)用的方法,也就是該類的方法或者繼承的方法,就不需要虛函數(shù)表,也就不是面向?qū)ο蟮摹皠討B(tài)多態(tài)”機制了。 Ruby,JavaScript的“多態(tài)”機制,是“動態(tài)基于對象”的機制。 根據(jù)我的定義標準,Ruby,JavaScript等動態(tài)類型語言是“基于對象”編程范式的語言。是“動態(tài)基于對象”的編程語言。而非面向?qū)ο缶幊陶Z言。 可能你會說,Ruby,JavaScript 都有“繼承”的能力,怎么能說它們不是面向?qū)ο缶幊陶Z言呢? “繼承”,只是一種代碼重用機制。和編程范式這樣的設(shè)計問題根本答不上邊。甚至,我反對大量使用繼承來重用代碼(少數(shù)特殊情況除外)。我們應(yīng)該使用“組合”來重用代碼。 因為繼承會造成類和類之間的實現(xiàn)依賴。而組合就不會有這種依賴關(guān)系。我們只要寫上一些通道代碼就可換取類和類之間的解耦。 好了,現(xiàn)在再讓我們看看C++的基于對象的編程范式。 C++的基于對象,就是設(shè)計一些類,把函數(shù)和函數(shù)需要的數(shù)據(jù)封裝在一個類中。但是,如何實現(xiàn)真正的ADT(抽象數(shù)據(jù)類型)呢? 這樣:頭文件代表抽象數(shù)據(jù)類型。實現(xiàn)文件中提供定義。如果一個抽象數(shù)據(jù)類型需要多個實現(xiàn)呢? 我們?yōu)橐粋€類提供幾個實現(xiàn)文件。用哪一個就提供哪一個版本。這樣顯然非常繁瑣。事實上也沒有人會這樣編程! 那怎么辦呢?難道C++這樣的靜態(tài)類型語言的“基于對象”編程范式,注定就不能實現(xiàn)多態(tài)嗎?C++的模板機制解決了這個問題!(在沒有徹底搞懂模板之前,我一直用面向?qū)ο缶幊谭妒绞褂肅++,因此對C++是怨聲載道!) 如: //偽碼 Template<tyepe?TDao >Class Service{ Private: TDao* dao=new TDao(); Public: Void?save(Model model){ This->dao->save(model); } } //使用 Model*?model=new Model(); Service<Dao>* service=new Service<Dao>(); Service->save(model); 假設(shè)Dao這個類有Public: Void?save(Model model);這樣簽名的方法。 Void?save(Model model)這個函數(shù)就是TDao這個抽象數(shù)據(jù)類型(ADT)公布的方法。 任何類只要有這樣的方法,就滿足TDao這個ADT,就可以在Service模板類中使用! 對照上面Ruby的偽碼,我們可以發(fā)現(xiàn): 1,C++的“模板支持的基于對象”的編程范式,僅僅比動態(tài)基于對象語言多了模板參數(shù)類型的聲明。 而且,C++可以直接在模板類內(nèi)部實例化類型。真正的類型只有在編譯時才指定。而動態(tài)基于對象的語言因為沒有代表類型的符號,不能實例化未知的類型。 2,C++的“模板支持的基于對象”的編程范式,指定了模板參數(shù)類型,也就是在編譯時需要驗證類型。這就比動態(tài)基于對象的語言多了編譯時靜態(tài)驗證類型這一道關(guān)卡,更加安全可靠。 C++中模板之所以偉大,正是因為它是靜態(tài)語言中支持基于對象編程范式的銀彈! C++的“模板支持的基于對象”的編程范式,令C++擁有了與Ruby等動態(tài)基于對象編程語言的多態(tài)能力相比肩的頂級語言! 總結(jié) 基于對象和面向?qū)ο缶幊坦灿腥N范式。它們提供了強大的動態(tài)或者靜態(tài)多態(tài)能力,使用它們編程,將令你的程序面向抽象,易于更換。 1,“模板支持的基于對象”的編程范式。這種編程范式適用于靜態(tài)類型的語言。提供了靜態(tài)多態(tài)的能力。典型的如C++。 模板不同于范型。模板是一種編譯時的代碼生成機制。而泛型是對模板的模擬。在java和.net中都使用類型轉(zhuǎn)換機制而不是源代碼生成機制來實現(xiàn)。 我認為模板優(yōu)于范型。.NET的范型實現(xiàn)的要比Java好。.NET中可以使用new()關(guān)鍵字實現(xiàn)在范型類中創(chuàng)建未知類型的對象,而java中不可以。 “模板支持的基于對象”的編程范式實現(xiàn)了編譯時靜態(tài)的多態(tài)。具備了強大的靜態(tài)多態(tài)能力。而且生成的代碼運行速度快。 缺點是,如果寫得不好,容易發(fā)生源代碼擴張的問題。 2,“靜態(tài)類型語言”的面向?qū)ο蟮木幊谭妒健_@種編程范式適用于靜態(tài)類型的語言。提供了動態(tài)多態(tài)的能力。典型的如Java,NET。 使用接口和實現(xiàn)接口的技術(shù),實現(xiàn)了動態(tài)多態(tài)。并且可以利用靜態(tài)類型檢驗的優(yōu)勢,進行更加完善的類型安全檢查。 C++也具有進行這一編程范式的能力。但是,C++對于這一編程范式的支持并不是很好。因此,C++編程中,應(yīng)該優(yōu)先使用“模板支持的基于對象”的編程范式。然后再考慮使用“靜態(tài)類型語言”的面向?qū)ο蟮木幊谭妒綄崿F(xiàn)多態(tài)。 3,“動態(tài)類型語言”的基于對象的編程范式。使用Duck Typing“像鴨子一樣編程”的編程理念。這種編程范式適用于動態(tài)類型的語言。它們有類型,但是變量不確定類型。典型的如Ruby。這也實現(xiàn)了動態(tài)的多態(tài)能力。總結(jié)
以上是生活随笔為你收集整理的基于对象和面向对象编程范式辨析和主流编程语言中的应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IT趣闻:世界知名IT公司名字由来
- 下一篇: Xtreme SuitePro Acti