用例與架構(gòu)

需求描述了軟件系統(tǒng)是什么欢际,架構(gòu)則提供了系統(tǒng)的低成本實現(xiàn)方案,回答了軟件系統(tǒng)如何做的問題矾兜。架構(gòu)依賴需求损趋,需求驅(qū)動架構(gòu)。

目前椅寺,用例是大多數(shù)項目描述需求的方法浑槽,軟件分析設(shè)計活動(包括架構(gòu))的輸入就是用例需求規(guī)約或者其衍生品(用戶故事)。作為架構(gòu)或者開發(fā)人員返帕,我們需要懂得如何從這些規(guī)約和故事中獲取有用信息桐玻,驅(qū)動我們的分析設(shè)計。

這里根據(jù)自己的學(xué)習(xí)理解荆萤,結(jié)合以往的實踐镊靴,總結(jié)了幾點如何從用例開始架構(gòu)設(shè)計的方法。

從用例開始推導(dǎo)系統(tǒng)結(jié)構(gòu)

系統(tǒng)結(jié)構(gòu)是指系統(tǒng)由哪些組件構(gòu)成链韭,這些組件的職責(zé)以及它們之間的關(guān)系偏竟。

系統(tǒng)結(jié)構(gòu)是我們通過架構(gòu)活動創(chuàng)造出來的,沒有一個簡單敞峭、直接踊谋、通用的套路得到結(jié)構(gòu)中的組件,但是用例可以啟發(fā)我們的探索旋讹。

用例是從用戶和涉眾角度對系統(tǒng)的描述殖蚕,它天然就是對系統(tǒng)的一種劃分:每個用例代表了系統(tǒng)的一部分需求轿衔,代表了涉眾/參與者使用系統(tǒng)的一類場景,從場景的層面看睦疫,用例之間沒有交集害驹。而在用例內(nèi)部,場景笼痛、業(yè)務(wù)規(guī)則等元素共同定義了一組強耦合的功能需求裙秋。

如果我們繼續(xù)把用例按照參與者進行分組,每個用例組對應(yīng)一個或若干個類似的參與者缨伊。由于參與者是業(yè)務(wù)領(lǐng)域中的由人或者其它系統(tǒng)扮演的角色摘刑,相似的角色意味著它們提出的功能被組織在一起可能是合理的。

每個用例組我們引入一個組件(可能是子系統(tǒng)刻坊、也可能是模塊)枷恕,它們實現(xiàn)了用例組包含的用例,這些組件構(gòu)成了系統(tǒng)谭胚。這個時候得到的系統(tǒng)結(jié)構(gòu)實際上就是所謂的“功能架構(gòu)”徐块,經(jīng)常出現(xiàn)在系統(tǒng)的售前和宣傳文檔中。但是我們要認識到灾而,由于“功能架構(gòu)”沒有考慮重用和非功能屬性胡控,它不是最終的,可以用于指導(dǎo)開發(fā)架構(gòu)旁趟。

但是從用例組得到的“功能架構(gòu)”在系統(tǒng)劃分上有一定的合理性昼激,我們把它作為架構(gòu)設(shè)計的出發(fā)點,逐步演進锡搜。比如:我們選擇一個功能組件(某個子系統(tǒng)或者模塊)橙困,從對應(yīng)的用例組中找到若干個用例,分析它們的功能需求和非功能需求耕餐,引入新的組件實現(xiàn)公共的功能需求凡傅;引入新的組件或者精化已有組件實現(xiàn)非功能需求。

從用例推導(dǎo)領(lǐng)域模型

我之前參加過UMLChina潘加宇的“軟件方法”培訓(xùn)肠缔,里面介紹了由用例建模的方法夏跷。這里簡單介紹下。

我們要明確這里的領(lǐng)域模型只描述領(lǐng)域概念桩砰,不考慮具體的技術(shù)要素(比如:并發(fā)拓春、事務(wù)等)。

從用例可以推導(dǎo)出邊界類亚隅、控制類和多個實體類硼莽,它們之間的關(guān)系如下:


用例領(lǐng)域建模相關(guān)類.png

這些類之間的協(xié)作如下:


用例領(lǐng)域建模類協(xié)作.png

為用例定義控制類

一個用例最多一個控制類,一個控制類只關(guān)聯(lián)一個用例,負責(zé)接收所在用例對應(yīng)的業(yè)務(wù)事件懂鸵,協(xié)調(diào)內(nèi)部的處理偏螺。是業(yè)務(wù)用例的調(diào)用入口。

