(原創) 淺談泛型程式設計 (C/C++) (template)

泛型對於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。

posted on 2006-12-10 10:40  真 OO无双  阅读(3035)  评论(2编辑  收藏  举报

导航