1. 背景
軟件復(fù)雜性這一問(wèn)題谤职,幾乎是“軟件危機(jī)”的同義詞饰豺。上世紀(jì)60年代因?yàn)橛?jì)算機(jī)硬件的發(fā)展,使開(kāi)發(fā)功能更強(qiáng)大的軟件成為可能允蜈,軟件的規(guī)模越來(lái)越大冤吨,越來(lái)越復(fù)雜。因?yàn)殚_(kāi)發(fā)軟件的方法論饶套、技術(shù)手段較為落后锅很,軟件的開(kāi)發(fā)不甚順利,存在諸多問(wèn)題凤跑,當(dāng)時(shí)學(xué)術(shù)界定義了“軟件危機(jī)”一詞爆安,用以描述這一現(xiàn)象。隨后的幾十年間仔引,涌現(xiàn)了各種各樣的應(yīng)對(duì)軟件危機(jī)的方法扔仓,這些方法有的從軟件的生命周期角度優(yōu)化軟件的開(kāi)發(fā)過(guò)程,有的考慮如何設(shè)計(jì)良好的軟件的體系結(jié)構(gòu)咖耘,有的在編程實(shí)踐中探索編碼效率提升的技術(shù)翘簇。
從軟件的生命周期角度看,出現(xiàn)了瀑布模型儿倒、螺旋模型版保、快速原型模型、敏捷開(kāi)發(fā)夫否、極限編程等軟件開(kāi)發(fā)模型彻犁;從軟件體系結(jié)構(gòu)的角度看,出現(xiàn)了人們創(chuàng)造了各種風(fēng)格的軟件體系結(jié)構(gòu)模型凰慈、總結(jié)形成了各種軟件開(kāi)發(fā)汞幢、設(shè)計(jì)方法、并且軟件體系結(jié)構(gòu)文檔化也得到了極大的發(fā)展微谓。軟件體系結(jié)構(gòu)模型有分層模型森篷、管道模型、客戶端/服務(wù)器模型豺型、總線模型等仲智;軟件開(kāi)發(fā)、設(shè)計(jì)方法有基于架構(gòu)的軟件開(kāi)發(fā)姻氨、基于構(gòu)件的軟件開(kāi)發(fā)钓辆、服務(wù)導(dǎo)向架構(gòu)、特定領(lǐng)域系統(tǒng)架構(gòu)等;從編程實(shí)踐角度看岩馍,各種高級(jí)語(yǔ)言和面向?qū)ο缶幊痰锱亍⒚嫦蚯衅幊獭⒃O(shè)計(jì)模式等編程技術(shù)也先后被發(fā)明蛀恩。
軟件生命周期管理疫铜、軟件體系結(jié)構(gòu)和文檔化、程序語(yǔ)言與編程技術(shù)這三方面技術(shù)發(fā)展的同時(shí)双谆,軟件工程專(zhuān)業(yè)也逐漸發(fā)展成體系壳咕。
2. 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)定義
領(lǐng)域是指一定的范圍,在這個(gè)范圍內(nèi)領(lǐng)域內(nèi)顽馋,有特定的用戶谓厘,從事特定的工作,產(chǎn)生特定的價(jià)值寸谜。在用戶層面竟稳,體現(xiàn)為軟件所服務(wù)的特定用戶,在功能層面熊痴,體現(xiàn)為軟件為特定用戶所解決特定的業(yè)務(wù)需求他爸。我們可以通過(guò)親自從事該領(lǐng)域的工作,或者從該領(lǐng)域的從業(yè)者身上取經(jīng)獲取領(lǐng)域知識(shí)果善。
工程開(kāi)工前通常需要對(duì)所要建造的物品進(jìn)行分析诊笤、描繪,得到一份指導(dǎo)施工的文件巾陕,得到這份文件的過(guò)程就是設(shè)計(jì)讨跟,軟件工程也是一樣。在軟件定義階段鄙煤,涉及產(chǎn)品的設(shè)計(jì)晾匠,在軟件開(kāi)發(fā)階段,涉及技術(shù)方案的設(shè)計(jì)馆类。
eric evans于2003年出版了《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)——軟件核心復(fù)雜性應(yīng)對(duì)之道》一書(shū)混聊,提出了領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)這個(gè)方法弹谁,用來(lái)處理軟件的復(fù)雜性問(wèn)題乾巧。正如書(shū)名所提,能夠有效地處理軟件的復(fù)雜性是其特點(diǎn)预愤,此外沟于,領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)本身是一套軟件開(kāi)發(fā)設(shè)計(jì)方法,其中體現(xiàn)了與其他軟件工程方法相同的原則:充分了解需求分析植康、設(shè)計(jì)高內(nèi)聚旷太、低耦合、優(yōu)美的軟件結(jié)構(gòu)。運(yùn)用領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)供璧,能夠在項(xiàng)目中很好地落地這些原則存崖。
并且在落地上述原則的過(guò)程中,領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)創(chuàng)造了其獨(dú)特的概念體系睡毒,這套概念體系包括以下要素:戰(zhàn)略建模来惧、戰(zhàn)術(shù)建模、問(wèn)題空間演顾、解決方案空間供搀、核心域、支撐域钠至、通用域葛虐、領(lǐng)域、子域棉钧、界限上下文屿脐、通用語(yǔ)言、上下文映射圖宪卿、領(lǐng)域?qū)嶓w摄悯、聚合根、領(lǐng)域服務(wù)愧捕、領(lǐng)域事件奢驯、倉(cāng)庫(kù)、工廠次绘、規(guī)格瘪阁、值對(duì)象等。
3. 軟件復(fù)雜性
軟件的復(fù)雜性取決于業(yè)務(wù)的復(fù)雜性邮偎,業(yè)務(wù)越復(fù)雜管跺,支撐業(yè)務(wù)的軟件產(chǎn)品的復(fù)雜性越大。軟件的復(fù)雜性主要體現(xiàn)在模塊數(shù)量禾进、模塊之間的依賴兩方面豁跑。軟件的復(fù)雜性越高,則軟件系統(tǒng)的模塊數(shù)量越多泻云,相互的依賴越復(fù)雜艇拍。
3.1 軟件設(shè)計(jì)的復(fù)雜性與軟件代碼的復(fù)雜性
編碼活動(dòng),將軟件設(shè)計(jì)轉(zhuǎn)化為軟件程序宠纯,在此過(guò)程中卸夕,設(shè)計(jì)復(fù)雜性轉(zhuǎn)變?yōu)榇a復(fù)雜性。狹義上的軟件設(shè)計(jì)雖然能夠指導(dǎo)軟件開(kāi)發(fā)婆瓜,但是由于設(shè)計(jì)無(wú)法100%的完備快集,明確定義軟件系統(tǒng)的每一行代碼如何實(shí)現(xiàn)贡羔,只有軟件系統(tǒng)的代碼本身能夠絕對(duì)準(zhǔn)確地體現(xiàn)自己的設(shè)計(jì)。狹義的設(shè)計(jì)與軟件系統(tǒng)本身體現(xiàn)的設(shè)計(jì)之間的差異个初,在極具創(chuàng)造性的編碼活動(dòng)中被消除乖寒,編碼完成,則軟件系統(tǒng)本身體現(xiàn)的設(shè)計(jì)才完成院溺,我們把軟件系統(tǒng)本身體現(xiàn)的設(shè)計(jì)稱(chēng)為廣義的設(shè)計(jì)宵统。
3.2 軟件復(fù)雜性與軟件缺陷
隨著軟件復(fù)雜性的增加,軟件的缺陷數(shù)量也會(huì)隨之增長(zhǎng)覆获,因此軟件的復(fù)雜性控制非常重要马澈,使用恰當(dāng)?shù)能浖?fù)雜性控制手段,控制支撐復(fù)雜業(yè)務(wù)的軟件系統(tǒng)的復(fù)雜性弄息,能夠有效地減少軟件缺陷的數(shù)量痊班。
3.3 軟件復(fù)雜性與易維護(hù)性
簡(jiǎn)單的軟件比復(fù)雜的軟件易維護(hù),因此摹量,控制軟件的復(fù)雜性涤伐,可以保證軟件的易維護(hù)性,包括代碼更容易閱讀和理解缨称,更容易修改擴(kuò)展凝果。
4. 軟件復(fù)雜性管理
復(fù)雜性管理工作的目標(biāo)是,通過(guò)一定的方法確定軟件系統(tǒng)的層級(jí)模塊睦尽,并且明確模塊間的依賴關(guān)系器净。需要注意的是,模塊的數(shù)量多少與否当凡,依賴關(guān)系數(shù)量的多少山害,雖然可以用于參考衡量軟件的復(fù)雜性,但僅僅是參考沿量,最重要的是模塊與模塊之間的關(guān)系形成一定的風(fēng)格浪慌,具有美感,使之易于理解朴则、易于管理权纤。
管理復(fù)雜性,可以分為代碼復(fù)雜性管理和設(shè)計(jì)復(fù)雜性管理乌妒。在廣義上看汹想,管理設(shè)計(jì)的復(fù)雜性,就是管理代碼的復(fù)雜性芥被。在狹義上看欧宜,設(shè)計(jì)復(fù)雜性得到管理和控制,不一定說(shuō)明代碼復(fù)雜性得到管理和控制拴魄。我們最終希望看到的是一行一行代碼構(gòu)成的軟件系統(tǒng)的代碼復(fù)雜性得到控制,復(fù)雜性的控制絕不僅僅停留在設(shè)計(jì)圖紙上。無(wú)論設(shè)計(jì)圖紙多么清晰簡(jiǎn)潔明了匹中,若是編碼走樣夏漱,軟件的復(fù)雜性依然的得不到良好的控制。
5. 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)與軟件復(fù)雜性管理
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)強(qiáng)調(diào)編碼與設(shè)計(jì)的一致性顶捷。在編碼向設(shè)計(jì)的映射過(guò)程挂绰,不至于引入過(guò)多的額外的復(fù)雜性。
對(duì)領(lǐng)域知識(shí)的獲取以及對(duì)領(lǐng)域模型的精心維護(hù)是編碼與設(shè)計(jì)的一致性得意保證的前提條件葵蒂,若是領(lǐng)域知識(shí)獲取不足践付,模型抽象錯(cuò)誤、與現(xiàn)實(shí)差距過(guò)大,若是再加上缺少良好的架構(gòu)保障饲宛,那么編碼途中、以及將來(lái)對(duì)軟件進(jìn)行擴(kuò)展時(shí),極有可能會(huì)困難重重媒鼓。
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)強(qiáng)調(diào)領(lǐng)域知識(shí)的獲取暂氯。軟件設(shè)計(jì)師擎厢、軟件開(kāi)發(fā)人員與領(lǐng)域?qū)<医涣鞣姨剑@取領(lǐng)域知識(shí),基于領(lǐng)域知識(shí)進(jìn)行軟件的設(shè)計(jì)與開(kāi)發(fā)。了解領(lǐng)域,首先需要了解領(lǐng)域的構(gòu)成亿遂,了解領(lǐng)域內(nèi)絕對(duì)的是越、明確浦徊、清晰的術(shù)語(yǔ)呢岗,這是最基礎(chǔ)、最重要的构眯,領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中把這套術(shù)稱(chēng)作“通用語(yǔ)言”,強(qiáng)調(diào)使用“通用語(yǔ)言”進(jìn)行交流翘悉,促進(jìn)需求分析。
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)強(qiáng)調(diào)領(lǐng)域模型的維護(hù)。在設(shè)計(jì)階段盡可能地構(gòu)造所能構(gòu)造的最優(yōu)的模型误褪,并且在迭代過(guò)程中不斷打磨精化,體現(xiàn)對(duì)需求分析不輕易滿足帜羊、不輕易止步、不膚淺的窥淆、勢(shì)必全面而深入地了解的需求卖宠。
6. 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的實(shí)施
實(shí)現(xiàn)任何一項(xiàng)系統(tǒng)的非功能性需求,大體可以通過(guò)以下幾個(gè)通用的方面開(kāi)展工作:建模忧饭、度量扛伍、評(píng)估、設(shè)計(jì)和管理词裤。領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)注重設(shè)計(jì)與管理刺洒,它通過(guò)定義在需求分析階段鳖宾、軟件設(shè)計(jì)階段、軟件編碼階段所需要實(shí)施的活動(dòng)與要點(diǎn)實(shí)現(xiàn)設(shè)計(jì)與管理逆航。
6.1 實(shí)施步驟
6.1.1 領(lǐng)域分析
在需求分析階段鼎文,通過(guò)討論,梳理概念因俐,逐步明確一個(gè)又一個(gè)的概念拇惋,逐漸將由發(fā)散性的、靈活的抹剩、充滿模糊內(nèi)涵的詞匯構(gòu)成的溝通語(yǔ)言撑帖,轉(zhuǎn)變?yōu)槭諗康摹⒐潭ǖ陌木臁⒚鞔_的“通用語(yǔ)言”胡嘿。使用這套統(tǒng)通用的語(yǔ)言,描述一個(gè)系統(tǒng)的方方面面钳踊,高層的衷敌、細(xì)化的。
6.1.2 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)風(fēng)格的技術(shù)方案設(shè)計(jì)
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)風(fēng)格在架構(gòu)上拓瞪,表現(xiàn)為分層架構(gòu)缴罗,自底向上依次是:基礎(chǔ)設(shè)施層、領(lǐng)域?qū)游庠濉?yīng)用層瞒爬、視圖層」当ぃ基礎(chǔ)設(shè)施層定義系統(tǒng)依賴的各類(lèi)基礎(chǔ)設(shè)施侧但;領(lǐng)域?qū)訉?shí)現(xiàn)領(lǐng)域分析所得出的領(lǐng)域模型,領(lǐng)域模型由領(lǐng)域?qū)嶓w航罗、領(lǐng)域聚合禀横、領(lǐng)域事件、領(lǐng)域服務(wù)粥血、領(lǐng)域規(guī)范柏锄、倉(cāng)庫(kù)等領(lǐng)域資源對(duì)象組合而成;應(yīng)用層依賴于領(lǐng)域?qū)痈纯鳎?fù)責(zé)編排業(yè)務(wù)邏輯趾娃,包含各種橫切邏輯;視圖層調(diào)用應(yīng)用層執(zhí)行業(yè)務(wù)邏輯缔御,并將執(zhí)行結(jié)果轉(zhuǎn)化為指定的格式呈現(xiàn)給用戶抬闷。
6.1.3 編碼
在編碼階段,希望軟件開(kāi)發(fā)人員忠于領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)風(fēng)格的技術(shù)方案進(jìn)行編碼活動(dòng),實(shí)現(xiàn)設(shè)計(jì)方案向代碼高度準(zhǔn)確的映射笤成。
6.2 實(shí)施效果
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)指導(dǎo)的軟件開(kāi)發(fā)過(guò)程评架,領(lǐng)域模型始終作為設(shè)計(jì)與編碼的核心,編碼遵照精心維護(hù)的領(lǐng)域模型開(kāi)展炕泳,忠誠(chéng)體現(xiàn)領(lǐng)域知識(shí)纵诞,精心維護(hù)的領(lǐng)域模型與現(xiàn)實(shí)高度一致,將使系統(tǒng)易于擴(kuò)展和維護(hù)培遵。通過(guò)分層架構(gòu)浙芙、以及領(lǐng)域?qū)觾?nèi)對(duì)領(lǐng)域資源對(duì)象的分類(lèi),形成一套嚴(yán)格的荤懂、有章法和美感的編碼風(fēng)格茁裙,模塊數(shù)量不一定少塘砸,但是劃分適宜节仿,依賴清晰,達(dá)到了控制軟件復(fù)雜度的效果掉蔬,同樣保證了軟件的易維護(hù)性廊宪。
6.3 主要的阻礙
如果想要比較好地實(shí)施領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),切實(shí)服務(wù)于軟件開(kāi)發(fā)過(guò)程女轿,提高軟件系統(tǒng)的開(kāi)發(fā)效率箭启、質(zhì)量,有賴于對(duì)其的深度理解蛉迹。
從系統(tǒng)論的角度來(lái)說(shuō)傅寡,如果我們希望深入、全面北救、完全地了解荐操、掌握領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),可以從其“通用語(yǔ)言”入手珍策,逐個(gè)了解其中諸如領(lǐng)域?qū)嶓w托启、聚合根、領(lǐng)域服務(wù)攘宙、倉(cāng)庫(kù)等概念屯耸,并且在實(shí)際項(xiàng)目中尋找合適的地方嘗試應(yīng)用,應(yīng)用以后發(fā)現(xiàn)需求分析確實(shí)更深入了蹭劈、設(shè)計(jì)疗绣、編碼的軟件體系結(jié)構(gòu)確實(shí)越來(lái)越有美感了,思考铺韧、編碼的過(guò)程越來(lái)越快樂(lè)了多矮,我們就走在正確的道路上,我們就正在逐漸掌握領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)祟蚀。
在各行各業(yè)工窍、大大小小的企業(yè)中割卖,囿于企業(yè)的規(guī)模、發(fā)展程度患雏、員工的經(jīng)驗(yàn)鹏溯,項(xiàng)目開(kāi)發(fā)團(tuán)隊(duì)在實(shí)施領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的過(guò)程中,不可避免地會(huì)遇到缺少領(lǐng)域?qū)<疫@一現(xiàn)實(shí)的問(wèn)題淹仑,我們不妨參考產(chǎn)品角色缺失這一問(wèn)題的處理策略處理缺少領(lǐng)域?qū)<疫@一問(wèn)題丙挽。可以從外部獲取資源匀借,為團(tuán)隊(duì)配備領(lǐng)域?qū)<已詹绻麤](méi)有條件,則踐行人人都是領(lǐng)域?qū)<业姆椒ㄏ爬撸蓞⑴c項(xiàng)目的各個(gè)角色凳怨,需求分析師、系統(tǒng)分析師是鬼、系統(tǒng)架構(gòu)師肤舞、開(kāi)發(fā)工程師等共同分擔(dān)這一角色的職責(zé),不妨把握以下核心原則:1均蜜、需求分析階段不輕易滿足李剖、不輕易止步、不膚淺的囤耳、勢(shì)必全面而深入地了解的需求篙顺;2、軟件設(shè)計(jì)階段盡可能地構(gòu)造所能構(gòu)造的最優(yōu)的模型充择,并且迭代過(guò)程中精化德玫、打磨;3聪铺、編碼階段忠于設(shè)計(jì)化焕。