軟件開(kāi)發(fā)中的維度思考

兩個(gè)維度

1.范圍維度

軟件開(kāi)發(fā)的主要目的是為其他行業(yè)的業(yè)務(wù)問(wèn)題提供技術(shù)解決方案邀摆,例如為航空公司的飛機(jī)實(shí)現(xiàn)自動(dòng)導(dǎo)航掘剪,為汽車(chē)公司的汽車(chē)生產(chǎn)進(jìn)行產(chǎn)銷平衡垦梆,等等。從范圍上看厚满,軟件開(kāi)發(fā)所覆蓋的范圍可以劃分為兩個(gè)領(lǐng)域:我們要開(kāi)發(fā)的軟件系統(tǒng)屬于解決方案域府瞄,而軟件系統(tǒng)來(lái)自于和最終服務(wù)于的業(yè)務(wù)領(lǐng)域(例如飛機(jī)導(dǎo)航、汽車(chē)生產(chǎn)等等)屬于問(wèn)題域碘箍。問(wèn)題域存在問(wèn)題遵馆,軟件系統(tǒng)為問(wèn)題域的問(wèn)題提供技術(shù)上的解決方案。

這就是我們看待軟件開(kāi)發(fā)的第一個(gè)維度:范圍維度丰榴。我們把軟件開(kāi)發(fā)的范圍劃分為問(wèn)題域和解決方案域货邓。處于問(wèn)題域中的時(shí)候,我們的任務(wù)是認(rèn)識(shí)世界四濒,即了解在沒(méi)有軟件系統(tǒng)存在的情況下换况,現(xiàn)實(shí)業(yè)務(wù)領(lǐng)域是如何運(yùn)作的;而處于解決方案域中的時(shí)候盗蟆,我們是在改造世界戈二,即通過(guò)設(shè)計(jì)和實(shí)現(xiàn)軟件系統(tǒng)幫助業(yè)務(wù)領(lǐng)域運(yùn)作得更好(更大、更快喳资、更賺錢(qián)觉吭、更省錢(qián)、更透明仆邓、更靈活……)鲜滩。

在軟件開(kāi)發(fā)的術(shù)語(yǔ)中,“業(yè)務(wù)”宏赘、“領(lǐng)域”是問(wèn)題域的同義詞,“系統(tǒng)”是解決方案域的同義詞(“系統(tǒng)”是“軟件系統(tǒng)”的簡(jiǎn)稱)黎侈。因此察署,“業(yè)務(wù)”分析師、”業(yè)務(wù)”規(guī)則峻汉、“業(yè)務(wù)”用例模型贴汪、“領(lǐng)域”模型脐往、“領(lǐng)域”專家聚焦于問(wèn)題域,而“系統(tǒng)”分析師扳埂、“系統(tǒng)”用例模型聚焦于解決方案域业簿。

2.內(nèi)/外維度

除了范圍維度之外,我們還可以從另外的維度看待軟件開(kāi)發(fā)阳懂,其中一個(gè)非常有用的維度是內(nèi)/外維度梅尤。從內(nèi)/外視角看,系統(tǒng)在我們面前可以劃分為外部視圖和內(nèi)部視圖岩调。外部視圖是系統(tǒng)的黑盒視圖巷燥,我們看不到它的內(nèi)部組成和運(yùn)作機(jī)制,只能夠看到它呈現(xiàn)給外界的功能号枕;而內(nèi)部視圖是系統(tǒng)的白盒視圖缰揪,揭示了系統(tǒng)的內(nèi)部組成和運(yùn)作機(jī)制。

四個(gè)象限

范圍維度和內(nèi)外維度兩者是正交的葱淳,你可以把它們看成兩條相互垂直相交的數(shù)軸——X軸和Y軸钝腺,它們把軟件開(kāi)發(fā)問(wèn)題空間分割為四個(gè)區(qū)域——用數(shù)學(xué)的術(shù)語(yǔ)表示就是四個(gè)象限。分別說(shuō)明如下:

問(wèn)題域的外部視圖——業(yè)務(wù)用例模型

