2

4.99人民幣的學習

 3 years ago
source link: https://teddy-chen-tw.blogspot.com/2021/06/499.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

4.99人民幣的學習

June 01 12:48~13:28

ACtC-3dMLlKxS3oOriYa5FOIDwMNIErkwAsrhKu0pnDxbo2smzpCb0KVa8rzrK_QxLuEYM2ivVDVxK8vbVDYY6ZB5uyj-HD9mKTd7Sge3cna13w3UoQGQFGdBcTdl5dExRqy5euXARjDHl-dNPEbAXW0sAieew=w2990-h1668-no?authuser=0

▲James Coplien的DCI演講

最近Teddy對DCI(Data, Context, Interaction)架構很感興趣,花了點時間在研究它。相較於其他軟體架構,DCI算是非主流架構,網路上的資料也比較少,主要來自於James Coplien所寫的《Lean Architecture: for Agile Software Development》以及他的幾個演講(可在YouTube上用DCI搜尋)。

前幾天晚上Teddy找到一個張曉龍(中興通訊資深軟件架構師) 在ArchSummit深圳2019的中文演講,講題是〈當DDD遇上DCI〉,引起Teddy的興趣。該演講的錄影被放在中國的「極客時間」上當作一個課程販賣,人民幣4.99。

Teddy沒有微信也沒有淘寶支付,無法購買此課程。後來託Erica請他的中國朋友幫忙,好不容易才買到這個課程,差點上演4.99元逼死英雄好漢的戲碼 XD。

雖然Teddy對DCI研究還不深入,但聽完這個演講,看到演講分享的實作,感覺講者有點胡搞瞎搞。有幾個很明顯的問題:

  • 亂用Context:DCI的C是Context,相當於Use Case,也就是Application Service,但講者卻想要用Context來進一步切割Aggregate,並且將C用DDD的Domain Service實作。這一點Teddy覺得有點「張飛打岳飛,打得滿天飛」的感覺。在講者所舉的例子中,除了造成不必要的人為設計複雜度以外(稍後說明),實在看不出什麼好處。
  • 未透過領域事件解偶:講者開口閉口解耦合、提高內聚,但範例程式本身就把「轉帳」和「傳遞訊息到手機上面」這兩件事耦合在一起啊。在DDD裡面,這靠Domain Event去解耦合,但講者在拆分Aggregate的時候,不但方式很怪,也壓根沒提到Domain Event,彷彿Domain Event不存在一樣。
  • 亂拆角色:講者對於Role(角色)的濫用與誤用到達一個讓人匪夷所思的境界,如圖1所示,講者以一個銀行轉帳的例子來說明他如何在DDD中套用DCI。他讓LocalAccount這個Aggregate Root扮演MoneyCollector, LocalMoneySrc, LocalMoneyDest, AccountInfo, Balance, Phone這五個角色。先不管這些角色的名字取的有多爛,Balance代表帳號餘額,光是Balance被獨立的一個角色這件事就非常詭異。其次,Phone這個角色存在的目的是為了轉帳成功之後通知使用者,為了具備通知的能力,一個LocalAccount需要去扮演Phone,這不是特別詭異嗎?LocalAccount去使用(use)Phone即可,為什麼要去扮演一支電話?難道你為了喝牛奶,需要扮演乳牛的角色嗎?
  • 未反映真實事件:Teddy不是銀行這個領域的專家,但轉帳這件事,很明顯的不會只牽涉到來源帳號與目的帳號,至少中間還會有一個Bank的角色。講者號稱要使用DCI來幫助DDD切割Aggregate,但他切了一堆有的沒得角色,反倒是這個重要的Bank角色完全沒有被提到,這不是瞎忙一場嗎?
ACtC-3fMYa7xUEqYyoLPZqVDB23XygsW37ek4GDaO14vbGBz1Af-Dz8--qDRp86na01QV7qN_HB9W0xyvA8HS0n-VM7CG2VKE2Hrpo9zGr6ebZOx7u52k0zz0E88NZziGNr9E_yWrg4AvDznPOF2nQdUu8meGQ=w1500-h1146-no?authuser=0

▲圖1:張曉龍在演講中所展示套用DCI之後的領域模型

正確示範

Teddy後來在〈An Empirical Study on Code Comprehension: Data Context Interaction Compared to Classical Object Oriented〉論文裡面看到一個比較像樣的DCI程式範例,如圖二所示。但這樣寫有沒有比較好,要再花時間想一下。

ACtC-3c-9KMbvFiSvl9yPTzbZoLQTgN15OONpFmgLFm0SW6QkNTg6oaXTuYt2UppS_Nl5JjJ6Xl136Hk92c2v5o6g3U32v5S8gYW5KapB8f7t_SRXTFCI1DoAJDKQmPN8Do02WyM1f5XqQx-azmg3g8FCi3v1w=w1394-h1946-no?authuser=0

友藏內心獨白:胡搞瞎搞,勇氣可嘉。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK