“領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)”答疑(五)

Refactoring

問題: 重構(gòu)項(xiàng)目如何借助領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)做指導(dǎo)蚓挤?

簡(jiǎn)單地說:就是通過“領(lǐng)域建乃祭纾”驅(qū)動(dòng)對(duì)業(yè)務(wù)高效的學(xué)習(xí)和分析萨驶,并以“領(lǐng)域建谋啬幔”驅(qū)動(dòng)對(duì)軟件更好的再設(shè)計(jì)和重構(gòu)。


首先,圍繞著領(lǐng)域建模來學(xué)習(xí)業(yè)務(wù)知識(shí)和既有代碼判莉,會(huì)更加系統(tǒng)和高效豆挽。

我們說軟件開發(fā)是一個(gè)學(xué)習(xí)的過程。咨詢師在面對(duì)陌生的業(yè)務(wù)和復(fù)雜的遺留代碼時(shí)券盅,通過建模相當(dāng)于是對(duì)業(yè)務(wù)和既有代碼的一個(gè)系統(tǒng)化的學(xué)習(xí)過程帮哈。領(lǐng)域模型是記錄所學(xué)結(jié)果的最好方式,除此之外它還能在學(xué)習(xí)過程中時(shí)刻提醒優(yōu)先去關(guān)注核心概念锰镀,以及指導(dǎo)應(yīng)該在哪些還不一致的地方繼續(xù)投入精力梳理娘侍,挖掘更本質(zhì)的問題。

在過程中我會(huì)要求客戶中對(duì)系統(tǒng)最了解的專家和我結(jié)對(duì)泳炉,也會(huì)抽時(shí)間自己一個(gè)人安靜的看代碼憾筏。我會(huì)畫各種草圖,然后再整理成UML花鹅,講給客戶專家獲得他們的反饋氧腰,直到大家一致認(rèn)可當(dāng)前的模型設(shè)計(jì)基本可以解決對(duì)應(yīng)的業(yè)務(wù)問題并滿足代碼改進(jìn)目標(biāo)。

具體到建模方法上刨肃,如前文所說古拴,領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)并沒有約束采用哪種方式。一般我用的最多的還是面向?qū)ο蠓治鲈O(shè)計(jì)以及正交設(shè)計(jì)的各種原則和技術(shù)真友。

需要注意的是黄痪,很難一開始就能有完美的設(shè)計(jì),就算有也應(yīng)該需要花很長的時(shí)間盔然,可能超出所有人的耐心桅打。而且越是完美的設(shè)計(jì)落地難度越大,而沒有落地的設(shè)計(jì)是沒有產(chǎn)生實(shí)際價(jià)值的愈案。

合理的做法是油额,先有一個(gè)大家認(rèn)可的更好的設(shè)計(jì),然后在重構(gòu)過程中不斷獲得反饋刻帚,再去迭代的演進(jìn)這個(gè)設(shè)計(jì)潦嘶,讓它逐步在落地的過程中趨于完美。

有了初始的領(lǐng)域模型后崇众,接下來我們需要考慮新的設(shè)計(jì)如何落在當(dāng)前系統(tǒng)里面掂僵,即如何將代碼重構(gòu)過去。這也不是能一蹴而就的顷歌,需要設(shè)計(jì)如何和既有系統(tǒng)兼容的演進(jìn)式方案锰蓬。我們不能只有high level的設(shè)計(jì),還要和大家協(xié)商出一個(gè)可落地眯漩、可執(zhí)行的演進(jìn)策略芹扭。

再然后就是和大家pair programming麻顶,在重構(gòu)的過程中逢山開路遇水搭橋,解決一個(gè)一個(gè)的問題舱卡,通過反饋再繼續(xù)演進(jìn)領(lǐng)域模型和代碼辅肾。

這里要回答另一個(gè)問題:為什么沒有用社區(qū)里很流行的事件風(fēng)暴(Event Storming)建模方法?

“事件風(fēng)暴”和“四色建穆肿叮”都屬于可視化的分析建模方法矫钓。尤其是“事件風(fēng)暴”,適合團(tuán)隊(duì)一起參與舍杜,幫助所有成員快速達(dá)成共識(shí)新娜。在建模過程中需要用到各種顏色的便利貼,按照一定的建模規(guī)則進(jìn)行既绩,所有參與者一起分析業(yè)務(wù)并得到初始的模型設(shè)計(jì)概龄。

event storming

我在重構(gòu)咨詢工作中沒有使用“事件風(fēng)暴”,最主要的原因是 “我不會(huì)” :)

