過去一年主要在大型嵌入式系統(tǒng)中進行軟件重構的咨詢工作。對于大規(guī)模的遺留系統(tǒng)重構产捞,一方面會借助領域建模幫助深入了解業(yè)務醇锚、挖掘業(yè)務本質;另一方面需要借助領域建模進行軟件的再設計坯临,指導代碼的重構過程焊唬。
由于每個項目的重構效果都還不錯,客戶在總結時會把部分原因歸結到是因為有體現(xiàn)業(yè)務本質的領域建模做指導看靠。于是在客戶現(xiàn)場就會經常被問到 “要怎么才能做好領域建模赶促?”。大多數(shù)時候為了省時間我都直接回答“可以參考領域驅動設計(DDD)”挟炬。
然后馬上就會被問到:
“領域驅動設計怎么學鸥滨?”
“學習領域驅動設計有哪些推薦書籍嗦哆?”
當提供一些推薦書籍后,過段時間客戶又會過來問:
“領域模型和我們設計文檔里的架構設計圖有啥區(qū)別爵赵?”
“領域建模的核心是不是就是做好數(shù)據建模吝秕?”
“二十年前,面向對象就給出了完整的建模過程和方法了空幻,DDD中的領域建模和面向對象建模有啥區(qū)別烁峭?”
“領域驅動設計是否一定要使用面向對象編程語言?C語言能實現(xiàn)領域模型嗎秕铛?”
“我們當前為了安全性在做的一些軟件的形式化建模工作约郁,算是領域建模不?”
“從領域模型直接生成代碼但两,是否可行鬓梅?”
“社區(qū)里的DDD workshop都會采用的事件風暴建模方法,為什么你不用谨湘?”
OK绽快,當所有這些問題匯集到一起,我承認我最開始的時候犯懶了紧阔!
領域驅動設計不是一個完備的軟件設計過程或方法坊罢,它設立了一個目標,然后給出了部分方法擅耽。它缺失的部分活孩,由社區(qū)里的布道者們從其它已存在的軟件設計過程和方法中不斷為其找素材補缺。
我贊同領域驅動設計所提倡的設計目標乖仇,但是在實踐的時候卻經常借用其它各種有用的軟件設計方法做輔助憾儒,例如數(shù)據關系建模、面向對象分析設計乃沙、MDA起趾、DCI方法、正交設計原則警儒、形式化方法等等阳掐。這些方法大都是為不同目標提出來的,所以從嚴格的意義上來說冷蚂,它們不算是領域驅動設計缭保。但是不可否認領域驅動設計這些年被社區(qū)發(fā)展的似乎無所不含,這本也沒有問題蝙茶,畢竟很多新的技術方法就是通過跨界和兼容并蓄發(fā)展起來的艺骂。
但是回到解答問題上時,就不能犯懶說什么都是“領域驅動設計”隆夯,或者都不是钳恕。歷史是螺旋式上升的别伏,即使有些方法和概念又重新流行起來了,但是也肯定和之前的存在差異和改進的忧额。通過把各種概念梳理清楚厘肮,可以幫助我們更好的學習和實踐領域驅動設計。
于是趁著最近空閑睦番,還一下自己之前犯懶欠下的債类茂,通過這系列文章回答下被問到的和領域驅動設計有關的問題。