計(jì)停車場(chǎng)管理系統(tǒng)分析與設(shè)計(jì):從用例到部署的完整建模指南)
簡(jiǎn)介這份UML課程設(shè)計(jì)停車場(chǎng)管理系統(tǒng)軟件系統(tǒng)分析與設(shè)計(jì)文檔以停車場(chǎng)管理系統(tǒng)為載體完整呈現(xiàn)從需求分析到軟件建模的課程設(shè)計(jì)全過(guò)程適合軟件工程專業(yè)學(xué)生、UML建模學(xué)習(xí)者以及課程設(shè)計(jì)備賽者參考借鑒。文檔系統(tǒng)梳理了系統(tǒng)的功能性需求與非功能性需求并配有需求分析規(guī)格說(shuō)明書、系統(tǒng)用例圖以及靜態(tài)模型中的分析包、分析類圖和分析對(duì)象圖同時(shí)覆蓋順序圖、協(xié)作圖、狀態(tài)圖、活動(dòng)圖等動(dòng)態(tài)模型和數(shù)據(jù)庫(kù)設(shè)計(jì)章節(jié)可作為課程設(shè)計(jì)說(shuō)明書模板使用。文檔以doc格式封裝共1個(gè)文件壓縮包僅249KB輕量易用。目前已有3474人學(xué)習(xí)使用。通過(guò)該文檔讀者可以系統(tǒng)掌握UML建模在實(shí)際業(yè)務(wù)場(chǎng)景中的落地方法理解車位管理、停車記錄管理、費(fèi)用計(jì)算、報(bào)表生成等核心模塊的類圖與對(duì)象圖設(shè)計(jì)并借鑒從需求到設(shè)計(jì)各階段的文檔組織思路與細(xì)節(jié)處理方法從而更高效地完成同類課程設(shè)計(jì)任務(wù)。1. UML課程設(shè)計(jì)停車場(chǎng)管理系統(tǒng)分析與設(shè)計(jì)一份課程設(shè)計(jì)為什么值得按工程標(biāo)準(zhǔn)做如果你的課程設(shè)計(jì)題目是「UML課程設(shè)計(jì)停車場(chǎng)管理系統(tǒng)軟件系統(tǒng)分析與設(shè)計(jì)」先想清楚一個(gè)事實(shí)這不是讓你去寫一個(gè)能跑的商業(yè)停車場(chǎng)系統(tǒng)而是考察你能不能把一套模糊的業(yè)務(wù)需求通過(guò) UML 語(yǔ)言逐步翻譯成清晰、可驗(yàn)證、能指導(dǎo)后續(xù)開發(fā)的軟件系統(tǒng)分析與設(shè)計(jì)文檔。很多同學(xué)在這個(gè)題目上翻車不是代碼能力不行而是把大量時(shí)間花在畫漂亮的用例圖上最后交上去的模型經(jīng)不起一句追問(wèn)這個(gè)用例的邊界是什么這條消息的順序?yàn)槭裁催@樣排類之間的關(guān)聯(lián)基數(shù)你是怎么確定的這篇筆記我會(huì)按一個(gè)完整課程設(shè)計(jì)的推進(jìn)順序來(lái)拆先識(shí)別角色和用例邊界再做靜態(tài)結(jié)構(gòu)建模再做動(dòng)態(tài)行為建模最后落到包圖、部署圖和數(shù)據(jù)庫(kù)設(shè)計(jì)最后給你一份答辯前自查的避坑清單。全程以停車場(chǎng)管理系統(tǒng)為主線所有步驟、圖表規(guī)格和文檔組織方式你都可以直接照著復(fù)現(xiàn)。整篇文章讀完你應(yīng)該能回答三個(gè)問(wèn)題這套 UML 模型要畫哪些圖、每張圖畫到什么粒度算合格、模型之間的一致性如何檢查。下面進(jìn)入正題。我們先把最容易出錯(cuò)、也最容易被老師追問(wèn)的「用例驅(qū)動(dòng)」這一步講透。2. 用例驅(qū)動(dòng)先定角色和邊界再談畫圖UML 建模不是從類圖開始的是從用例開始的。停車場(chǎng)管理系統(tǒng)雖然業(yè)務(wù)看起來(lái)不復(fù)雜——車輛進(jìn)場(chǎng)、出場(chǎng)、繳費(fèi)、找車位——但一旦涉及多個(gè)角色、多個(gè)計(jì)費(fèi)規(guī)則、多種支付方式用例邊界稍微模糊一點(diǎn)后面的類圖和順序圖全部跟著亂。2.1 角色識(shí)別誰(shuí)在用停車場(chǎng)誰(shuí)在用系統(tǒng)做用例分析的第一步不是畫圖是找參與者。停車場(chǎng)管理系統(tǒng)最常見的誤區(qū)是把「車」當(dāng)成參與者正確的做法是問(wèn)一句誰(shuí)主動(dòng)觸發(fā)了系統(tǒng)的功能我一般用一個(gè)簡(jiǎn)單的排除法把需求描述里的名詞全部列出來(lái)然后問(wèn)三個(gè)問(wèn)題——它有沒(méi)有自己的目標(biāo)它是否主動(dòng)發(fā)起操作它是否需要與系統(tǒng)交互滿足其中任意一條才考慮作為參與者。按這個(gè)標(biāo)準(zhǔn)停車場(chǎng)管理系統(tǒng)的參與者通常有兩類外部參與者和外部系統(tǒng)。外部參與者包括車主駕車人、停車場(chǎng)管理員、系統(tǒng)管理員。車主觸發(fā)入場(chǎng)、出場(chǎng)、繳費(fèi)、預(yù)約等用例停車場(chǎng)管理員處理異常放行、設(shè)備故障、人工收費(fèi)系統(tǒng)管理員維護(hù)費(fèi)率、用戶權(quán)限、日志。外部系統(tǒng)則包括車牌識(shí)別設(shè)備、支付網(wǎng)關(guān)、短信/消息推送服務(wù)。注意車牌識(shí)別設(shè)備和支付網(wǎng)關(guān)是「外部系統(tǒng)」不是「參與者」畫用例圖時(shí)寫在系統(tǒng)邊界外用「系統(tǒng)」圖標(biāo)而不是「人形」圖標(biāo)表示這也是老師在評(píng)分時(shí)容易盯住的細(xì)節(jié)。另外還有一種情況預(yù)約場(chǎng)景里可能存在「車主」和「場(chǎng)內(nèi)車輛」的對(duì)應(yīng)關(guān)系同一個(gè)人類角色在訪客預(yù)約和按月租用車位兩個(gè)場(chǎng)景中權(quán)限不同這時(shí)要拆成兩個(gè)用例而不是一個(gè)用例下掛多個(gè)分支。識(shí)別完角色后下一步才是把每個(gè)角色能做的動(dòng)作整理成用例清單。工具上我建議在正式開始畫之前先用一個(gè)簡(jiǎn)單的表格把參與者、目標(biāo)、關(guān)鍵用例列出來(lái)相當(dāng)于給自己做一份領(lǐng)域詞匯表。這樣到畫圖的時(shí)候參與者的命名、用例的命名基本都不會(huì)飄。2.2 用例圖畫法主用例、包含關(guān)系和擴(kuò)展關(guān)系的落地標(biāo)準(zhǔn)用例圖本身很簡(jiǎn)單難的是用例命名和關(guān)系選擇。我見過(guò)太多人把「車輛入場(chǎng)管理」「車輛出場(chǎng)管理」「車位管理」「收費(fèi)管理」這種「管理」后綴當(dāng)成用例名。這里記住一個(gè)標(biāo)準(zhǔn)用例名必須是動(dòng)詞短語(yǔ)表達(dá)一個(gè)可觀察的、為用戶產(chǎn)生價(jià)值的動(dòng)作。比如「入場(chǎng)車輛識(shí)別」「計(jì)算停車費(fèi)用」「執(zhí)行出場(chǎng)繳費(fèi)」「預(yù)約車位」。帶上「管理」兩個(gè)字說(shuō)明你還沒(méi)想清楚這個(gè)用例到底是做什么的。主用例怎么找對(duì)停車場(chǎng)系統(tǒng)來(lái)說(shuō)核心價(jià)值鏈路是「入場(chǎng) — 找車位 — 出場(chǎng)繳費(fèi)」這三件事就是主用例。剩下的都是輔助用例異常放行、費(fèi)用申訴、費(fèi)率調(diào)整、報(bào)表統(tǒng)計(jì)。主用例之間的關(guān)系要特別注意「包含」和「擴(kuò)展」的區(qū)別。我見過(guò)大量同學(xué)把「微信支付」「支付寶支付」畫成支付用例的擴(kuò)展這是典型的理解偏差。包含關(guān)系include表示一個(gè)用例總是會(huì)調(diào)用另一個(gè)用例是必選的比如「出場(chǎng)繳費(fèi)」總是包含「計(jì)算停車費(fèi)用」箭頭從基礎(chǔ)用例指向被包含用例。擴(kuò)展關(guān)系extend表示某個(gè)條件滿足時(shí)才觸發(fā)的附加行為是可選分支比如「出場(chǎng)繳費(fèi)」在支付超時(shí)后擴(kuò)展「延長(zhǎng)繳費(fèi)時(shí)限」箭頭從擴(kuò)展用例指向基礎(chǔ)用例方向正好相反。在實(shí)際交付中用例圖還要做一次「橫向評(píng)審」每個(gè)參與者至少對(duì)應(yīng)一個(gè)用例每個(gè)用例至少要有一個(gè)參與者觸發(fā)出現(xiàn)沒(méi)有參與者的用例說(shuō)明它在當(dāng)前場(chǎng)景里不成立出現(xiàn)沒(méi)有用例的參與者說(shuō)明該參與者要么多余要么漏了功能。這一步做下來(lái)幾乎每一份課程設(shè)計(jì)都能發(fā)現(xiàn)至少兩個(gè)漏掉的場(chǎng)景最常見的就是管理員改費(fèi)率之后正在場(chǎng)內(nèi)停車的車輛費(fèi)率怎么算這個(gè)沒(méi)有用例覆蓋。2.3 用例規(guī)格說(shuō)明一個(gè)用例一張表讓圖替不了的責(zé)任落在文字上用例圖只是索引真正決定評(píng)分高低的是用例的文字描述。這部分我建議做成一張規(guī)整的規(guī)格說(shuō)明表每個(gè)核心用例一張放在附錄而不堆在正文里干擾主線閱讀。規(guī)格表至少要有六列用例編號(hào)、參與者、前置條件、基本事件流、備選事件流、后置條件。拿「出場(chǎng)繳費(fèi)」舉例。前置條件是車輛已停放在庫(kù)內(nèi)且車牌已被識(shí)別?;臼录饔镁幪?hào)步驟寫1. 系統(tǒng)通過(guò)車牌識(shí)別設(shè)備讀取車牌2. 系統(tǒng)查詢車輛入場(chǎng)記錄和當(dāng)前費(fèi)率3. 系統(tǒng)計(jì)算停車時(shí)長(zhǎng)與費(fèi)用4. 系統(tǒng)生成待支付訂單5. 車主完成支付6. 系統(tǒng)確認(rèn)到賬7. 系統(tǒng)抬桿放行。備選事件流要寫清楚什么情況下會(huì)走哪條分支車牌識(shí)別失敗走人工輸入費(fèi)用爭(zhēng)議走管理員介入支付超時(shí)走延長(zhǎng)繳費(fèi)或鎖定訂單。后置條件是訂單狀態(tài)變更為已支付車輛放行記錄已生成。這里有一個(gè)非常容易被老師抓住的漏洞基本事件流寫了步驟 3「計(jì)算停車時(shí)長(zhǎng)與費(fèi)用」卻沒(méi)有在備選事件流里寫「入場(chǎng)記錄缺失」的情況——比如抬桿故障導(dǎo)致車輛沒(méi)有入場(chǎng)記錄就進(jìn)庫(kù)了。遇到這種情況系統(tǒng)怎么處理不寫說(shuō)明你的流程思考不閉環(huán)。寫就需要在類圖里增加「人工補(bǔ)錄入場(chǎng)記錄」的類這一步也反哺了下一步的靜態(tài)建模。在文字組織上基本事件流建議控制 5 到 8 步多了說(shuō)明用例粒度太大拆開少了說(shuō)明寫得太粗補(bǔ)細(xì)節(jié)。備選事件流至少寫 3 條這是課程設(shè)計(jì)與工程交付最直觀的差距前者寫一條「異常退出」就算完事后者會(huì)把每一種真實(shí)業(yè)務(wù)分支都列出來(lái)。3. 靜態(tài)建模類圖與對(duì)象圖把結(jié)構(gòu)釘死用例確定行為邊界類圖確定結(jié)構(gòu)。停車場(chǎng)管理系統(tǒng)的類圖通常要求覆蓋核心業(yè)務(wù)對(duì)象加上它們之間的關(guān)系如果課程設(shè)計(jì)要求附帶數(shù)據(jù)庫(kù)設(shè)計(jì)類圖直接決定后續(xù)表結(jié)構(gòu)所以這一步值得花心思做細(xì)。3.1 從需求描述里找候選類三個(gè)實(shí)用的識(shí)別方法第一個(gè)方法叫名詞篩選法閱讀需求描述把名詞圈出來(lái)。車輛、車位、車主、收費(fèi)記錄、入場(chǎng)記錄、出場(chǎng)記錄、費(fèi)率、訂單、支付、優(yōu)惠券、管理員、設(shè)備、停車場(chǎng)、樓層、通道這聽起來(lái)很簡(jiǎn)單但要注意過(guò)濾掉「偶然名詞」和「屬性名詞」。舉個(gè)例子「車牌號(hào)」不應(yīng)該作為類它是車輛類的屬性「繳費(fèi)窗口」不應(yīng)該作為類它只是支付訂單的一個(gè)展示角度不是獨(dú)立概念。第二個(gè)方法叫邊界確認(rèn)法區(qū)分「值的對(duì)象」和「實(shí)體對(duì)象」。實(shí)體對(duì)象有唯一標(biāo)識(shí)比如車輛、車位、訂單、費(fèi)率它們跨會(huì)話存在要建類值的對(duì)象只是描述性數(shù)據(jù)比如金額、時(shí)間戳、時(shí)長(zhǎng)不應(yīng)該作為獨(dú)立類。按這個(gè)標(biāo)準(zhǔn)停車費(fèi)率是一個(gè)實(shí)體因?yàn)橐环葙M(fèi)率可能在多個(gè)訂單中復(fù)用支付金額不是實(shí)體它是訂單的屬性。這條規(guī)則能攔住大部分初學(xué)者常見的「什么都要建類」的沖動(dòng)。第三個(gè)方法叫場(chǎng)景反推法先給出系統(tǒng)邊界內(nèi)的核心業(yè)務(wù)事件再反推處理這些事件需要哪些數(shù)據(jù)。入場(chǎng)事件需要車牌和入場(chǎng)時(shí)間對(duì)應(yīng)入場(chǎng)記錄類費(fèi)用計(jì)算事件需要入場(chǎng)時(shí)間、出場(chǎng)時(shí)間和費(fèi)率對(duì)應(yīng)費(fèi)率類和訂單類預(yù)約事件需要車主信息和目標(biāo)車位對(duì)應(yīng)預(yù)約類。我用這個(gè)方法幫一個(gè)同學(xué)排查過(guò)他類圖里漏了「停車場(chǎng)」類的層級(jí)關(guān)系——車場(chǎng)有多個(gè)樓層樓層有多個(gè)車位這三個(gè)層級(jí)的歸屬關(guān)系不建出來(lái)后面部署圖和數(shù)據(jù)庫(kù)設(shè)計(jì)一定亂。3.2 類圖繪制與關(guān)系基數(shù)不要憑感覺(jué)寫 1 對(duì)多類圖畫出來(lái)后最重要的環(huán)節(jié)是關(guān)系關(guān)系的確定。常見的關(guān)系有四種關(guān)聯(lián)、聚合、組合、泛化。關(guān)聯(lián)表示兩個(gè)類之間有語(yǔ)義連接比如「車主」和「車輛」是關(guān)聯(lián)關(guān)系。聚合表示整體與部分但部分可以脫離整體存在比如「停車場(chǎng)」和「車位」是聚合關(guān)系——車位即使從停車場(chǎng)中移除它還是一個(gè)車位只是不在這個(gè)場(chǎng)里。組合表示整體與部分并且部分不能脫離整體存在比如「訂單」和「訂單明細(xì)」是組合關(guān)系——訂單明細(xì)離開訂單沒(méi)有意義。泛化就是繼承「普通費(fèi)率」和「時(shí)段費(fèi)率」都繼承「費(fèi)率」?;鶖?shù)要按業(yè)務(wù)規(guī)則推不要拍腦袋。一個(gè)車主可以有多輛車一輛車被一個(gè)車主使用所以「車主 1 — 車輛 *」。一個(gè)訂單只屬于一輛車一輛車可能產(chǎn)生多個(gè)訂單所以「車輛 1 — 訂單 *」。一個(gè)車位在同一時(shí)刻只能被一個(gè)訂單占用一個(gè)訂單可以占用多個(gè)車位——比如大車占兩個(gè)車位——這里是「車位 1 — 訂單 *」但如果你的系統(tǒng)明確只支持一車一位就寫「車位 1 — 訂單 1」。基數(shù)寫錯(cuò)比關(guān)系類型寫錯(cuò)更常見因?yàn)殛P(guān)系類型可以從語(yǔ)義判斷基數(shù)卻需要結(jié)合業(yè)務(wù)規(guī)則逐條核對(duì)。屬性與方法也不要隨意堆。每個(gè)類先寫標(biāo)識(shí)屬性如車輛類的車牌號(hào)、車位類的車位編號(hào)再寫業(yè)務(wù)屬性如訂單類的入場(chǎng)時(shí)間、出場(chǎng)時(shí)間、費(fèi)用金額方法只寫對(duì)外職責(zé)如訂單類提供 calculateFee 方法內(nèi)部的 getter/setter 通常不畫進(jìn)類圖否則類圖會(huì)膨脹成一堆沒(méi)意義的箱子。在方法命名上盡量用動(dòng)詞短語(yǔ)而非名詞和用例的命名習(xí)慣保持統(tǒng)一。3.3 對(duì)象圖反向校驗(yàn)用具體實(shí)例驗(yàn)證類設(shè)計(jì)對(duì)象圖容易被忽視但它是驗(yàn)證類設(shè)計(jì)正確性的有力工具。畫對(duì)象圖就是給類圖填具體數(shù)據(jù)看這個(gè)類結(jié)構(gòu)在真實(shí)場(chǎng)景下能不能跑通。比如你定義了「訂單」和「車位」兩個(gè)類關(guān)系是「訂單 * — 車位 1」?,F(xiàn)在做一個(gè)「一輛車連續(xù)停兩天」的對(duì)象圖實(shí)例車輛 A 在第一天生成訂單 1占用車位 B第二天續(xù)停生成訂單 2仍占用車位 B。對(duì)象圖里就出現(xiàn)兩個(gè)訂單對(duì)象同時(shí)連接到同一個(gè)車位對(duì)象。這時(shí)你就要考慮這兩個(gè)訂單是重疊時(shí)間段還是連續(xù)時(shí)間段如果系統(tǒng)不允許同一個(gè)車位被兩個(gè)訂單時(shí)間重疊占用類里就要加一個(gè)時(shí)間約束或者把「車位占用」提升為一個(gè)獨(dú)立的類記錄占用開始時(shí)間和結(jié)束時(shí)間。這就是對(duì)象圖的價(jià)值。我在實(shí)際做的時(shí)候會(huì)把核心業(yè)務(wù)場(chǎng)景做成三張對(duì)象圖正常入場(chǎng)出場(chǎng)、預(yù)約占位、月租車輛續(xù)費(fèi)。每張對(duì)象圖數(shù)據(jù)不同跑一遍下來(lái)類之間的關(guān)系和約束基本能查缺補(bǔ)漏。4. 動(dòng)態(tài)建模順序圖、狀態(tài)圖和活動(dòng)圖的分工與畫法動(dòng)態(tài)建模是 UML 課程設(shè)計(jì)中最容易互相覆蓋的部分。順序圖、狀態(tài)圖、活動(dòng)圖畫哪幾張、畫到什么粒度需要有清晰的判斷標(biāo)準(zhǔn)?;\統(tǒng)地說(shuō)順序圖強(qiáng)調(diào)「某一次具體交互中的消息時(shí)序」?fàn)顟B(tài)圖強(qiáng)調(diào)「一個(gè)對(duì)象的生命周期」活動(dòng)圖強(qiáng)調(diào)「跨多個(gè)對(duì)象的業(yè)務(wù)流程流向」。4.1 順序圖消息順序才是靈魂順序圖最常見的錯(cuò)誤是一張圖塞進(jìn)太多場(chǎng)景。正確做法是一個(gè)用例對(duì)應(yīng)一張順序圖圖里的對(duì)象盡量控制在 4 到 6 個(gè)消息控制在 8 到 15 條。以「出場(chǎng)繳費(fèi)」為例參與者是車主對(duì)象依次是車牌識(shí)別設(shè)備、入場(chǎng)記錄、費(fèi)率、訂單、支付網(wǎng)關(guān)。消息順序大致是車牌識(shí)別設(shè)備返回車牌號(hào)給訂單訂單向入場(chǎng)記錄查詢?nèi)雸?chǎng)時(shí)間訂單向費(fèi)率獲取當(dāng)前計(jì)費(fèi)規(guī)則訂單計(jì)算費(fèi)用訂單向支付網(wǎng)關(guān)發(fā)起扣款支付網(wǎng)關(guān)返回支付結(jié)果訂單更新狀態(tài)然后系統(tǒng)控制抬桿。順序圖里選對(duì)象有個(gè)小技巧優(yōu)先選已經(jīng)出現(xiàn)在類圖里的類這樣動(dòng)態(tài)圖才能和靜態(tài)圖對(duì)得上否則評(píng)審時(shí)會(huì)被問(wèn)到——這個(gè)順序圖里的某某對(duì)象為什么不在類圖里答案無(wú)外乎兩種要么類圖漏了要么順序圖畫錯(cuò)了。順序圖里不應(yīng)出現(xiàn)類圖中不存在的對(duì)象這類一致性問(wèn)題在評(píng)分中非常致命。關(guān)于消息編號(hào)課程設(shè)計(jì)文檔里建議在每個(gè)消息前加序號(hào)比如 1: getEntryTime()、2: calcFee()。這么做的好處是答辯時(shí)可以直接按序號(hào)把整個(gè)流程講下來(lái)不用在圖上找線。同步消息用實(shí)心箭頭返回消息用虛線箭頭。異步消息在停車場(chǎng)系統(tǒng)里有典型場(chǎng)景——支付網(wǎng)關(guān)返回支付結(jié)果這里適合畫異步接收車輛先抬桿出場(chǎng)支付結(jié)果后臺(tái)到達(dá)。要不要把這個(gè)異步細(xì)節(jié)畫出來(lái)主要看你的課程設(shè)計(jì)是否涉及消息隊(duì)列不涉及的話可以不畫避免給自己增加復(fù)雜度。4.2 狀態(tài)圖車位和訂單是兩個(gè)必須畫的狀態(tài)機(jī)停車場(chǎng)系統(tǒng)里最值得畫狀態(tài)圖的對(duì)象有兩個(gè)車位和訂單。車位狀態(tài)機(jī)大致是空閑 → 預(yù)定預(yù)約成功后→ 占用車輛入場(chǎng)→ 空閑車輛出場(chǎng)。這里要注意「預(yù)定」?fàn)顟B(tài)到「占用」?fàn)顟B(tài)的轉(zhuǎn)換條件按預(yù)約時(shí)段入場(chǎng)才轉(zhuǎn)占用超時(shí)未入場(chǎng)則轉(zhuǎn)空閑。另一種情況是預(yù)約后用戶取消也要從預(yù)定轉(zhuǎn)回空閑。如果不畫這條分支說(shuō)明預(yù)約場(chǎng)景沒(méi)有考慮取消邏輯。訂單狀態(tài)機(jī)更復(fù)雜也更重要已創(chuàng)建 → 待支付 →支付成功已支付 → 已完成或者 已創(chuàng)建 → 待支付 →支付超時(shí)已關(guān)閉。這里有個(gè)容易被忽略的細(xì)節(jié)——在停車場(chǎng)景里訂單可能正在停靠中就已生成車輛當(dāng)前占用車位但費(fèi)用尚未計(jì)算。如果你把訂單狀態(tài)畫成「創(chuàng)建—支付—完成」和實(shí)際業(yè)務(wù)不符。更準(zhǔn)確的寫法是引入「??恐小?fàn)顟B(tài)車輛入場(chǎng)生成停靠中訂單出場(chǎng)時(shí)結(jié)算并轉(zhuǎn)待支付支付成功后轉(zhuǎn)已支付。這個(gè)細(xì)節(jié)是答辯時(shí)的加分項(xiàng)因?yàn)樗w現(xiàn)了你真正理解業(yè)務(wù)狀態(tài)流轉(zhuǎn)而不是套模板。畫狀態(tài)圖還要標(biāo)好事件的觸發(fā)條件。狀態(tài)圖的名字是「狀態(tài)」但真正有價(jià)值的是「轉(zhuǎn)換」——從占用轉(zhuǎn)空閑的事件是車輛出場(chǎng)從待支付轉(zhuǎn)已支付的事件是支付成功回調(diào)。事件名要寫清楚不要寫「改變」要寫「outVehicle() 返回」「paymentResult 為 SUCCESS」。4.3 活動(dòng)圖跨角色流程用活動(dòng)圖別當(dāng)順序圖用活動(dòng)圖適合表達(dá)跨角色、有判斷分支的流程。停車場(chǎng)系統(tǒng)里最有代表性的是「異常車輛出場(chǎng)處理」車輛到出口車牌識(shí)別失敗活動(dòng)圖進(jìn)入判斷——是否人工輸入車牌人工輸入后系統(tǒng)再次查詢?nèi)雸?chǎng)記錄然后判斷費(fèi)用是否有爭(zhēng)議有爭(zhēng)議轉(zhuǎn)人工審核無(wú)爭(zhēng)議進(jìn)入正常繳費(fèi)流程。這個(gè)流程跨越車主、管理員、系統(tǒng)三個(gè)對(duì)象有清晰的分支判斷畫成活動(dòng)圖比順序圖更直觀。畫活動(dòng)圖時(shí)泳道按參與者劃分每個(gè)動(dòng)作放在對(duì)應(yīng)泳道里。判斷節(jié)點(diǎn)用菱形表示分支條件寫在連線上。初學(xué)者常犯的錯(cuò)誤是每個(gè)步驟都加判斷導(dǎo)致活動(dòng)圖里菱形比矩形還多。判斷節(jié)點(diǎn)只在業(yè)務(wù)規(guī)則真正分叉的地方加比如「是否超時(shí)」「是否有入場(chǎng)記錄」而不是「是否輸入車牌成功」這種過(guò)程性操作也畫進(jìn)去。另外活動(dòng)圖和順序圖切忌雙軌制同一場(chǎng)景既畫了順序圖又畫了活動(dòng)圖或者兩個(gè)圖里的消息順序不一致。我的做法是核心用例畫順序圖跨角色的異常流程畫活動(dòng)圖圖面有重疊時(shí)先畫活動(dòng)圖確認(rèn)分支再?gòu)哪硞€(gè)分支抽出來(lái)畫順序圖這樣動(dòng)態(tài)模型整體保持一致不至于各畫各的。5. 從分析到設(shè)計(jì)包圖、部署圖、數(shù)據(jù)庫(kù)設(shè)計(jì)和工具選型UML 課程設(shè)計(jì)如果只畫完用例圖和類圖就交卷等于只完成了分析沒(méi)有完成設(shè)計(jì)。課程題目里寫著「軟件系統(tǒng)分析與設(shè)計(jì)」后半部分要落地為包圖、部署圖和數(shù)據(jù)庫(kù)結(jié)構(gòu)這部分決定了報(bào)告的技術(shù)深度。5.1 包圖劃分原則按層次分包不要按業(yè)務(wù)模塊分包包圖的作用是表達(dá)系統(tǒng)的模塊化組織。常見做法是把系統(tǒng)分成三層表示層、業(yè)務(wù)邏輯層、數(shù)據(jù)訪問(wèn)層對(duì)應(yīng)常見的分層架構(gòu)。在表示層放界面相關(guān)的類在業(yè)務(wù)邏輯層放訂單、費(fèi)率、車輛等核心業(yè)務(wù)類在數(shù)據(jù)訪問(wèn)層放數(shù)據(jù)庫(kù)操作、外部接口適配的類。按層次分包而不是按業(yè)務(wù)模塊分包是因?yàn)橥\噲?chǎng)系統(tǒng)的業(yè)務(wù)邊界相對(duì)清晰模塊分包容易導(dǎo)致循環(huán)依賴。舉個(gè)例子如果你把「收費(fèi)模塊」和「車輛管理模塊」分成兩個(gè)包收費(fèi)模塊需要訪問(wèn)車輛信息車輛管理模塊又需要調(diào)收費(fèi)模塊計(jì)算費(fèi)用兩個(gè)包之間就產(chǎn)生了循環(huán)依賴。按層次劃分后表示層 → 業(yè)務(wù)邏輯層 → 數(shù)據(jù)訪問(wèn)層是單向依賴每一層只能依賴下一層不會(huì)出現(xiàn)循環(huán)。這個(gè)判斷在答辯時(shí)非常加分因?yàn)樗羌軜?gòu)層面的思維不是畫圖層面的工作。包圖里每個(gè)包要寫明內(nèi)部包含的類名至少列出核心類。包之間的關(guān)系用虛線箭頭表示依賴不要用實(shí)線關(guān)聯(lián)因?yàn)榘桶g是「存在依賴」而不是「強(qiáng)關(guān)聯(lián)」。5.2 部署圖與數(shù)據(jù)庫(kù)設(shè)計(jì)UML 怎么落到物理實(shí)現(xiàn)部署圖描述系統(tǒng)的物理節(jié)點(diǎn)和節(jié)點(diǎn)上的構(gòu)件。停車場(chǎng)管理系統(tǒng)常見的節(jié)點(diǎn)有前端管理終端、應(yīng)用服務(wù)器、數(shù)據(jù)庫(kù)服務(wù)器、車牌識(shí)別設(shè)備。應(yīng)用服務(wù)器上部署業(yè)務(wù)邏輯構(gòu)件數(shù)據(jù)庫(kù)服務(wù)器上部署數(shù)據(jù)存儲(chǔ)。如果課程設(shè)計(jì)只做單機(jī)版部署圖可以簡(jiǎn)單畫一個(gè)節(jié)點(diǎn)但如果題目強(qiáng)調(diào)「系統(tǒng)分析與設(shè)計(jì)」建議至少畫出前端、后端、數(shù)據(jù)庫(kù)三個(gè)節(jié)點(diǎn)的部署關(guān)系這樣才體現(xiàn)軟件系統(tǒng)的物理部署結(jié)構(gòu)。數(shù)據(jù)庫(kù)設(shè)計(jì)這一步即使課程設(shè)計(jì)沒(méi)有單獨(dú)要求畫數(shù)據(jù)庫(kù)圖也強(qiáng)烈建議提供一套實(shí)體關(guān)系表和建表語(yǔ)句。原因很簡(jiǎn)單數(shù)據(jù)庫(kù)表結(jié)構(gòu)就是類圖的物理映射。訂單表對(duì)應(yīng)訂單類車輛表對(duì)應(yīng)車輛類車位表對(duì)應(yīng)車位類。類圖里寫明了關(guān)系數(shù)據(jù)庫(kù)里就要有對(duì)應(yīng)的外鍵設(shè)計(jì)。我在實(shí)際參與課程設(shè)計(jì)指導(dǎo)時(shí)發(fā)現(xiàn)很多同學(xué)類圖畫得很好但數(shù)據(jù)庫(kù)表只有一張訂單表一張車位表完全體現(xiàn)不了類圖中的關(guān)系等于分析階段和設(shè)計(jì)階段斷開了。一個(gè)針對(duì)停車場(chǎng)系統(tǒng)的參考設(shè)計(jì)是這樣車輛表車牌號(hào)、車主ID、車型車位表車位ID、樓層、類型、狀態(tài)停車訂單表訂單ID、車牌號(hào)、車位ID、入場(chǎng)時(shí)間、出場(chǎng)時(shí)間、費(fèi)用狀態(tài)費(fèi)率表費(fèi)率ID、生效時(shí)間、單價(jià)、適用時(shí)段。停車訂單表和車輛表之間通過(guò)車牌號(hào)關(guān)聯(lián)和車位表之間通過(guò)車位ID關(guān)聯(lián)和費(fèi)率表之間通過(guò)費(fèi)率ID關(guān)聯(lián)。建表時(shí)注意時(shí)間字段統(tǒng)一用一種類型金額字段用十進(jìn)制而不是浮點(diǎn)數(shù)避免金額計(jì)算精度問(wèn)題。這是實(shí)踐中最常見的細(xì)節(jié)坑。5.3 工具選型畫圖工具怎么選一致性與可追溯性怎么保證UML 工具的選擇直接影響產(chǎn)出效率。常見的有三類一類是專用建模工具適合完整建模流程但需要安裝配置另一類是輕量繪圖工具上手快但模型之間沒(méi)有強(qiáng)約束無(wú)法做一致性檢查還有一類是代碼化建模工具用文本描述圖適合放進(jìn)版本管理。對(duì)課程設(shè)計(jì)場(chǎng)景我建議至少用一個(gè)能滿足三點(diǎn)的工具能繪制類圖并管理關(guān)系、能導(dǎo)出圖片、能方便修改。具體選哪個(gè)看你本機(jī)環(huán)境而定不必人云亦云。更重要的是模型一致性的維護(hù)方法。很多同學(xué)是畫完用例圖畫類圖畫完類圖畫順序圖中間從不回頭檢查。結(jié)果交上去的文檔順序圖里的對(duì)象在類圖里找不到類圖里的類在用例規(guī)格里沒(méi)有對(duì)應(yīng)。我給自己定的一條紀(jì)律是每畫完一張圖回頭檢查上一張圖把不一致的地方當(dāng)場(chǎng)改掉。比如畫完順序圖再回看類圖確認(rèn)消息里調(diào)用的方法在類圖的方法列表里出現(xiàn)了確認(rèn)參與者和用例的關(guān)系還沒(méi)有變化。文檔排版上正文中每張圖下面配一段「圖注 說(shuō)明」說(shuō)明寫清楚這張圖要表達(dá)什么、關(guān)鍵關(guān)系在哪里。課程設(shè)計(jì)報(bào)告評(píng)分時(shí)老師不會(huì)一張圖一張圖地去推他會(huì)先讀文字再對(duì)照?qǐng)D看你要表達(dá)的是不是和文字一致。文字與圖不一致比你圖本身畫錯(cuò)更傷分?jǐn)?shù)。6. 答辯與自查5 類高頻硬傷和一份驗(yàn)證清單6.1 五類答辯時(shí)被追問(wèn)就會(huì)露餡的低級(jí)錯(cuò)誤第一是「用例圖漏了外部系統(tǒng)」。車牌識(shí)別設(shè)備和支付網(wǎng)關(guān)在圖上是畫在系統(tǒng)邊界外的很多同學(xué)會(huì)忽略這一點(diǎn)把設(shè)備畫進(jìn)系統(tǒng)邊界內(nèi)答辯時(shí)被問(wèn)「設(shè)備是系統(tǒng)的一部分還是外部系統(tǒng)」回答不上來(lái)。第二是「順序圖中的消息沒(méi)有操作數(shù)」。順序圖里每條消息都應(yīng)該對(duì)應(yīng)類圖中的一個(gè)方法很多同學(xué)畫了 getData()、setStatus() 這類方法問(wèn)具體是哪個(gè)類的哪個(gè)方法答不出。第三是「狀態(tài)圖的轉(zhuǎn)換條件缺失」。車位狀態(tài)圖里從「預(yù)定」轉(zhuǎn)「占用」不寫轉(zhuǎn)換條件等于沒(méi)說(shuō)。答辯時(shí)老師只需要問(wèn)「什么時(shí)候從預(yù)定變成占用」你補(bǔ)上一個(gè)條件這段就過(guò)關(guān)了。第四是「類圖中泛化關(guān)系誤用」。把「車位」和「普通車位」「超大車位」畫成泛化關(guān)系邏輯上沒(méi)錯(cuò)但如果這兩個(gè)子類沒(méi)有各自的屬性行為泛化就是空殼不如用車位類型字段替代。第五是「全篇圖之間不自洽」。這是最高頻的硬傷——用例事件流寫了「支持月租車輛續(xù)費(fèi)」類圖里卻沒(méi)有月租相關(guān)的類和關(guān)系數(shù)據(jù)庫(kù)里也沒(méi)有月租訂單表。自洽性檢查其實(shí)不復(fù)雜就是逐層對(duì)一遍但大多數(shù)人沒(méi)有這個(gè)習(xí)慣。6.2 一條快速自查路徑我最后提交前會(huì)按下面的順序走一遍全程不超過(guò)半小時(shí)。第一步用例圖和用例規(guī)格說(shuō)明對(duì)照確認(rèn)每個(gè)編號(hào)都有對(duì)應(yīng)文字。第二步用例規(guī)格里的每個(gè)業(yè)務(wù)名詞在類圖里能找到對(duì)應(yīng)類或?qū)傩?。第三步類圖里的關(guān)系逐條問(wèn)為什么是聚合不是組合基數(shù)為什么是 1 對(duì)多第四步順序圖的消息逐條對(duì)照類圖的方法對(duì)象對(duì)照類名。第五步數(shù)據(jù)庫(kù)表結(jié)構(gòu)對(duì)照類圖外鍵關(guān)系與類關(guān)系一致。第六步部署圖的節(jié)點(diǎn)與數(shù)據(jù)庫(kù)、應(yīng)用服務(wù)器的數(shù)據(jù)流對(duì)應(yīng)。如果你時(shí)間緊張至少要保證第三步和第五步——這兩步是最常被挑毛病的地方。6.3 答辯前的小習(xí)慣我習(xí)慣在答辯前一天把全稿打印出來(lái)一張圖配一段文字從頭讀一遍遇到「這一步為什么要這樣」「這個(gè)判斷從哪里來(lái)」的疑問(wèn)現(xiàn)場(chǎng)記下來(lái)第二天主動(dòng)在答辯里講清楚。這個(gè)方法救過(guò)我太多次因?yàn)閳D紙和文字刷在屏幕上時(shí)眼睛會(huì)慣性跳過(guò)問(wèn)題打印出來(lái)以后大腦切換審閱模式很多邏輯斷點(diǎn)才會(huì)暴露。答辯的時(shí)候被問(wèn)到不會(huì)的問(wèn)題不要硬撐把自己的思路說(shuō)清楚承認(rèn)「這塊我當(dāng)時(shí)沒(méi)有考慮周全但如果要補(bǔ)充我會(huì)這樣做」——這比沉默或亂答要好得多。停車場(chǎng)管理系統(tǒng)的 UML 課程設(shè)計(jì)本質(zhì)上不是在考你會(huì)畫幾種圖而是在考你有沒(méi)有形成一套「從需求到模型再到設(shè)計(jì)」的完整思維鏈。希望這篇筆記能幫你在交付之前把這條鏈上的每個(gè)環(huán)節(jié)都釘穩(wěn)。本文還有配套的精品資源點(diǎn)擊獲取