天天看點

C++的程式設計範式

 ”c++三人談“中看到惡魔曾經指出c++的程式設計範式可以分為ADT+PP,GP,OO三個方向。

1、ADT+PP

ADT:abstract data type; 抽象資料類型

PP:procedure programme; 面向過程的程式設計範式

ADT+PP 就是說面向過程的程式設計範式+抽象資料類型,你可以了解為c++的前身:帶類的C。

2、GP

GP:泛型程式設計,GP(Generic Programming,泛型程式設計)号稱程式設計思想的又一次革命。但是,在論述GP的資料中,一般都是以C++語言為基礎來讨論。

泛型程式設計(Generic Programming,GP)是一種基于參數化(parameterization)的程式設計技巧:可以使用類型參數化另一種類型(例如,vector的元素類型就是通過參數确定的);算法也可以參數化另一種算法(例如,使用比較函數參數化排序函數)。GP的目的是将有用的算法或者資料結構盡可能地一般化,并使其最優化。

GP 在某些方面比 OOP要靈活得多。特别是,它不依賴于層級。例如,int 和 string 之間沒有任何層級關系。總的來說,GP 的結構化程度更甚于OOP。事實上,GP 常被稱為“參數多态(parametric polymorphism)”;而 OOP 常被稱為“ad hoc 多态”。就C++ 而言,GP 于編譯時就解析了所有名稱;它不需要任何動态(運作時)排程。是以,GP 在對運作時效率要求很高的領域占據了主導地位。

請注意,GP 并非萬靈丹。很多時候,程式并不需要參數化多态,而需要運作時排程(OOP)。

3、OO:面向對象的程式設計

面向對象(object oriented,OO),面向對象程式設計(object-oriented programming, OOP),以及面向對象程式設計語言(object-orientedprogramming languages, OOPL)的定義多種多樣。想了解我對 OO 的詳細看法,請閱讀 C++ 為什麼不僅僅是面向對象的語言。我在那裡寫道,OOP 這種程式設計風格起源于 Simula(約 40年以前!),它依賴于封裝(encapsulation)、繼承(inheritance)以及多态(polymorphism)。就C++(及許多其它源于 Simula 的語言)而言,OOP 的意思是利用類層級(classhierarchies)及虛函數進行程式設計,進而可以通過精制的接口操作各種類型的對象,并且程式本身也可以通過派生(derivation)進行功能增量擴充。

請注意,OOP并非萬能藥。不要簡單地把“OOP”等同于“好”。如果你的問題的基本要素中沒有與生俱來的層級關系,那麼類層級和虛函數對你的代碼不會有任何幫助。OOP 的優勢在于類層級可以有效地表達很多問題;OOP的主要弱點在于太多人設法強行用層級模式解決問題。并非所有問題都應該面向對象。也可以考慮使用普通類(plain class)、泛型程式設計和獨立的函數(就像數學、C,以及 Fortran 中那樣)作為解決問題的方案。

多範型程式設計

多範型(multiparadigm)程式設計是“以多種風格程式設計,各盡所能”的花哨講法。例如,當需要在運作時區分對象類型時用面向對象程式設計,而在需要靜态類型安全性,并且追求執行效率的時候使用泛型程式設計。顯然,多範型程式設計的主要威力展現在使用多種範型(程式設計風格)的程式中,要通過用多種支援不同範型的語言來建立同樣效果的系統是很難的。多範型程式設計的最引人注目的效果是:如果使來自不同範型的技術緊密協作,就可以寫出比用單範型的程式更精緻、維護性更好的代碼。

繼續閱讀