看板 CSSE 關於我們 聯絡資訊
※ 引述《ellinas (keep your faith !)》之銘言: : 似乎與我的認知不太一樣 : 因為在GoF的書中 在visitor的實作部份有寫道 : visitor要達成的效果就是double dispatch GoF 的書中那段就我個人看來有點牽強, 不單是其它書都沒有這樣說的緣故, 在 syntax 上來看, 最後被呼叫的 method name 並不是一開始被呼叫的, 像是 a.foo(b) 這樣 call, 最後實際上被 call 到的並非還是叫做 foo 的 method。 : : singleton 和 factory 簡單來說就是防白目用的, : : 或是防止自己耍白癡, : : team work 的時候常常有很多白目講不聽又不看文件和註解, : : 白話來說這兩個 patterns 是預防這些狀況發生的策略之一, : : 不過考試這樣作答零分就是了, : : 因為它們存在的意義不只是這些, : : 我沒講的教科書應該都有講了。 : 沒錯 把規則寫到CODE裡 : 比寫到文件裡有用得多 : 但是還是有人會"咦 這個class怎麼沒ctor 我改一下api喔" Orz 習慣上 Singleton 是把 ctor 放在 private, 並在上面放上一段註解, 這樣就只有 class 本身能 new 出自己的 obj, 而不是不寫出來, 都做到這樣還有人耍白目硬要亂改, 而且大家都縱容這種行為的話, 建議上是換一家公司比較好。 : compiler實作時有時需要爬很多樹 : 像AST, IL等 也算是visitor最典型的用法 GoF 在這方面的例子其實舉得不好, Visitor 實務上是想對「穩定的 class hierarchy」加入新行為, 但是「不想透過繼承的方式擴充 (就是不動 class hierarchy)」時, 才會被拿來使用。 現代的 compiler 不會這樣子做, 因為現在流行同一套 compiler 能吃不同 language, 變成統一的 AST 以後再用統一的方法玩東玩西, 所以反而是 class hierarchy 常要更動, 但是對操作行為本身而言卻始終是一致的, 結果就是單純拿 Composite 和 Iterator 做 AST 而已, 最佳化也都是擺上一群 Template Method 和 Strategy 搭上去玩, 這也不單純是為了方便做論文 (套不同演算法生數據用), 也方便 user 在做 performance tuning 的時候, 可以在 compiler options 上選自己爽選的來 try, 找出最王道的編譯參數。 : 不知道大大指的的dirty work是指什麼 可以給個明確的例子嗎 : 這方面經驗不多 還請大大指教 其實就跟上面講的一樣, 如果原本的 class hierarchy 很成熟完善, 然後上面的人對你做了些奇怪的要求, 希望你不去動到它的結構就能搞定; 另一個奇怪需求是「編譯時間」, 有些軟體系統很肥大, 你不用 Visitor 直接去改, 重編相關的東西就要等 20 分鐘, 這樣寫程式的人會受不了, 是學校研究生的話八成都跑去打電動打超過 20 分鐘的好幾倍才會回來看編好了沒, 這時候也可能會考慮拿 Visitor 來用。 一般 C++ programmer 還會利用一種叫 compiler firewall (又叫 pimpl) 的技巧, 來縮短更動實作細節時所需的重編譯時間, 某些時候利用這種技巧可以省下跟用 Visitor 相同的編譯時間, 這時就不需要刻意去使用 Visitor。 : 昨天又想了一下 想到「人月神話」中的no silver bullet : 軟體的問題有2種 : 一種是Essential Difficulties 另一種是Accidental Difficulties : 像是design pattern解決的算是因為工具選擇所帶來的Accidental Difficulties : 還是軟體本來就需要套用pattern? pattern 不是沒寫過程式的人一開始需要學的, 而是要先寫過很多結構爛爛的程式, 自己認真思考過怎樣改比較好一段時間後, 才適合開始去學來用的東西。 對於撰寫需要抽象化的程式部分來說, 比較沒經驗的,剛下手一定是結構紊亂的程式碼, 稍有經驗的,剛下手會是比較有規律性,但欠缺抽象化的程式碼, 很有經驗的,一下手可能就是很抽象化的程式碼,但不是任何已知的 pattern, 超有經驗的,一下手通常就會是 pattern。 一下手就是 pattern 是長期實務經驗累積而來的一種直覺, 而不是出於「一定要把某某 pattern 套某某程式碼」的心態, 因為下手的時候會知道以前寫過類似的東西, 但是寫到後來一定會發生某某問題, 然後哪邊要改來改去搞來搞去, 搞到後來一定會亂成一團, 然後曾經 try 過幾種方法做抽象化結果都不是很好, 最後發現某某 pattern 剛好很好用, 基於這樣的經驗才會一下手就是 pattern, 但是這少說也得寫過 20 年程式才有可能辦到。 所以 pattern 書籍的序言應該補一句類似叔叔是有練過的小孩子不要亂學這類話, 請讀者先多練練基本功再來實際用這些東西會比較好。 -- 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/09 17:29)
deepkh:推一下 :) 05/02 20:06