這個(gè)象限從外部視角看待問(wèn)題域赞厕,分析探究業(yè)務(wù)系統(tǒng)實(shí)現(xiàn)了哪些功能艳狐,對(duì)它的用戶提供了哪些業(yè)務(wù)價(jià)值?每一項(xiàng)系統(tǒng)功能體現(xiàn)為一個(gè)業(yè)務(wù)用例坑傅。例如銀行儲(chǔ)蓄業(yè)務(wù)為儲(chǔ)戶提供存款僵驰、取款、轉(zhuǎn)賬和提供對(duì)賬單等等服務(wù)唁毒,每一項(xiàng)服務(wù)就是一個(gè)業(yè)務(wù)用例蒜茴。

開(kāi)發(fā)業(yè)務(wù)用例模型不是軟件開(kāi)發(fā)的必須步驟,但本人強(qiáng)烈建議不要忽略這一方面的工作浆西。一方面粉私,開(kāi)發(fā)軟件系統(tǒng)的目標(biāo)就是實(shí)現(xiàn)和改進(jìn)這些業(yè)務(wù)用例(或業(yè)務(wù)用例中的某些環(huán)節(jié)),業(yè)務(wù)用例為軟件開(kāi)發(fā)設(shè)定了目標(biāo)和驗(yàn)收標(biāo)準(zhǔn)近零;另一方面诺核,通過(guò)業(yè)務(wù)用例分析可以更有效地支持領(lǐng)域建模和系統(tǒng)用例建模,有助于發(fā)現(xiàn)領(lǐng)域?qū)ο蠛蜋C(jī)制久信,防止系統(tǒng)用例遺漏或疏失窖杀。

問(wèn)題域的內(nèi)部視圖——領(lǐng)域模型

這個(gè)象限從內(nèi)部視角看待問(wèn)題域,研究業(yè)務(wù)領(lǐng)域中固有的組成裙士、結(jié)構(gòu)入客、行為、機(jī)制和規(guī)則等等。這方面的工作稱為“領(lǐng)域建淖懒颍”夭咬,其產(chǎn)物稱為“領(lǐng)域模型”。我們要重點(diǎn)分析研究的是:業(yè)務(wù)領(lǐng)域中有哪些關(guān)鍵的概念實(shí)體(例如銀行儲(chǔ)蓄業(yè)務(wù)中的賬戶铆隘、對(duì)賬單卓舵、信用卡、借記卡等等)膀钠、各種概念實(shí)體之間的關(guān)系(關(guān)聯(lián)掏湾、泛化、組合托修、聚合等等)忘巧,以及它們之間如何交互以實(shí)現(xiàn)業(yè)務(wù)用例模型中規(guī)定的各項(xiàng)功能等等。

領(lǐng)域建模是軟件開(kāi)發(fā)中最核心的活動(dòng)睦刃,領(lǐng)域模型是軟件開(kāi)發(fā)中最有價(jià)值的工件砚嘴。領(lǐng)域建模的質(zhì)量在很大程度上決定了軟件的成敗。如果由于對(duì)問(wèn)題域分析理解的偏差涩拙,產(chǎn)出錯(cuò)誤的領(lǐng)域模型际长,那么,無(wú)論多么先進(jìn)的技術(shù)工具兴泥、多么高超的技術(shù)手段工育,都無(wú)法挽救軟件的失敗命運(yùn)。

解決方案域的外部視圖——系統(tǒng)用例模型

這個(gè)象限從外部視角看待要構(gòu)建的軟件系統(tǒng)搓彻,定義了系統(tǒng)所要實(shí)現(xiàn)的所有業(yè)務(wù)功能如绸,即軟件系統(tǒng)能夠向它的用戶提供的業(yè)務(wù)價(jià)值。這方面的工作稱為需求分析(通常只包含功能需求)旭贬,其產(chǎn)物稱為“系統(tǒng)用例模型”怔接,簡(jiǎn)稱為“用例模型”(另一個(gè)名字是“功能規(guī)格說(shuō)明書(shū)”),每一個(gè)系統(tǒng)用例描述一項(xiàng)對(duì)用戶有價(jià)值的系統(tǒng)功能稀轨。

