“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-oriented programming languages, OOPL)的定義多種多樣。想了解我對 OO 的詳細看法,請閱讀 C++ 為什麼不僅僅是面向對象的語言 。我在那裡寫道,OOP 這種編程風格起源於 Simula(約 40 年以前!),它依賴於封裝(encapsulation)、繼承(inheritance)以及多態(polymorphism)。就 C++(及許多其它源於 Simula 的語言)而言,OOP 的意思是利用類層級(class hierarchies)及虛函數進行編程,從而可以通過精制的接口操作各種類型的對象,並且程序本身也可以通過派生(derivation)進行功能增量擴展。
請注意,OOP 並非萬能藥。不要簡單地把“OOP”等同於“好”。如果你的問題的基本要素中沒有與生俱來的層級關系,那麼類層級和虛函數對你的代碼不會有任何幫助。 OOP 的優勢在於類層級可以有效地表達很多問題;OOP 的主要弱點在於太多人設法強行用層級模式解決問題。並非所有問題都應該面向對象。也可以考慮使用普通類 (plain class)、泛型編程 和獨立的函數(就像數學、C,以及 Fortran 中那樣)作為解決問題的方案。
多范型編程
多范型(multiparadigm)編程是“以多種風格編程,各盡所能”的花哨講法。例如,當需要在運行時區分對象類型時用面向對象編程,而在需要靜態類型安全性,並且追求執行效率的時候使用泛型編程。顯然,多范型編程的主要威力體現在使用多種范型(編程風格)的程序中,要通過用多種支持不同范型的語言來創建同樣效果的系統是很難的。多范型編程的最引人注目的效果是:如果使來自不同范型的技術緊密協作,就可以寫出比用單范型的程序更精致、維護性更好的代碼。