這個控制類不是必須的匆光,如果發(fā)現(xiàn)不需要協(xié)調(diào)套像,所有邏輯可以由實體類完成,可以不需要這個控制類终息。

從業(yè)務(wù)實體夺巩、業(yè)務(wù)處理功能和業(yè)務(wù)約束條件推導(dǎo)實體類

用例和實體類之間是多對多的關(guān)系。從用例中獲得實體類的方法這里不展開了周崭,直接由業(yè)務(wù)實體映射可以作為一個起點柳譬。但是要得到高質(zhì)量的領(lǐng)域模型,還需要在這個基礎(chǔ)上進行抽象和挖掘续镇,這個過程我總結(jié)不出美澳,不過這里給大家推薦幾本書:

  • 軟件方法(下)(潘加宇)
  • 彩色UML建模(Perter Coad)
  • Domain driven design(Eric Evans)

另外,還可以參考一下別人在分析和概念層面總結(jié)的領(lǐng)域設(shè)計模式摸航。

為參與者定義邊界類

邊界類對應(yīng)用例的參與者制跟。

從我自己的體會來看,有必要為每一個輔助參與者(Supporting Actor)建立一個邊界類酱虎,這個邊界類的職責(zé)是和系統(tǒng)依賴的外部系統(tǒng)通信雨膨,比如:發(fā)送通知、調(diào)用某個功能等读串。

對于主動參與者哥放,只有這個參與者是由時間系統(tǒng)承擔(dān)的角色時,為這個角色建立一個邊界類才是有價值的爹土。

從用例推導(dǎo)設(shè)計

當我們用具體的語言/框架去實現(xiàn)之前推導(dǎo)出的領(lǐng)域模型時,必須考慮具體的技術(shù)問題踩身,包括:并發(fā)胀茵、事務(wù)、性能等挟阻,實際上這些就是用例的質(zhì)量屬性琼娘。

如何實現(xiàn)這些非功能需求呢?肯定有很多方法附鸽。我個人比較傾向于通過增加一些新的類/組件脱拼,在不修改之前的的領(lǐng)域?qū)嶓w類的前提下實現(xiàn)。實際上在目前的領(lǐng)域驅(qū)動設(shè)計的相關(guān)書籍里坷备,有很大一部分就是介紹如何在技術(shù)層面實現(xiàn)領(lǐng)域模型熄浓,幫助領(lǐng)域模型落地。

比如:我們要實現(xiàn)數(shù)據(jù)庫的訪問省撑,不是在領(lǐng)域?qū)嶓w類增加類似查詢赌蔑、保存的方法俯在,而是增加一個形如:xxxRepository的類。

再比如:某個功能需要可伸縮娃惯,這個時候可以在架構(gòu)層面引入新的組件負責(zé)該功能跷乐,組件支持多實例部署,組件內(nèi)部仍然使用原有的相關(guān)領(lǐng)域模型趾浅。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末愕提,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子皿哨,更是在濱河造成了極大的恐慌浅侨,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件往史,死亡現(xiàn)場離奇詭異仗颈,居然都是意外死亡,警方通過查閱死者的電腦和手機椎例,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門挨决,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人订歪,你說我怎么就攤上這事脖祈。” “怎么了刷晋?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵盖高,是天一觀的道長。 經(jīng)常有香客問我眼虱,道長喻奥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任捏悬,我火速辦了婚禮撞蚕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘过牙。我一直安慰自己甥厦,他們只是感情好,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布寇钉。 她就那樣靜靜地躺著刀疙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扫倡。 梳的紋絲不亂的頭發(fā)上谦秧,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音,去河邊找鬼油够。 笑死蚁袭,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的石咬。 我是一名探鬼主播揩悄,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鬼悠!你這毒婦竟也來了删性?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤焕窝,失蹤者是張志新(化名)和其女友劉穎蹬挺,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體它掂,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡巴帮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了虐秋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榕茧。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖客给,靈堂內(nèi)的尸體忽然破棺而出用押,到底是詐尸還是另有隱情,我是刑警寧澤靶剑,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布蜻拨,位于F島的核電站,受9級特大地震影響桩引,放射性物質(zhì)發(fā)生泄漏缎讼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一坑匠、第九天 我趴在偏房一處隱蔽的房頂上張望休涤。 院中可真熱鬧,春花似錦笛辟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至忱详,卻和暖如春围来,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工监透, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留桶错,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓胀蛮,卻偏偏與公主長得像院刁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子粪狼,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

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