系統(tǒng)用例模型定義了軟件系統(tǒng)的功能外觀扼脐,即軟件系統(tǒng)能夠“干什么”的方面。系統(tǒng)用例模型溝通了兩個(gè)領(lǐng)域奋刽,它定義了要開(kāi)發(fā)的軟件系統(tǒng)(解決方案域)必須實(shí)現(xiàn)的業(yè)務(wù)功能(問(wèn)題域)瓦侮。

解決方案域的內(nèi)部視圖——設(shè)計(jì)模型

這個(gè)象限從內(nèi)部視角看待要構(gòu)建的軟件系統(tǒng),即通過(guò)哪些技術(shù)組件和怎樣的交互手段實(shí)現(xiàn)系統(tǒng)用例模型中定義的業(yè)務(wù)功能佣谐?

領(lǐng)域模型中的對(duì)象代表問(wèn)題域中的概念(如信用卡肚吏、賬戶等等),而設(shè)計(jì)模型中的對(duì)象代表軟件實(shí)體(如記錄集狭魂、DAO等等)罚攀。正如同業(yè)務(wù)用例模型會(huì)映射到系統(tǒng)用例模型一樣(通常一個(gè)系統(tǒng)用例實(shí)現(xiàn)一個(gè)業(yè)務(wù)用例吁断,或者業(yè)務(wù)用例中的一個(gè)步驟),領(lǐng)域模型中的對(duì)象也可以而且應(yīng)該映射到設(shè)計(jì)模型中的相應(yīng)軟件對(duì)象之上坞生,這意味著設(shè)計(jì)模型中也應(yīng)該有信用卡、賬戶這樣的對(duì)象掷伙,它們和領(lǐng)域模型中的同名對(duì)象一樣是己,擁有相同或類似的屬性和行為,這就是《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》一書(shū)的主張——使用同一種語(yǔ)言(業(yè)務(wù)語(yǔ)言)和基于同一個(gè)模型(領(lǐng)域模型)進(jìn)行分析和設(shè)計(jì)任柜,開(kāi)發(fā)軟件應(yīng)用卒废。

關(guān)系

解決方案域以問(wèn)題域?yàn)槌霭l(fā)點(diǎn)和依歸,即問(wèn)題決定解決方案(這是理所當(dāng)然的宙地,不是嗎摔认?如果我想求解3乘2這個(gè)問(wèn)題,你卻提供3加2這個(gè)解決方案宅粥,當(dāng)然是錯(cuò)誤的)参袱。開(kāi)發(fā)人員的一個(gè)典型的錯(cuò)誤是把關(guān)注點(diǎn)集中在解決方案域的實(shí)現(xiàn)技術(shù)上,卻忽視了問(wèn)題分析和問(wèn)題定義秽梅,因此在實(shí)現(xiàn)過(guò)程中失焦抹蚀,刻鵠成鶩,畫(huà)虎類犬企垦。

內(nèi)部視圖“動(dòng)于內(nèi)”环壤,外部視圖“形諸外”。系統(tǒng)的外部視圖定義了外部可見(jiàn)的行為钞诡,而內(nèi)部視圖揭示了系統(tǒng)內(nèi)部的組織結(jié)構(gòu)和運(yùn)行機(jī)制郑现,系統(tǒng)通過(guò)內(nèi)部視圖中的結(jié)構(gòu)和機(jī)制實(shí)現(xiàn)外部視圖中向外界呈現(xiàn)的行為。外部視圖表達(dá)What荧降,即“做什么”接箫,內(nèi)部視圖表達(dá)How,即“怎么做”誊抛。

設(shè)計(jì)模型從兩方面獲得指導(dǎo):從系統(tǒng)用例模型中獲得“What”方面的指導(dǎo)列牺,確定需要實(shí)現(xiàn)哪些功能;以及從領(lǐng)域模型中獲得“How”方面的指導(dǎo)拗窃,確定如何實(shí)現(xiàn)那些功能瞎领。在分層架構(gòu)中,用例模型和領(lǐng)域模型分別映射到系統(tǒng)的應(yīng)用層和領(lǐng)域?qū)铀婵洌辉贑lean架構(gòu)(Robert C. Martin九默,Clean架構(gòu))中,用例模型和領(lǐng)域模型分別映射到系統(tǒng)的用例層和實(shí)體層宾毒。

