使用 tplant 快速概覽代碼的領(lǐng)域模型
接地氣的 DDD
看到技術(shù)雷達發(fā)表的《使用函數(shù)式語言建立領(lǐng)域模型》文章,非常開心,因為它使用了 TypeScript 來做落地說明,這是一個非常接地氣的 DDD。

有不接地氣的 DDD 嗎?參考《領(lǐng)域驅(qū)動設(shè)計》這本書和相關(guān)(主觀的)評價:
? ? ? ?
?
為什么說《使用函數(shù)式語言建立領(lǐng)域模型》就非常接地氣了呢?因為采用了 TypeScript。TypeScript 是 JavaScript 語言的超集,既有 JavaScript 所有的好處,又避免了 JavaScript 飽受詬病的動態(tài)類型帶來的問題。JavaScript 是很強大的,借瀏覽器這個宿主打遍天下無敵手,又借 NodeJs 滲透到服務(wù)器端。如果一定要糾結(jié)學習編程從哪門語言開始的話,那么當然是從學習 JavaScript 開始,沒有第二種更好的選擇。
TypeScript ?基于 JavaScript 構(gòu)建了類型系統(tǒng),而《使用函數(shù)式語言建立領(lǐng)域模型》則很好地演示了如何通過 TypeScript 的類型系統(tǒng)來設(shè)計領(lǐng)域模型。就是說,通過 TypeScript 的類型系統(tǒng),實現(xiàn)了代碼和領(lǐng)域模型的等價,不僅能夠用它在敏捷開發(fā)過程中進行溝通,而且保證跑著的系統(tǒng)真的就是使用了這樣的領(lǐng)域模型,也就是說,把領(lǐng)域驅(qū)動設(shè)計落了地。
如果只設(shè)計,不落地,那其實就是在吹牛嘛,不能當真的。多少團隊畫出的設(shè)計圖和實際代碼天差地別的?我想有經(jīng)驗的程序員心理都清楚。

很多人傾向所謂的設(shè)計先行,寫代碼前先寫設(shè)計文檔,畫圖。這里隱含的意思是,代碼是實現(xiàn),而不是設(shè)計。但是《使用函數(shù)式語言建立領(lǐng)域模型》糾正了這一觀點:代碼才是設(shè)計。
代碼=設(shè)計=模型=文檔
實際上代碼比較擅長表達設(shè)計內(nèi)容,從本質(zhì)上講,源代碼是一個文檔,可以完美地描述產(chǎn)品的每個當前設(shè)計決策。
《使用函數(shù)式語言建立領(lǐng)域模型》
代碼才是真正的設(shè)計,其他只是 PPT。但是《使用函數(shù)式語言建立領(lǐng)域模型》也說了,雖然代碼是設(shè)計,但是領(lǐng)域?qū)<铱刹灰欢茏x懂代碼(雖然 TypeScript 的語法簡單易學,但是我估計多數(shù)領(lǐng)域?qū)<疑踔聊承?Java 程序員,是從本能上排斥的),這制約了代碼=模型這樣的等式,存在鴻溝。這也是為什么統(tǒng)一建模語言(UML)大行其道的原因,它是一門表達軟件產(chǎn)品的圖形化語言。
既然 UML 是溝通利器,然而容易和代碼脫節(jié),正如作者說的:
我還記得我的第一份工作,每當有代碼或者設(shè)計改動時,都要去更新UML類圖以及數(shù)據(jù)庫設(shè)計文檔。這些文檔大概充當著共享模型的作用,但是最終這些設(shè)計類圖和文檔都慢慢變得不可信,因為沒有任何手段保證文檔會被及時更新。《使用函數(shù)式語言建立領(lǐng)域模型》
UML 是一種視圖。就像任何編程語言,其實本質(zhì)上只是二進制指令的一種高級視圖。既然最終運行的軟件跑的是二進制指令,而我們可以用高級語言去查看,那么同樣我們也可以把源代碼以一種圖形化的方式去查看。也就是說,將人工繪制 UML 圖,變成自動生成,那么就不存在代碼和 UML 圖脫節(jié)的問題了。想用 UML 視圖查看源代碼哪個版本,就基于該版本生成一份 UML 圖就好。
tplant
如果我們使用 TypeScript 來做開發(fā),那么已經(jīng)有開源工具可以自動從 TypeScript 代碼生成 UML 圖了,這個工具就是本人參與開發(fā)的 tplant!

使用錄屏

文字版使用說明
npm install --global tplant
cd your-typescript-project-folder
tplant --input src/**/*.ts --output output.svg
open output.svg
盡管《使用函數(shù)式語言建立領(lǐng)域模型》使用了 TypeScript 將 DDD 落地,但是在和不愿意看代碼的人之間仍然存在溝通鴻溝。本文厚著臉皮推薦了自己參與開發(fā)的一個開源工具 tplant,將 TypeScript 自動轉(zhuǎn)成 UML,彌補了《使用函數(shù)式語言建立領(lǐng)域模型》唯一的缺憾。
如果有人說連 UML 都不愿意看,說只想看 PPT,那么請他自行開發(fā)一個將代碼轉(zhuǎn)成 PPT 的工具吧。總之,不要相信 PPT,一切文檔都應(yīng)該基于代碼生成。
