追尋完美設(shè)計(jì)是從一開始就伴隨著領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)的常見問題,但DDD不是為完美主義者而生的。最近在阿姆斯特丹的DDD歐洲會(huì)議上,Eric Evans在其演講中指出,為了停止這種追求,你需要對(duì)如何創(chuàng)建設(shè)計(jì)良好但并不完美的軟件有一些概念,他還給出了一些這些年使用DDD的示例。
最早的DDD圖書的作者Evans指出,限界上下文的最初目的是讓我們認(rèn)識(shí)到我們開發(fā)軟件的開發(fā)環(huán)境相當(dāng)復(fù)雜,它涉及許多遺留系統(tǒng)和其他的外部系統(tǒng),以及可能帶來(lái)影響的其他團(tuán)隊(duì)。在圍繞軟件的一部分的上下文中,你擁有概念上的一致性,在此特定的詞總是意味著相同的事情。作為開發(fā)人員,你應(yīng)該能夠識(shí)別出你是否處于上下文的邊界內(nèi),然后需要遵循特定于該上下文的規(guī)則。邊界令你可以自由定義適用于那里的規(guī)則;不僅包括使用的術(shù)語(yǔ),還包括架構(gòu)和開發(fā)過程。Evans指出,微服務(wù)應(yīng)該是自治的,可以成為良好的限界上下文,但強(qiáng)調(diào)這一點(diǎn)并不意味著服務(wù)總是限界上下文,有時(shí)開發(fā)人員會(huì)把服務(wù)理解為限界上下文。
Evans認(rèn)為康威定律(Conway's law)和限界上下文的概念之間存在一定的關(guān)聯(lián),他想創(chuàng)立一些東西來(lái)應(yīng)用該定律。他舉了一個(gè)例子,在一個(gè)系統(tǒng)中有兩個(gè)上下文:一個(gè)負(fù)責(zé)信用卡,另一個(gè)負(fù)責(zé)現(xiàn)金帳戶。這里我們?cè)诮M織架構(gòu)、子域和限界上下文之間取得了協(xié)調(diào)一致。但是現(xiàn)在,為關(guān)注細(xì)分市場(chǎng)進(jìn)行業(yè)務(wù)重組,將商業(yè)帳戶與個(gè)人帳戶分離,并為每種帳戶創(chuàng)建了一個(gè)團(tuán)隊(duì)。兩個(gè)上下文保持不變(商業(yè)賬戶和個(gè)人賬戶都有信用卡和現(xiàn)金。譯者注),現(xiàn)在兩個(gè)團(tuán)隊(duì)都在這兩個(gè)上下文中開展工作,時(shí)而發(fā)生的沖突意味著他們要協(xié)調(diào)他們的工作。他將這比喻為三足賽跑,為了提高速度,協(xié)調(diào)是必要的。在這種情況下,可能的風(fēng)險(xiǎn)是產(chǎn)生一個(gè)雜亂無(wú)章、隨意堆砌的系統(tǒng)(Big ball of mud),Evans看到的一個(gè)常見原因是對(duì)軟件開發(fā)缺乏清晰的管理。一個(gè)可能的解決方案是建立一個(gè)新的邊界,使用防崩潰層(Anti-corruption layer)。
有時(shí)一個(gè)模型并不完備,不足以處理所要處理的所有情況。不是要?jiǎng)?chuàng)建一個(gè)能夠處理更多情況卻感覺很笨拙的模型,而是可以選擇創(chuàng)建一個(gè)函數(shù)來(lái)處理模型未能處理的情況。這樣的函數(shù)和許多if-then-else語(yǔ)句一起工作,和任何高層概念保持距離以避免創(chuàng)建另外一個(gè)模型。不應(yīng)該使用不完備的或難以理解的抽象。Evans指出,最好使用if-then-else語(yǔ)句而不是錯(cuò)誤地認(rèn)為要?jiǎng)?chuàng)建一個(gè)優(yōu)雅的模型。創(chuàng)建這樣的模型可能最終連能工作的模型都找不到。他認(rèn)為追求一個(gè)好的但并不完美的設(shè)計(jì)是關(guān)于權(quán)衡的很好的例子。
Evans不建議非得等到模型完美了才去使用它,那樣的話我們將無(wú)法發(fā)布任何軟件。我們必須忘掉這樣的想法,即只要你在前期投入額外的時(shí)間去做設(shè)計(jì),從長(zhǎng)期來(lái)看就一定能得到回報(bào)。然而,我們不能走向另一個(gè)極端,只是堆砌一些可怕的東西并發(fā)布出去。如果我們?cè)谀P椭杏幸庾R(shí)地做一些權(quán)衡,并具備一定的技能,在對(duì)已有模型不滿意時(shí)知道該怎么做,將會(huì)得到更好的結(jié)果。
查看英文原文:Eric Evans: DDD is Not for Perfectionists