2010年11月24日 星期三

泛型與設計範式(Design Patterns)缺少了什麼

我最近在看候捷/於春景翻譯Andrei Alexandrescu的Modern C++ Design。從事程式工作這些年來,對於template的使用,我還只是停留在T容器的概念,雖然還在研讀中,不過已讓我對template的設計有了新的體會。對於許多以前想不通的ATL設計方式,覺得慢慢能掌握了。

以一個程式開發者角度來使用與開發template是完全不同的等級(使用與開發class也是不同等級)。使用template相對簡單的多,但為何template始終無法推廣成為設計的主流模式?Template缺少了什麼關鍵東西?

首先,要程式設計師能把行為抽象化來思考本身就是很具有難度的一件事。光是物件虛擬化就可以難倒眾多的"程式設計師",當把行為也抽象化後,每個物件所需具有的行為特性就更難以理解。而目前的STL又無法提供出唯一的模型,許多模板都有各種效能、安全性、擴充性的考量,造成許多的變化與組合,當套用的模板不合宜時,結果往往出乎意料,而template的除錯,則是極為艱困的一件工作。

更別提不同的工具對template語法上的差異,我還記得最早在VC 6.0上學習template時,為了一個分行的問題,耗去我一整天的時間。而且每次Visual Studio改版、移植到Mac平台,或多或少都要調整template的語法對其做修正。

其次,template與繼承不同,我的感覺是template class更像是interface。在實作一個template class時像是在玩數獨遊戲一樣,你必需把所有的空格(function)都填寫完畢,且填寫的答案符合他的遊戲規則時才能正常的運作。但困難點在於,當我們在使用還不熟悉的模板時,我如何能得知我要填入多少個空格?MSDN Help只會告訴我們這個模板有什麼功用,卻不會列出套用這個模板的class T必需要具有什麼樣的功能,看著那一大串有看沒有懂的編譯錯誤,許多許用者寧可回到原始的模式一行一行的打著自已能夠看的懂的code也不願再接觸那傳說很方便的template。

對於一個使用template的開發人員,我們要的是什麼。我認為我們真正要的是一個好的精靈(wizard)工具。如果ATL沒有了ATL wizard,不知道有多少人能夠正確的做出一個ATL元件,奇怪的是,這麼多年來,怎麼都沒有一個像樣的STL wizard來協助我們使用template?

這個STL wizard至少應提供2個功能,一個是提供我們"組合"上的選擇測試,另一個則是必需能夠引導我們一步一步的完成這個模板所需的所有函式(至少編譯無錯)。在這個工具出現前,我相信設計範式的模板只是少數人才玩的起的工匠技藝。

沒有留言:

張貼留言