(原創) 淺談泛型程式設計 (C/C++) (template)
2006-12-10 10:40
253 查看
泛型對於C#、Java程序員,泛型是個完全陌生的領域,但對C++程序員,若不懂泛型,幾乎看不懂一些新的程式和範例,新的C++程式幾乎全都用泛型改寫,事實上,C++社群這幾年關心的,已經不是OOP和Design Pattern了,身為第一個普及化的OOP語言,OOP和Design Pattern已經談了20年,已經談爛了,轉而關注的是泛型程式設計,GP(Generic Programming)領域。
我們回想看看OOP出了哪些問題?OOP讓我們可以大量的自訂型別,模擬真實世界的物件型態,對於大型程式來說,OOP設計的確讓程式更容易維護,也增加了可再利用性,但OOP的設計方式,有著嚴重的門戶之見,如有很多class都須具備find() member function,但這些class之間又沒有任何關係,所以如Inheritance、Composite等技巧又不能使用,最後只能在每個class都去寫find(),這樣非常的沒有生產力,假如我能寫一個find() function,能處理全部所有的object,這種『一槍斃命』的解決方式,是不是非常的吸引人?
是的,GP就是想打破OOP門戶之見的思維,試著處理『所有的物件(型別)』,C++就是靠template來達成GP,什麼是template呢?簡單的說,template就是對既有的object再做一次封裝,變成一個新的object,等事情處理完後,再還原成原來的object,舉個例子,當我們登上太空梭,穿上『太空衣』後,我們就變成了『太空人』,此時太空梭上所有的設施都是針對我這個太空人設計的,而不管原本我是中國人還是美國人,都一樣適用,當我下了太空梭,脫下太空衣後,我就變成原來的中國人了。
GP簡單的說就是這樣子,我們設計的『太空梭』function template為了能適用於所有的人種object,我們設計了一件『太空衣』class template,當object套上class template後,就成了『太空人』,而function template中所有的操作都只能針對穿過太空衣的『太空人』操作,而不能針對這個人原本的特性,如此就能保證function template能適用於所有object。
或許你會問,若真的還是得對原本物件操作呢?這是違反GP的原則,但還是有變通的方式,就是設計另外一件太空衣class template,由太空衣去控制元本物件的操作,但function template還是只能控制太空人而已,如此就不違反GP的原則了。
GP的威力就在打破OOP型別的分隔,透過template再次封裝,一次處理所有物件,這是我由STL這個用GP打造的Framework所領悟到的,不過我的GP功力尚淺,或許還有更具威力的應用,但每次看到STL algorithm能適用於所有的Container,就覺得不可思議,在OOP中,傳入傳出的參數,都要嚴格的限定型別,最多使用overload,但還是得為每一個型別寫一個function,但在GP下,一個function就處理掉所有型別了,不僅節省開發時間,而學習也方便,因為只要學習一次,就能套用所有object了。
以上的解釋若有任何錯誤,歡迎指證告訴我,希望如此淺顯的解釋,仍讓您大概了解什麼是GP。
我們回想看看OOP出了哪些問題?OOP讓我們可以大量的自訂型別,模擬真實世界的物件型態,對於大型程式來說,OOP設計的確讓程式更容易維護,也增加了可再利用性,但OOP的設計方式,有著嚴重的門戶之見,如有很多class都須具備find() member function,但這些class之間又沒有任何關係,所以如Inheritance、Composite等技巧又不能使用,最後只能在每個class都去寫find(),這樣非常的沒有生產力,假如我能寫一個find() function,能處理全部所有的object,這種『一槍斃命』的解決方式,是不是非常的吸引人?
是的,GP就是想打破OOP門戶之見的思維,試著處理『所有的物件(型別)』,C++就是靠template來達成GP,什麼是template呢?簡單的說,template就是對既有的object再做一次封裝,變成一個新的object,等事情處理完後,再還原成原來的object,舉個例子,當我們登上太空梭,穿上『太空衣』後,我們就變成了『太空人』,此時太空梭上所有的設施都是針對我這個太空人設計的,而不管原本我是中國人還是美國人,都一樣適用,當我下了太空梭,脫下太空衣後,我就變成原來的中國人了。
GP簡單的說就是這樣子,我們設計的『太空梭』function template為了能適用於所有的人種object,我們設計了一件『太空衣』class template,當object套上class template後,就成了『太空人』,而function template中所有的操作都只能針對穿過太空衣的『太空人』操作,而不能針對這個人原本的特性,如此就能保證function template能適用於所有object。
或許你會問,若真的還是得對原本物件操作呢?這是違反GP的原則,但還是有變通的方式,就是設計另外一件太空衣class template,由太空衣去控制元本物件的操作,但function template還是只能控制太空人而已,如此就不違反GP的原則了。
GP的威力就在打破OOP型別的分隔,透過template再次封裝,一次處理所有物件,這是我由STL這個用GP打造的Framework所領悟到的,不過我的GP功力尚淺,或許還有更具威力的應用,但每次看到STL algorithm能適用於所有的Container,就覺得不可思議,在OOP中,傳入傳出的參數,都要嚴格的限定型別,最多使用overload,但還是得為每一個型別寫一個function,但在GP下,一個function就處理掉所有型別了,不僅節省開發時間,而學習也方便,因為只要學習一次,就能套用所有object了。
以上的解釋若有任何錯誤,歡迎指證告訴我,希望如此淺顯的解釋,仍讓您大概了解什麼是GP。
相关文章推荐
- (原創) CSS就是一種泛型的實做 (C/C++) (template) (Web) (CSS)
- (原創) 一個C++能跑的泛型,但在C#卻不能跑 (C/C++) (template) (.NET) (C#) (C++/CLI)
- (原創) 如何讓泛型支援多個interface? (.NET) (C/C++) (C#) (template) (C++/CLI)
- (原創) 我的Design Pattern之旅[8]:如何使用泛型打造動態改變的Strategy Pattern? (OO) (Design Pattern) (C/C++) (template) (boost)
- (原創) 如何使用泛型模擬virtual? (C/C++) (template)
- (原創) 我的Design Pattern之旅[7]:使用泛型改進Adapter Pattern (OO) (Design Pattern) (C/C++) (template) (.NET) (C#) (C++/CLI) (VB)
- (原創) 如何設計電子鐘(II)? (SOC) (Verilog) (MegaCore) (DE2)
- resetTemplate的GET请求返回值为带泛型的类型list<>
- 2-2 使用模板(泛型)编写算法-Selection-Sort-Using-Template
- (原創) 如何設計2數相加的電路? (SOC) (Verilog)
- (原創) Nios II好書推薦1:系統晶片設計 -- 使用Nios II (SOC) (Nios II) (DE2)
- 以程式設計方式設定 ODBC 資料來源
- [转] 淺談遊戲程式設計入門 - [進階篇]
- NO.94 RestTemplate.getForObject将PO中List<T>的泛型变成LinkedHashMap问题的解决
- (原創) 如何正確的使用迴圈(使用for_each)? (C/C++) (STL) (template)
- C++ 模板(template)(泛型)入门例子
- (原創) 如何加速for loop? (C/C++) (OpenMP) (template) (TMP) (C2H)
- (原創) 為什麼Nios II reset後,軟體程式就不會動了? (IC Design) (DE2) (Nios II) (SOPC Builder)
- 2007/06 Delphi&VCL For Web程式設計研討會
- 設計模式之Template