在客戶現(xiàn)場(chǎng)饲握,大多時(shí)候只有一個(gè)業(yè)務(wù)專家能陪著我私杜。大部分時(shí)間我只需要畫畫草圖,和他安靜的討論就夠了互拾。我見過的顧問帶著團(tuán)隊(duì)做事件風(fēng)暴建模,最后取得的最大成果是團(tuán)隊(duì)所有人幫著顧問梳理和熟悉了業(yè)務(wù)嚎幸。

最后颜矿,也是最重要的一點(diǎn)是,每種建模方式有自己的側(cè)重點(diǎn)嫉晶。事件風(fēng)暴擅長于可視化引導(dǎo)取得共識(shí)骑疆,而不善于對(duì)復(fù)雜業(yè)務(wù)進(jìn)行分析并對(duì)設(shè)計(jì)進(jìn)行抽象。

對(duì)于新開發(fā)的項(xiàng)目替废,在尚不清楚未來的業(yè)務(wù)變化方向的時(shí)候箍铭,本著不過度設(shè)計(jì)的原則,可以基于初始的共識(shí)模型先進(jìn)行編碼以快速獲得反饋椎镣,然后根據(jù)隨后業(yè)務(wù)的變化逐步演進(jìn)模型以及調(diào)整代碼诈火。

但是對(duì)于一個(gè)既有系統(tǒng)的重構(gòu)項(xiàng)目,任何初始的分析模型状答,只是做到把業(yè)務(wù)映射到初始設(shè)計(jì)冷守,幫助參與者達(dá)成共識(shí),還是遠(yuǎn)遠(yuǎn)不夠的惊科。這樣的模型可以作為起點(diǎn)拍摇,但還遠(yuǎn)不是終點(diǎn)。

好的模型設(shè)計(jì)是需要抽象的馆截,是在抽象之后依然易于理解的充活,甚至更易于理解的蜂莉。

既有系統(tǒng)的代碼里沉淀了曾經(jīng)業(yè)務(wù)面臨過的各種變化,它們體現(xiàn)在代碼中到處散布的條件分支判斷中混卵,體現(xiàn)在代碼中到處的重復(fù)邏輯上映穗,體現(xiàn)在每次新需求到來時(shí)的散彈式修改中。

代碼里所有的這些點(diǎn)都是抽象的源泉淮菠!模型設(shè)計(jì)需要基于代碼男公,識(shí)別業(yè)務(wù)的主要變化方向,分離不同的變化方向合陵,建立抽象枢赔,從抽象的維度重新解構(gòu)模型元素并尋求更本質(zhì)的組合關(guān)系,從更深的業(yè)務(wù)洞察里為抽象的概念和關(guān)系找到更符合業(yè)務(wù)本質(zhì)的設(shè)計(jì)拥知。

而上述這些踏拜,大多數(shù)時(shí)候需要的是學(xué)習(xí)更多的業(yè)務(wù)文檔,安靜的閱讀和分析代碼低剔,以及在需要的時(shí)候能找到相關(guān)的人進(jìn)行深入的交流速梗。

當(dāng)我們能進(jìn)一步得到一個(gè)兼顧易理解性和低成本響應(yīng)變化的,更體現(xiàn)業(yè)務(wù)本質(zhì)的領(lǐng)域模型襟齿,這才是指導(dǎo)既有系統(tǒng)重構(gòu)的良好起點(diǎn)姻锁。


《“領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)”答疑(六)》

《“領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)”答疑(匯總)》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市猜欺,隨后出現(xiàn)的幾起案子位隶,更是在濱河造成了極大的恐慌,老刑警劉巖开皿,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涧黄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡赋荆,警方通過查閱死者的電腦和手機(jī)笋妥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窄潭,“玉大人春宣,你說我怎么就攤上這事〖的悖” “怎么了信认?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長均抽。 經(jīng)常有香客問我嫁赏,道長,這世上最難降的妖魔是什么油挥? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任潦蝇,我火速辦了婚禮款熬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘攘乒。我一直安慰自己贤牛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布则酝。 她就那樣靜靜地躺著殉簸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沽讹。 梳的紋絲不亂的頭發(fā)上般卑,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音爽雄,去河邊找鬼蝠检。 笑死,一個(gè)胖子當(dāng)著我的面吹牛挚瘟,可吹牛的內(nèi)容都是我干的叹谁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼乘盖,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼焰檩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起订框,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤析苫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后布蔗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體藤违,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浪腐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年纵揍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片议街。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泽谨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出特漩,到底是詐尸還是另有隱情吧雹,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布涂身,位于F島的核電站雄卷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蛤售。R本人自食惡果不足惜丁鹉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一妒潭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧揣钦,春花似錦雳灾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宇姚,卻和暖如春匈庭,著一層夾襖步出監(jiān)牢的瞬間琴庵,已是汗流浹背疮薇。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赴邻,地道東北人呀洲。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓紊选,卻偏偏與公主長得像,于是被迫代替她去往敵國和親道逗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子兵罢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359