→ legnaleurc:你對於 DP 的概念似乎有點綁定在 OO, C++!=OO, OO!=DP 07/26 01:39
→ legnaleurc:GoF 的 Design pattern 對定義其實滿寬鬆的 07/26 01:40
嘗試回應一下好了。我感覺我的看法其實跟你一樣,只是我一直避免離開
本版的範圍(C++),所以文章難免充斥一堆 C++ 派的物件導向。我知道就算
限定物件導向,還有像 Smalltalk/ObjC 等等風格完全不同的語言,不過全部
都會離題 orz 我自己對設計模式下的定義是「常見問題的常見(好)解法」,
所以不同語言都有自己的設計模式。然後關於 GoF 寫的那本書我想提三點:第
一個是它的全名是:
| Design Patterns: Elements of Reusable Object-Oriented Software
所以其實他們一開始就只專注在物件導向。但我強烈同意他們收集的設計
模式別的程式語言也可以用,只是別的語言的設計模式不一定會收錄進去罷了。
第二個,這本書一直推廣「物件組合比繼承好」可是好像比較少聽到有人談這
個。第三個,這本書一直強調介面,其實就是某些封裝系統的優點啊!這根本
就是在幫其他封裝系統打廣告吧 xDDD 我想引用 Wikipedia 裡面關於物件導
向發展歷史的一段話:
| This is in contrast to the existing modular programming that
| had been dominant for many years that focused on the function
| of a module, rather than specifically the data, but equally
| provided for code reuse, and self-sufficient reusable units
| of programming logic, enabling collaboration through the use
| of linked modules (subroutines). This more conventional
| approach, which still persists, tends to consider data and
| behavior separately.
我一直覺得如果真的這麼想把介面和實作,或是把資料和行為分開,那其
實可以考慮用模組或其他封裝方法。(以模組為主的程式語言也不斷在進化中,
我個人覺得一點也不輸給物件導向為主的語言。)
(重新整理推文一下)
→ legnaleurc:為什麼 lambda 和 command pattern 是互斥的 ... 07/26 01:37
推 chchwy:這篇沒有說lambda跟command互斥,然後DP的確是建基於OO沒錯 07/26 01:47
→ legnaleurc:那為什麼有了 lambda 就很多地方不需要 Command? 07/26 01:54
推 littleshan:是這樣沒錯啊,但是只有lambda還不夠 07/26 02:02
→ littleshan:還需要 first-class function 以及 closure 07/26 02:03
→ littleshan:C++0x 的 lambda 我覺得根本就....很難用 07/26 02:03
沒有互斥。例如如果在 Command 裡加上 undo 就沒辦法(輕鬆乾淨的)用
lambda 做,但如果只是要延遲執行,或一次執行一大串指令,完全沒有問題。
然後 C++0x 的 lambda 有 closure 啦 xD 新標準還沒有那麼不堪。最後我個人
覺得如果要 first-class function 可能跳槽到 functional 程式語言比較快。
→ loveme00835:其實甭說優點缺點, 完全是寫得爽不爽的奇魔子問題, 都 07/26 02:35
→ loveme00835:那麼方便也不會有這麼多種語言了, 如果寫得熟可以把缺 07/26 02:36
→ loveme00835:點當作繞點路, 甚至用其他語言的特性來做互補, 這樣作 07/26 02:37
→ loveme00835:還比較實在, 戰那些都沒用 07/26 02:38
嗯我想我非常支持用多個語言一起使用(前提是合作的人也會...xD)。這
邊為了要挑戰「(某種)物件導向是寫程式唯一道路」這種說法,只好一直講
現在流行的方法並不是萬靈丹、可能有更好的方法云云 orz 在現今(某種)物
件導向程式語言統治全世界的狀況下,總覺得如果程式設計師沒有意識到有其
他選擇,那也不用談什麼互補了。至於我個人的話,我自認對 C++ 不至於非常
不熟,也不是不知道一些繞路方法... 反正大家都 Turing-complete, 沒有做
不出來的道理 xD
※ 編輯: Favonia 來自: 140.112.30.39 (07/26 08:17)
※ 編輯: Favonia 來自: 140.112.30.39 (07/26 08:34)
推 littleshan:如果function回傳一個capture區域變數的lambda會炸掉 07/26 11:01
→ littleshan:上述的動作在fp中很常見,但沒有gc的語言就很難做到 07/26 11:01
先說我還沒有把 C++0x 標準翻過一次。但就我目前非常粗淺的了解,好像
用 captured-by-copy 不會出狀況。相關標準節錄如下:
| An entity is captured by copy if .... For each entity captured
| by copy, an unnamed non-static data member is declared in the
| closure type. ....
@ C++0x (N3242) 5.1.2 / 14
| When the lambda-expression is evaluated, the entities that are
| captured by copy are used to direct-initialize each corresponding
| non-static data member of the resulting closure object. ....
@ C++0x 5.1.2 / 21
如果我的理解沒有錯誤的話,可能還沒有太難用啦!不過如果是 captured-
by-reference 我也有 90+% 的信心會導致未定義 :P
※ 編輯: Favonia 來自: 140.112.30.39 (07/26 11:41)
※ 編輯: Favonia 來自: 140.112.30.39 (07/26 22:19)
推 tomap41017:這才是值得看的文章阿,感謝!! 07/27 02:36
編輯:剛才發現 Obj-C 也在看板範圍內,不過這篇文章就先這樣好了 :P
※ 編輯: Favonia 來自: 140.112.30.39 (07/28 01:52)
※ 編輯: Favonia 來自: 140.112.30.39 (09/21 08:45)
※ 編輯: Favonia 來自: 140.112.30.39 (10/09 11:56)
※ 編輯: Favonia 來自: 140.112.30.39 (10/09 13:32)