時(shí)刻記住你當(dāng)前所處的位置

在軟件開(kāi)發(fā)過(guò)程中驼修,請(qǐng)時(shí)刻記住你當(dāng)前處于哪一個(gè)象限。我們應(yīng)該嚴(yán)格劃分業(yè)務(wù)(問(wèn)題域)和技術(shù)(解決方案域),意圖(外部視角)和實(shí)現(xiàn)(內(nèi)部視角)乙各,要防止業(yè)務(wù)邏輯滲漏到技術(shù)組件中(例如在表示層或持久層中維護(hù)取款業(yè)務(wù)規(guī)則)墨礁,也要防止技術(shù)邏輯滲漏到業(yè)務(wù)邏輯中(例如領(lǐng)域?qū)哟a依賴Spring或Hibernate,或使用RabbitMQ進(jìn)行消息通信)耳峦,還要防止在只應(yīng)該表示意圖的地方直接提供實(shí)現(xiàn)方案(例如在應(yīng)用層中實(shí)現(xiàn)業(yè)務(wù)邏輯)恩静。

當(dāng)處于問(wèn)題域中的時(shí)候,我們是在“發(fā)現(xiàn)”蹲坷;當(dāng)處于解決方案域的時(shí)候驶乾,我們是在“發(fā)明”。當(dāng)處于外部視圖中的時(shí)候循签,我們是在表達(dá)意圖和行為级乐;當(dāng)處于內(nèi)部視圖中的時(shí)候,我們是在表達(dá)實(shí)現(xiàn)和機(jī)制县匠。具體來(lái)說(shuō):

  • 在業(yè)務(wù)用例模型中风科,我們發(fā)現(xiàn)業(yè)務(wù)意圖和業(yè)務(wù)行為;
  • 在領(lǐng)域模型中乞旦,我們發(fā)現(xiàn)業(yè)務(wù)實(shí)體和業(yè)務(wù)實(shí)現(xiàn)機(jī)制丐重;
  • 在系統(tǒng)用例模型中,我們定義待開(kāi)發(fā)的軟件系統(tǒng)要實(shí)現(xiàn)的行為和功能杆查;
  • 在設(shè)計(jì)模型中扮惦,我們定義待開(kāi)發(fā)的軟件系統(tǒng)的內(nèi)部結(jié)構(gòu)和行為實(shí)現(xiàn)機(jī)制。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末亲桦,一起剝皮案震驚了整個(gè)濱河市崖蜜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌客峭,老刑警劉巖豫领,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異舔琅,居然都是意外死亡等恐,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)备蚓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)课蔬,“玉大人,你說(shuō)我怎么就攤上這事郊尝《希” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵流昏,是天一觀的道長(zhǎng)扎即。 經(jīng)常有香客問(wèn)我吞获,道長(zhǎng),這世上最難降的妖魔是什么谚鄙? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任各拷,我火速辦了婚禮,結(jié)果婚禮上闷营,老公的妹妹穿的比我還像新娘撤逢。我一直安慰自己,他們只是感情好粮坞,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著初狰,像睡著了一般莫杈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奢入,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天筝闹,我揣著相機(jī)與錄音,去河邊找鬼腥光。 笑死关顷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的武福。 我是一名探鬼主播议双,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼捉片!你這毒婦竟也來(lái)了平痰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤伍纫,失蹤者是張志新(化名)和其女友劉穎宗雇,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體莹规,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赔蒲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了良漱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舞虱。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖母市,靈堂內(nèi)的尸體忽然破棺而出砾嫉,到底是詐尸還是另有隱情,我是刑警寧澤窒篱,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布焕刮,位于F島的核電站舶沿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏配并。R本人自食惡果不足惜括荡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望溉旋。 院中可真熱鬧畸冲,春花似錦、人聲如沸观腊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)梧油。三九已至苫耸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間儡陨,已是汗流浹背褪子。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留骗村,地道東北人嫌褪。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像胚股,于是被迫代替她去往敵國(guó)和親笼痛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容