看板 Soft_Job 關於我們 聯絡資訊
感謝 pttuser 大 這麼認真回覆我的"觀察者模式" 我只好發一篇討論一下 正文: 我知道有些會說 Pub/Sub 與 Observer 不同 有些說 兩種 pattern 根本不同層面 一個是網路導向架構 一個只是物件導向的實做 一個是 async 一是 sync ..等 如 Stackoverflow https://goo.gl/qRUQOK 但是很抱歉 Observer Pattern 的確就是 Pub/Sub Pattern 這不是自我感覺良好 講話要有根據的 首先,昨晚回覆過的 GoF 原著就說了 Observer 別名 就是 Publish/Subscribe http://i.imgur.com/4l7B6P7.jpg
GoF 設計模式 ,相信早已是必讀聖經 他們著作就是這樣寫 你要說他們錯,另起爐灶,我也是佩服 但是,我也不是說 async/sync 的觀點錯誤 在不同時空背景,不同語言... 的狀況下 Pub/Scribe 運用在不同的領域 意義當然不一樣 簡直就像拿明朝的劍,斬清朝的官一般 良葛格也說過 技術名詞紛爭多 https://goo.gl/MkqlMx 學的是模式的原理與精髓 這些名詞理應是拿來溝通 方便吸收理解 不是拿來給您裝逼的 另外,您說我只會死讀書翻譯 那我蠻開心的 起碼我有花時間在這塊 並非口說無憑 我反而懷疑,您是否有實務開發經驗? 實務中,這些模式並沒有限制做法 反而都會變形與結合 從來沒有人說 Observer 只能用 sync 或 async 其根本,的確就是「發佈-訂閱」的概念 最後 以下這些書籍也都是相同論點 不知您是否還認為,只有自己正確呢? 設計模式之禪 http://i.imgur.com/VaawqKz.jpg
GoF原文中譯 http://i.imgur.com/ARCZcdv.jpg
品味Java的21種設計模式 http://i.imgur.com/QfYJWMS.jpg
大話設計模式 http://i.imgur.com/3DG8Udu.jpg
設計模式 http://i.imgur.com/XvvOVUE.jpg
深入淺出設計模式 http://i.imgur.com/5tfrgVj.jpg
謝謝指教 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 42.72.156.63 ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1483578056.A.A2A.html ※ 編輯: Jasonzheng (42.72.156.63), 01/05/2017 09:03:01
pttuser: 去看看aws等大廠怎麼作pub/sub的啦,看看現在實作的產品01/05 09:15
pttuser: 怎麼區別pub/sub和observer吧01/05 09:15
Trick: 好痛01/05 09:15
aws9527: 哈哈哈 好腫01/05 09:17
femlro: 好多書喔XD01/05 09:18
買書月光族...
femlro: 推推01/05 09:18
pttuser: 再不濟就去參加pycon or jcconf這種entry level型的討論01/05 09:18
pttuser: 看看現實生活中實作面為何盡量區分兩者的不同01/05 09:18
srxrrr: 我是不了解這個技術 但p大火氣也太大了吧 人家好心分享01/05 09:19
srxrrr: 如果覺得有誤 就好好討論 拼命噓做啥...01/05 09:19
pttuser: 一天到晚只會糾結名詞,現實實作中早已經把兩者分開談了01/05 09:20
dreamnook: ww01/05 09:20
Trick: 糾結名詞的是誰啊01/05 09:21
pttuser: 還好痛咧,我是擔心哪天某個新人被要求作pub/sub,結果01/05 09:22
pttuser: 看你的文章寫出sync observer結果下場就很慘了01/05 09:22
pttuser: 你的文章有講到async和sync差別?新人光看你文章只會被你01/05 09:23
pttuser: 誤導就是sync01/05 09:23
ok 的確有可能 ((雖然我一再強調 Observer 沒有 sync 規範... 我稍晚會在補充進內文 以免誤導他人 謝大大指教^^
pttuser: 真是笑話,這種實際面早已區分的作法居然被你混為一談01/05 09:25
敝人認為 其實就只是名詞重用 並非混為一談 內文討論的範疇 就是 Observer 無誤
jack0204: 發一篇文章來讓大家看看你的觀點阿01/05 09:27
femlro: 冷靜冷靜,討論不要生氣01/05 09:30
pttuser: 叫我寫就寫?你哪根蔥?林北要來gdb了不陪你們練校話 01/05 09:34
wix3000: 看起來跟腦羞有87%像01/05 09:35
dreamnook: 那我只好放個激醬了 寫不出來只好噓01/05 09:36
dreamnook: 你要牛肉還是豬肉?01/05 09:36
robler: 哈哈哈 惱羞成怒囉 講不出東西來就顧左右而言他 裝忙XD01/05 09:37
pttuser: 林北是不用上班膩?當我跟你們一樣都是學生嗎01/05 09:38
小弟開工中 晚上再補充~
robler: 不懂在那邊裝懂 被打臉了就假裝要上班沒空 哈哈01/05 09:38
dnabossking: 一大早火氣就這麼大,也是不簡單01/05 09:38
dreamnook: 我也有上班呀 只是不會閒到可以一直噓而已01/05 09:38
ripple0129: 過度探討名詞解釋是不健康的01/05 09:41
沒錯..爭名詞超沒意義阿阿啊
loveflames: 如果這麼忙,怎麼有時間一直噓01/05 09:42
vn509942: 最喜歡看論戰了01/05 09:43
kightkids: 我偏向支持pttuser. observe pattern 只有1對多.01/05 09:53
kightkids: 但pub/sub是可以多對多的概念.01/05 09:54
kightkids: 可以說pub/sub有observe的概念,但反過來說aka就不行。01/05 09:55
的確,現今實務中的 pub/sub ,類似把 observer 當實做子集的概念。 但我文中所指的是更高的抽象層次 謝謝討論:)
elements: 常有人說 xxx 只是工具,重要的是背後的腦袋01/05 10:06
elements: 名詞..很重要.. 但知道某些名詞被重用也是你的能力之一01/05 10:08
沒錯! 其實就只是名詞重用
elements: 事實上詞彙指的常常是一片東西 而不是一個東西01/05 10:08
elements: 真要挑語病 挑不完的01/05 10:10
elements: 至於 GoF 的公信力... 我個人是覺得還好.. 也就本書01/05 10:11
因為我在探討的 就是該書阿 xd
vencil: 糾結名詞又惱羞01/05 10:11
elements: 我剛畢業的時候也很注重名詞.. 但你發現幾個強者講的不01/05 10:13
elements: 一樣,就漸漸覺得應該要學習能夠穿過詞彙去懂那個想法 01/05 10:14
有感,許多名詞提出時,抽象層次高 一有普遍實務做法,就容易被混淆重定義 要爭爭不完..
gn01838335: 一直狂噓xdd01/05 10:17
pttworld: 認為是另一個名字、稱呼,路過。01/05 10:28
感謝:)
chocopie: http://i.imgur.com/Lz2JJA7.jpg01/05 10:37
Ekmund: 等等 observer有規定只能一對多?01/05 10:39
Ekmund: subject完全可以擴展吧01/05 10:41
沒錯
sing10407: 連討論都不討論就說打臉別人? 我還以為是覺醒青年版01/05 11:26
這不是在討論嘛o.o
ug945: 戰技術不錯啊 XD01/05 11:31
gn01838335: Subjet擴展違背原則啊xdd01/05 11:38
gn01838335: 戰這個每個人有很多意見xdd 01/05 11:40
gn01838335: 我可以加入戰局嗎 01/05 11:40
其實我也覺得蠻有趣的 xd 我說一下我的看法 用個比較爛的例子: 「就像資料庫的概念 多對多,其實就是兩個反向一對多」 原著中有提到一個 Observer 是可以觀察多個 Subject 的 一對多僅為單一抽象觀念的兩個層面
Ekmund: 可以 我只寫過pub/sub 是真的不懂在求教01/05 11:41
原著有說明 當遇見複雜的情形 可以在引入 中介者模式的變化 或再結合 單例模式 Observer Pattern 本身抽象程度高、變形之廣 可想而知@@
Sirctal: pttworld幹嘛火氣那麼大 大家都要上班阿...01/05 11:49
Sirctal: 你可以晚上寫一篇pub/sub 跟 observer的差異吧... 01/05 11:49
dreamnook: 欸 是同一個人嗎XD01/05 11:50
應該不是吧 xd
Sirctal: 既然你都提出來問題 發表一下不為過吧 能力越大 責任越大01/05 11:50
※ 編輯: Jasonzheng (42.72.156.63), 01/05/2017 12:02:42
chocopie: 奇怪pttworld只是剛路過啊,你說的是pttuser吧?XD01/05 11:56
gn01838335: 寫code太久眼睛花了嗎?01/05 11:57
gotptt: 感覺observer是包含了pub/sub啦 更大的軟體架構01/05 11:59
gotptt: 就好像pipeline包含data double buffer01/05 12:00
gn01838335: 樓上正解01/05 12:00
求轉載兩位言論 xd 不然好像我很主觀 qq
Frozenmouse: 我覺得現代的pub/sub就是observer的變形應用啊XD01/05 12:00
我也覺得..
gn01838335: 但是要做到很困難01/05 12:00
gn01838335: 所以才有pub sub誕生 01/05 12:01
gn01838335: 若要乾淨的原則來講本來就是包含pub sub01/05 12:01
gn01838335: 但做不到啊01/05 12:02
dreamnook: 我是覺得好像變成在爭執設計上跟應用的差異01/05 12:02
真的! 設計跟實務 本來就差很多..
dreamnook: 能夠釐清更好 我也不懂為啥Subject增加違反原則XD01/05 12:03
Sirctal: XD 看錯了 開頭都是ptt01/05 12:03
※ 編輯: Jasonzheng (42.72.156.63), 01/05/2017 12:06:01
gn01838335: 我們不是學者,做出有意義可維護高的東西可擴充,異 01/05 12:12
gn01838335: 懂的東西就好。比較來到實價不是嗎xdd 01/05 12:12
gn01838335: 我也覺得你的分享很棒啊,但設計模式怎麼用是團隊共 01/05 12:14
gn01838335: 識。解耦,不過份鬆散,可擴充,彈性 01/05 12:14
gn01838335: 原則掌握好大家都是設計大師 01/05 12:15
gn01838335: 說真的我工作那麼多年看過很多家公司很少強調要什麼 01/05 12:16
gn01838335: 模式xddd 01/05 12:16
gn01838335: 直接打開code解釋概念和想法,能說服teammember最重要 01/05 12:18
gn01838335: 重點是你的code人家改不改得多,而不是講一堆天花亂墜 01/05 12:19
gn01838335: 名詞 01/05 12:19
gn01838335: 公司同事不是來做模式研討的 01/05 12:20
chupiggy: 有人只會噓 也沒看到分享什麼東西出來 01/05 12:23
louise13: 感謝分享 01/05 12:42
nichinichi: 感謝作者帶起一股討論技術的新氣象 01/05 13:06
pttuser: 變形是在變啥?抽象程度高有比作春夢的抽象還高嗎? 01/05 13:20
pttuser: 現在就是一堆人實作搞混或是認為抽象程度比玉山高 01/05 13:21
pttuser: 實作上亂七八糟,討論變形討論不完啦 01/05 13:21
pttuser: 每個人都能自己亂變一通 01/05 13:21
pttuser: 所以實作上把observer界定就是sync , one-to-many 01/05 13:21
pttuser: 把pub/sub界定就是async , many-to-many 01/05 13:21
pttuser: pub/sub實作上被廣泛應用的是mqtt 架構 01/05 13:21
pttuser: MQTT不是GOF所寫的observer pattern 01/05 13:21
pttuser: 原po你自己想想,你寫的observer怎麼實作facebook messag 01/05 13:21
pttuser: er? 01/05 13:21
pttuser: 林北喜歡噓是不行膩?林北又要來gdb了 01/05 13:25
dreamnook: 所以你的立場就是observer只能sync 只能1-to-many 01/05 13:27
dreamnook: 激醬也只能加牛肉或加豬肉 不能牛豬混合這樣 01/05 13:28
pttuser: 你要加個event driven作obsever async, one-to-many也沒 01/05 13:34
pttuser: 人反對阿,反正抽象嘛,變形嘛,高興就好了阿哈哈哈哈 01/05 13:34
robler: 開始語無論次了耶 01/05 13:36
robler: 實作上界定是誰界定 你自己嗎? 01/05 13:37
robler: 講話一點根據都沒有 你怎麼不講講你怎麼實作FB msger 01/05 13:38
wix3000: 壞掉了 50收 01/05 13:38
pttuser: robler我這樣語無論次?看來你程度不高,真的不懂我在說 01/05 13:39
pttuser: 啥? 01/05 13:39
pttuser: 不說啦,反正不關我的事,掰啦哈哈哈哈 01/05 13:39
dreamnook: 所以你的立場的確就是激醬只能加牛肉或豬肉沒錯 01/05 13:41
m1309050: 只有自己是對的,在職場碰到這種人真的是災難 01/05 13:42
robler: 真的是惱羞成怒耶 笑死人 講不出道理就胡扯一通 01/05 13:45
robler: 講的東西半點根據都沒有 不是寫一堆專有名詞就叫懂好嗎 01/05 13:47
dreamnook: 是不是把network層和software層混在一起了(′・ω・‵) 01/05 13:51
tpstyle: 在職場碰到這種人真的是災難+1。 01/05 13:52
tpstyle: 原po加油,持續期待你的技術分享 01/05 13:53
pttuser: dreamnook我講的是架構不是協議,看清楚……… 01/05 13:54
dreamnook: 我當然看不清楚呀 所以我才一直在講激醬牛豬肉飯XD 01/05 13:56
dreamnook: 你有個根據也好 來源也行 回文也可以 01/05 13:57
dreamnook: 但我程度低只覺得你是observer就1-to-many sync固定 01/05 13:58
ns1234: 有分享有推 總比有人。。嗯 01/05 14:00
dreamnook: 趁building我隨意google:https://goo.gl/IdCoC4 01/05 14:06
dreamnook: 這篇就有在implementation表現出Observer與Pub/Sub不同 01/05 14:08
dreamnook: 我快速閱覽過的理解是Observer是直接針對Subject 01/05 14:09
dreamnook: Pub/Sub則是有個middle man在中間(broker) 01/05 14:10
dreamnook: 詳細解釋就看誰程度比較高了 我繼續苦勞去XD 01/05 14:12
gmoz: 這就是火大模式 01/05 14:15
Argos: 哈哈哈 開始了開始了 又是這種空泛的爭論 學模式學到走火入 01/05 14:18
Argos: 魔就是這種下場 哈哈哈 01/05 14:18
Argos: 某p還裝忙 明明閒得要死吧?噓文都快比原文字數多囉 01/05 14:20
kurtsgm: 其實我覺得sync/async根本不是重點吧...... 01/05 14:25
tw88: 有看有推 感謝分享 01/05 14:26
ggBird: pttuser別笑破人覽趴了 01/05 15:15
gn01838335: 這一次我挺pttuse乾淨的code的確是樣 01/05 16:05
gn01838335: 但是要大家一致實作是很困難 01/05 16:06
dreamnook: 你的實作很困難是指Observer Pattern實作困難還是? 01/05 16:10
ripple0129: Observer是廣義的pub-sub,pub-sub是更具體化實際做法 01/05 16:18
ripple0129: ,兩個都沒對錯,看的是廣義與狹義罷了。講白了就是吵 01/05 16:18
ripple0129: 的是白馬非馬的概念。 01/05 16:18
ripple0129: 怕產生誤解的是我叫你買飯桌(pub-sub),結果你買的是 01/05 16:21
ripple0129: 桌子(observer),是桌子沒錯但不是我要的飯桌,這時就 01/05 16:21
ripple0129: 產生了名詞上造成的誤解。 01/05 16:21
gn01838335: 我覺得pttuser很care實作細節的精緻的。應該功力很強 01/05 16:24
gn01838335: 可否跪求大大的code 01/05 16:24
Frozenmouse: 結果連實作上是誰界定也講不清楚 01/05 16:36
blackie1019: 蠻認同pttuser是有料的。但要讓大家懂真的辛苦... 01/05 16:40
kightkids: 站在Subject得add(Observer)這點,覺得跟pub/sub不一樣 01/05 16:42
Frozenmouse: 我就不懂為何要執著於大廠怎樣,GoF當初把pub-sub當 01/05 16:50
Frozenmouse: 成observer別名,和現代的pub/sub怎麼實作,兩者到底 01/05 16:50
Frozenmouse: 有什麼衝突啊XD 01/05 16:50
Frozenmouse: 而且也不是天差地遠的那種,本質上也都還是訂閱啊… 01/05 16:53
dreamnook: 我是覺得多個Middle Man你還是要add(sub) 01/05 16:56
dreamnook: 只是這個middle man不負責產生notification 01/05 16:56
dreamnook: 而是負責把別的人給的notification(pub)傳給sub 01/05 16:57
dreamnook: 但把關係圖畫完後不會只有observable-observer的關係 01/05 16:59
dreamnook: 而是pub-middle man(broker)-sub 因而不同 01/05 16:59
dreamnook: 只是再打下去我覺得我只會產生更大的混亂了XD 01/05 17:01
Frozenmouse: 同樓上,概念還是subject->observer這樣,只是透過中 01/05 17:11
Frozenmouse: 間人介接XD 01/05 17:11
stosto: Pattern只是人家整理出來最長遇到問題而衍生出的樣板解法 01/05 18:38
stosto: 而已,dp哪個是打從娘胎就有的 01/05 18:38
gn01838335: 其實userptt講了應該用產品決定設計模式 01/05 18:52
ADYex: 推分享。設計模式重要的是它的精神,而不是死板板的說怎樣 01/05 19:09
ADYex: 怎樣寫才是什麼什麼模式。 01/05 19:09
frank11118: 推分享,但某人學到走火入魔了 01/05 19:14
Argos: 真的有料 就不會用那種態度這樣討論設計模式 有的大概只是 01/05 19:14
ADYex: http://i.imgur.com/2wXVcKa.jpeg 01/05 19:14
ADYex: 重構—向範式前進 第28頁。 01/05 19:15
Argos: 半點料 然後就自以為是 看那種狂噓人家的風格 是有多自卑 01/05 19:15
ADYex: 雖然這裡主要是講結構圖,但其實就是指同樣的設計模式並不 01/05 19:16
ADYex: 會只有一種實作方法。 01/05 19:16
Argos: 本來就是心法的東西 大觀念樓主也沒寫錯啥 硬要在那邊爭 所 01/05 19:18
Argos: 以我說走火入魔了 心已經容不下任何東西了 寫code寫到這樣 01/05 19:18
Argos: 也是蠻悲哀的 01/05 19:19
ADYex: 設計模式是拿來跟人溝通、改善程式、解決問題用的,不是拿 01/05 19:25
ADYex: 來死背名稱用的。 01/05 19:25
locklose: 要戰就發一篇,推文不易追蹤。 01/05 19:30
remmurds: 吵什麼 design pattern 名字實在很無聊 01/05 19:36
anr2: 程式能動比啥都重要 01/05 23:11
loveme00835: xD 能不能反射性地用出來才是關鍵 01/05 23:28
Csongs: 私心求pttuser發一篇幫助我們了解,小弟只能p幣贊助 01/06 08:18
Schaos: 糾結名詞真的有差嗎?理解後能靈活運用才是重要的。 01/06 09:14
sdyy: 糾結在名詞 狂噓人 01/07 10:01
brucetu: 我認為pub/sub在程式及時間上解藕發佈與接收者,一般講觀 01/07 17:28
brucetu: 察者並不會要求你做個中間人來分離這兩者,我想pttuser 01/07 17:28
brucetu: 對於你將兩者說成是一樣東西不能認同原因也在此。 01/07 17:28
brucetu: 當然你可以說我的觀察者模式通常還會放個中間人做異步, 01/07 17:30
brucetu: 我的發佈訂閱也不一定非同步。就好像我牛肉炒飯通常改用 01/07 17:30
brucetu: 豬肉還芶芡,我豬肉燴飯有時候不芶芡。 01/07 17:30
KeySabre: 討論的時候求名詞精確 其實是好事 實作時當差不多先生的 01/07 17:43
KeySabre: 只是把債延後還 01/07 17:43
Jasonzheng: 其實觀察者一直都可用中間人啦... 01/07 17:49
Jasonzheng: 而且這不是我差不多先生 或是 「反正抽象、彈性」 01/07 17:50
Jasonzheng: 而是 原著就有提到這樣的用法喔 01/07 17:51
Jasonzheng: 但原著有提到 這是借鑒了 mediator 模式的觀念 01/07 17:52
Jasonzheng: 因此我當初撰文時並未補充 01/07 17:53
Jasonzheng: 而是想在未來的文中提及 01/07 17:55
Jasonzheng: 很抱歉..我的疏失造成各位誤會 01/07 17:56
Jasonzheng: 我這陣子會再補充進內文 01/07 17:56
KeySabre: 我沒說你是唷 別亂坐 XD 有人整理分享激發討論 我都很感 01/10 23:29
KeySabre: 激的 01/10 23:29