推 YuYuHo:visitor確實很dirty,亂用會讓程式變得更複雜. 02/09 15:33
※ 引述《ellinas (keep your faith !)》之銘言:
: 最近看到一些關於反design pattern的看法 [1]
: 其中最著名的當屬Paul Graham以及Beyond Java這本書
: Paul認為 當他看到程式之中有重覆性出現時 他認為是警訊 [2]
: 因為這表示程式abstraction的程度還不夠
: 才有這種類似copy的模式出現
: (當然這與copy&paste code的層次明顯不同 -.-")
: 我也看過有人認為GoF的design pattern是C++的補釘大全
: 像是Visitor採用的double dispatch [3]
: 在某些程式語言直接有支援 也就不需要採用Visitor這個pattern
: 但是我忘記這是在那裡看到的 有人知道這個說法的出處嗎?
visitor 我印象中跟 double dispatch 沒啥關係,
double dispatch 是 multimethod 的一種實現方式,
的確像是 Haskell 和 Dylan 這些語言就有支援,
主要是你希望 obja.method(objb) 這樣寫的時候,
實際會是哪個 method 被 call 到,
不但要看 obja 的實際型別,
還要看 objb 的實際型別才能決定,
否則你必然得在 obja 實際型別的 method 裡,
寫一大串 if else 搭 typeid 和 dynamic_cast 判斷 objb 的實際型別才能搞定,
這個部分通常被稱為 type switch,
在 C++ 的 OO 程式碼裡算是一大惡例。
: 版上各位對design pattern的看法又是如何呢?在實際使用方面呢?
: 我平常寫程式時也常會使用一些基本的pattern
: 像是singleton, factory, visitor 但對有些pattern還是未能運用自如
: 我覺得pattern是還蠻重要的 可以把思考提升一個層次
: 學習pattern除了看書外 假如能碰到需要使用的場合
: 使用過幾次 看到問題就能想到pattern
: 這方面光看書應該比較難體會 一些實務經驗似乎是必需
: 版主之前有發表過關於pattern的文章 但似乎是持反對立場
: 不知道我們應該對pattern持什麼樣的態度呢?
singleton 和 factory 簡單來說就是防白目用的,
或是防止自己耍白癡,
team work 的時候常常有很多白目講不聽又不看文件和註解,
白話來說這兩個 patterns 是預防這些狀況發生的策略之一,
不過考試這樣作答零分就是了,
因為它們存在的意義不只是這些,
我沒講的教科書應該都有講了。
visitor 的話我建議是盡量少用,
它在 OO design pattern 界裡面受爭議的程度,
跟 procedural programming 裡的 goto 差不多,
不是絕對不可以用,
也不是說用了一定會不好,
而且也的確有它有用的地方。
至於用到它的時機,
簡單說就是做一些 dirty work 的時候會用到,
一般來說會伴隨著實務上某些奇怪的要求,
才會讓你非用它不可,
它的實現手法事實上也蠻骯髒的。
: [1] http://fcamel.twbbs.org/archives/2007/01/14/247/
: [2] http://en.wikipedia.org/wiki/Design_pattern_(computer_science)#Criticism
: [3] http://en.wikipedia.org/wiki/Double_dispatch
--
Name: Tseng, Ling-hua E-mail Address: [email protected]
School: National Tsing Hua University Department: Computer Science
Interesting: C++, Compiler, PL/PD, OS, VM, Large-scale software design
Researching: Software pipelining for VLIW architectures
Homepage: https://it.muds.net/~uranus
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.230.217.38
※ 編輯: tinlans 來自: 61.230.217.38 (02/08 22:54)