如何評價Andrei Alexandrescu提出的c++ policy-based design?
policy-based design是C++大神Andrei Alexandrescu在他的Modern C++ Design: Generic Programming and Design Patterns Applied(mimuw.edu.pl 的頁面 Section 1.6)中提出的使用模板參數作為演算法的策略配置的模式
類似的有,為什麼STL容器中的Allocator是模板參數而不是回調函數, 這樣帶來的壞處是不同分配策略的容器屬於不同的類型, 對調用容器介面的客戶端代碼不友好, 採用這種policy-based design有什麼顯著的好處?SO相關問題:Policy based design and best practices - C++
萬幸 std::shared_ptr 沒有採用 Loki 的方案。
強答下,可能我理解有偏差。
有本書里有講到採用模板(泛型參數)構建整個系統,使用搭積木的形式,組裝各個層面的不同類型,以構建不同需求(編譯器確定)的產品。
猜測Allocator是類型,而不是回調,也是有這個道理(畢竟Allocator作為類型還能擁有其他成員方法)(畢竟你記住一個系統是由幾個類型組成的,比記住是由幾十個回調組成的要容易的多)
我偏題了么?
要考慮歷史的進程啊,人家搞loki的時候,CPP還不是現在這個樣子的啊..
Andrei Alexandrescu絕對是先驅級的人物,linus黑CPP的時候,大家都指望著人出來說句話呢,你想想這是什麼個級別。
他寫這本書就告訴大家一件事,設計模式也是可以抽象的,其實這書說的很多東西,現在都有更好的實現,所以很多裡面的編碼是不用特別細緻的學習的,loki到現在1.0都沒有,可想而知吧。但是,這書上所說的很多東西,在現代CPP中隨處可見.
所以,看這本書一定要吸收作者這種細緻的思想。
順便說一下,loki的代碼真是漂亮啊...
這種policy-based design頂破天也就是多繼承的改良版,多繼承裡面可能出現的問題,它policy-based design後面多半要出現,比如對象的內存布局,原本c++的對象模型就一塌糊塗,這樣一搞,就更加雪上加霜,而且還必須源碼級共享,這種什麼policy的設計,說好聽,就是兼具template和多繼承的優點,難聽點,就是同時也集合了它們的缺陷,並且還發揚光大,template和多繼承,隨便一個都是燒死腦細胞的天王巨星,現在要同時搞在一起。再說了,policy-based design的設計,難度也過大,要求各個policy都要正交,這你媽的誰做到啊,並且有那麼好的需求嗎,可以讓你policy-based design,本來c++的普通設計就已經很不容易了。當然,最大的問題,還是,policy-based design的各個類的內存布局,對象模型,媽的,完全就是,反正我是沒辦法理解把控的啦
感覺就是依賴於模板實現的靜態派發。雖說是將一堆policy組合起來就可以完成一個特定功能的類模板,而且也的確是這樣的。但是,當工程中出現一大堆頭文件,各個policy不知道放在什麼地方;更要命的是這些policy強耦合在一起,卻以極為鬆散的形式組織起來,除非你對代碼非常熟悉,否則很難做出一丁點改動;最要命的是這些源碼全TM是模板啊,一大堆模板混到一起,就是VS也得跪啊,改一點,運氣不好(改到基礎的policy了)就要編譯半天。。。
有興趣的可以看看這個項目,mlpack/mlpack
推薦閱讀:
※為什麼libstdc++的allocator要實現兩個operator==?
※為什麼在 C++ 中不提倡 C 風格的強制類型轉換?
※你讀過的最好的 C++ 開源代碼是什麼?
※C++17 基本完成,對於新特性大家怎麼看?
※C/C++中相同的浮點數的內存布局一定是一樣嗎?