作者henry8168 (番薯猴)
看板C_and_CPP
標題[問題] 組合模式(Composite Pattern)到底是什麼
時間Mon Sep 26 18:58:41 2016
在FB的靠北工程師看到一篇文
https://goo.gl/u8dTYM
這種語法確實很冗長,然後看到留言有一個回覆說要善用組合模式。
我就很好奇組合模式是什麼,Google了一下,找到這4份網頁,
http://www.one-tab.com/page/CRw70YIPR0Ky9az36aOG8Q
每一個都提到leaf、add、remove,但有看沒有懂,
請問有高手能解釋一下組合模式什麼概念嗎?
套用組合模式後,靠北工程師的那份Code又會變成怎樣的?
希望能夠讓我聽懂,200P將奉上給第一位解答者,感激不盡
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 58.115.109.218
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1474887527.A.E65.html
1F:→ chuegou: 合成? 09/26 19:01
好像也有稱作合成模式的
2F:→ Caesar08: 請善用TMP 09/26 19:24
TMP是...?
3F:→ pttworld: later的考慮switch case的fallthrough,要很小心。 09/26 19:32
組合模式就是改成switch嗎?
※ 編輯: henry8168 (58.115.109.218), 09/26/2016 20:16:55
4F:→ Caesar08: Template MetaProgramming的簡稱 09/26 20:59
5F:→ tinlans: 讓全部的東西繼承同一個 base,然後串成樹狀結構而已。 09/26 21:37
6F:→ tinlans: compiler 的 AST 那類東西一般都能用這種結構做 09/26 21:37
感恩,P幣已送出。繼續討論吧
7F:→ bluesoul: 直覺想到是多型或是責任鏈 09/26 21:42
8F:→ tinlans: 至於為什麼這東西可以解那問題,我也想不透 XD 09/26 21:43
9F:→ bluesoul: 合成模式應該是用來表達層狀結構的 09/26 21:44
10F:→ tinlans: 這鬼東西,一般的 factory + strategy 和基本多型概念 09/26 21:46
11F:→ tinlans: 就可以解了,FB 那下面不知道在反串什麼 09/26 21:47
12F:→ bluesoul: 我也覺得用錯pattern 09/26 21:50
13F:→ tinlans: 不然就是那個「組合模式」是其它英文的中譯 09/26 21:51
14F:→ tinlans: 還有其實這算 OOAD 板的範圍,那邊板主很傷心 XD 09/26 21:52
15F:→ ilikekotomi: 原來有OOAD板!! 等等去看一下 09/26 22:08
16F:→ descent: 你直接請他給一個 sample code 就好了。 09/26 22:09
17F:→ descent: 是不是嘴炮馬上就知道了。 09/26 22:09
18F:→ descent: 解決這問題哪是這麼簡單勞一句話就好。 09/26 22:10
我轉到OOAD板一起問好了,合成模式我查到的也都是樹狀結構相關的東西,
可能是那留言在嘴砲吧XD"
所以那一連串的if else的code,還有不同寫法讓版面繼續縮減嗎?
※ 編輯: henry8168 (58.115.109.218), 09/26/2016 22:33:18
※ henry8168:轉錄至看板 OOAD 09/26 22:34
19F:→ Caesar08: ...時間複雜度??? 09/26 22:34
就讓電腦可以比較有效率判斷執行版本的寫法,不用一個一個詢問 @@"
※ 編輯: henry8168 (58.115.109.218), 09/26/2016 22:35:36
20F:→ Caesar08: 時間複雜度 這個詞通常用在演算法分析 09/26 22:38
抱歉,已修改
※ 編輯: henry8168 (58.115.109.218), 09/26/2016 22:39:39
21F:→ Caesar08: 我是不知道那個方法寫起來最好維護,但TMP肯定執行最快 09/26 22:40
我正在看
https://goo.gl/vrD71Y
看不太懂 enum { value = N * Factorial<N - 1>::value }; 和一般enum不太一樣?
22F:→ bluesoul: 如果要快請參考map/hash + factory/command 09/26 22:46
只用過hash map,還在研究factory/command,
然後switch好像比較被推來取代if else?
※ 編輯: henry8168 (58.115.109.218), 09/26/2016 23:16:14
24F:推 legendmtg: 怎樣看都不是composite pattern啊 decorator還比較有 09/26 23:16
25F:→ legendmtg: 可能吧 而且原本的if就有問題了吧.... 09/26 23:16
26F:→ Caesar08: 一樣 09/26 23:18
我看懂了,原來是template的進階應用XDD,感恩
※ 編輯: henry8168 (58.115.109.218), 09/26/2016 23:26:28
27F:→ tinlans: 我比較疑惑的點是,如果 IS_OS_5_OR_LATER 等價於 09/27 03:39
28F:→ tinlans: ver >= 5 的話,那後面的一大串 else if 到底在幹嘛 XD 09/27 03:39
29F:→ tinlans: FB 沒交代清楚這點,可能要寫過 iOS 程式的會知道吧。 09/27 03:40
30F:→ tinlans: 真的等價的話,else 之後判斷 ver < 4 的範圍才有意義。 09/27 03:40
31F:→ tinlans: 所以我在想,他講的智障是不是更基本層面的問題.. 09/27 03:41
32F:→ pttworld: 如果不同人不同時期維護同一段程式是有可能的。 09/27 06:53
33F:→ pttworld: 不敢動邏輯寧可再開一條線出來,copy&paste來改。 09/27 06:54