、建模與設(shè)計(jì)實(shí)戰(zhàn):從需求拆解到代碼落地的完整閉環(huán))
簡(jiǎn)介一套圍繞《UML基礎(chǔ)、建模與設(shè)計(jì)實(shí)戰(zhàn)》的課件與工程實(shí)例資料包面向UML初學(xué)者、軟件工程專(zhuān)業(yè)學(xué)生及需要做系統(tǒng)建模設(shè)計(jì)的開(kāi)發(fā)人員旨在通過(guò)講解和案例將UML理論落到實(shí)際項(xiàng)目中。壓縮包共45個(gè)文件含13份PPT課件、12個(gè)UML工程文件、14個(gè)Java示例總大小僅4.63MB輕量易下載課件按章節(jié)覆蓋UML概述、面向?qū)ο蟆⒂美龍D、類(lèi)圖、順序圖/協(xié)作圖、狀態(tài)圖/活動(dòng)圖、組件圖/部署圖及RUP等核心內(nèi)容工程案例則包括汽車(chē)租賃系統(tǒng)、圖書(shū)管理系統(tǒng)、BBS論壇、新聞管理系統(tǒng)、數(shù)碼錄音機(jī)等既有靜態(tài)結(jié)構(gòu)建模也有動(dòng)態(tài)行為設(shè)計(jì)便于對(duì)照學(xué)習(xí)。目前已有481人學(xué)習(xí)瀏覽。這份資料既能作為課堂同步講義也能用于課后自學(xué)和課程設(shè)計(jì)參考通過(guò)研讀PPT并打開(kāi)對(duì)應(yīng)Java與UML文件可以快速掌握各類(lèi)圖的繪制方法及UML在軟件開(kāi)發(fā)全流程中的實(shí)際用法。 UML這東西你要是問(wèn)剛?cè)胄械某绦騿T十個(gè)有八個(gè)會(huì)說(shuō)“就是畫(huà)圖嘛”。但你真要他畫(huà)一張類(lèi)圖出來(lái)他可能連繼承箭頭朝哪邊都記不準(zhǔn)。我做《UML基礎(chǔ)、建模與設(shè)計(jì)實(shí)戰(zhàn)》這套課件和配套例子就是沖著這個(gè)痛點(diǎn)去的——不是把UML語(yǔ)法從頭到尾念一遍而是帶著你把需求拆成用例、把用例變成類(lèi)圖、把類(lèi)圖落成代碼走完一個(gè)完整的建模設(shè)計(jì)閉環(huán)。這套材料最適合三類(lèi)人一是軟件工程專(zhuān)業(yè)的在校學(xué)生要應(yīng)付考試又要?jiǎng)邮肿稣n設(shè)二是剛?cè)肼毜捻?xiàng)目新人既看不懂團(tuán)隊(duì)里的架構(gòu)圖自己也不會(huì)畫(huà)設(shè)計(jì)圖三是想系統(tǒng)補(bǔ)建模能力的開(kāi)發(fā)人員雖然寫(xiě)過(guò)不少業(yè)務(wù)代碼但畫(huà)出來(lái)的類(lèi)圖總被架構(gòu)師吐槽。1. 先搞清楚UML到底解決什么問(wèn)題1.1 很多人把UML當(dāng)成“畫(huà)圖”其實(shí)它是一套溝通協(xié)議這是一個(gè)特別常見(jiàn)的誤區(qū)。UML全稱(chēng)Unified Modeling Language統(tǒng)一建模語(yǔ)言。注意“語(yǔ)言”這兩個(gè)字它跟英語(yǔ)、Java是一個(gè)性質(zhì)的東西核心作用是溝通。只不過(guò)它的溝通對(duì)象是軟件參與者——產(chǎn)品經(jīng)理、架構(gòu)師、開(kāi)發(fā)、測(cè)試甚至客戶(hù)。你畫(huà)一張用例圖產(chǎn)品經(jīng)理能看懂畫(huà)一張類(lèi)圖開(kāi)發(fā)能對(duì)接畫(huà)一張部署圖運(yùn)維知道怎么上線(xiàn)。UML強(qiáng)調(diào)“統(tǒng)一”就是因?yàn)榇蠹叶嫉冒赐惶追?hào)規(guī)則來(lái)否則你畫(huà)的圓我不認(rèn)識(shí)我畫(huà)的箭頭你理解成另一個(gè)意思溝通成本不降反升。我見(jiàn)過(guò)不少項(xiàng)目團(tuán)隊(duì)說(shuō)是用UML實(shí)際就是拿畫(huà)圖工具隨手畫(huà)個(gè)大概樣子箭頭隨便用矩形大小不齊標(biāo)簽愛(ài)寫(xiě)不寫(xiě)。這種圖發(fā)到群里每個(gè)人理解都不一樣最后代碼寫(xiě)出來(lái)跟圖完全是兩回事。UML的價(jià)值不在于圖好不好看而在于信息傳遞的準(zhǔn)確性。一個(gè)空心三角箭頭和實(shí)心三角箭頭語(yǔ)義差著十萬(wàn)八千里畫(huà)錯(cuò)了會(huì)直接影響整個(gè)團(tuán)隊(duì)對(duì)設(shè)計(jì)的判斷。所以學(xué)UML的第一個(gè)門(mén)檻不是記住多少個(gè)圖而是建立“符號(hào)即語(yǔ)義”的嚴(yán)謹(jǐn)感。1.2 這套課件覆蓋的三大板塊課件標(biāo)題分三段基礎(chǔ)、建模、設(shè)計(jì)實(shí)戰(zhàn)。三個(gè)詞對(duì)應(yīng)三個(gè)層次缺一不可?;A(chǔ)部分把UML中最常用的幾種圖講清楚包括類(lèi)圖、用例圖、時(shí)序圖、狀態(tài)圖、活動(dòng)圖、組件圖、部署圖。這里只講語(yǔ)法和元素不牽扯復(fù)雜的項(xiàng)目背景目的是讓人先把“詞和句法”混個(gè)臉熟。這個(gè)階段我刻意把例子做得小而具體比如用“一個(gè)學(xué)生選課”來(lái)演示類(lèi)圖的多重性用“訂單發(fā)貨”來(lái)演示狀態(tài)圖的狀態(tài)遷移。小例子覆蓋面廣學(xué)起來(lái)輕松也方便后面串成大項(xiàng)目。建模部分講怎么從需求分析出發(fā)把一段描述性的業(yè)務(wù)文字轉(zhuǎn)化成UML模型。這是很多教材容易忽略的地方——考試讓你畫(huà)一張類(lèi)圖你畫(huà)得出來(lái)丟給你一份幾十頁(yè)的需求文檔你直接就懵了。建模就是解決“原材料怎么加工”的問(wèn)題它比單純畫(huà)圖難得多因?yàn)樯婕俺橄?、分?lèi)和取舍也是拉開(kāi)普通開(kāi)發(fā)者和架構(gòu)師差距的關(guān)鍵。設(shè)計(jì)實(shí)戰(zhàn)部分用完整的項(xiàng)目案例把前面積累的知識(shí)點(diǎn)串起來(lái)從需求梳理、用例分析、概念建模到詳細(xì)設(shè)計(jì)全流程走一遍。這一部分強(qiáng)調(diào)“取舍能力”哪些類(lèi)該抽出來(lái)哪些關(guān)系該建哪些細(xì)節(jié)可以留到代碼里再說(shuō)。我個(gè)人覺(jué)得這是整套課件的精華前兩部分是“學(xué)”第三部分是“用”只有真的跟完一個(gè)完整案例你才會(huì)對(duì)UML產(chǎn)生手感。2. 課件和例子的設(shè)計(jì)思路案例貫穿語(yǔ)法隨用隨講2.1 為什么不用“一章一種圖”的傳統(tǒng)寫(xiě)法傳統(tǒng)教材喜歡把UML每種圖單獨(dú)列一章類(lèi)圖一章、用例圖一章、時(shí)序圖一章、狀態(tài)圖一章每章講完語(yǔ)法再配幾個(gè)孤立小例子。這種結(jié)構(gòu)適合當(dāng)字典查閱但不適合第一次學(xué)。問(wèn)題在于真實(shí)建模中這幾種圖是交叉使用的。你不可能先把所有用例圖畫(huà)完再想類(lèi)圖而是用例分析到一半概念類(lèi)就浮現(xiàn)出來(lái)了類(lèi)關(guān)系定到一半又要用時(shí)序圖驗(yàn)證消息流轉(zhuǎn)是否順暢。所以課件采用了“案例貫穿、語(yǔ)法隨用隨講”的思路。每引入一種新圖就掛靠到同一個(gè)案例鏈路的某個(gè)環(huán)節(jié)上讓讀者直觀(guān)感受到“這種圖在這個(gè)場(chǎng)景出現(xiàn)了它解決的是那個(gè)問(wèn)題”。這種講法第一次讀可能會(huì)讓人覺(jué)得有點(diǎn)跳——怎么一會(huì)兒類(lèi)圖一會(huì)兒時(shí)序圖——但堅(jiān)持學(xué)到中后段前面的知識(shí)點(diǎn)會(huì)自然串起來(lái)產(chǎn)生一種“原來(lái)如此”的頓悟。課件里我也明確建議第一遍通讀不要停下來(lái)?yè)讣?xì)節(jié)第二遍再按章節(jié)精讀語(yǔ)法。2.2 例子怎么選貼近生活又帶設(shè)計(jì)含量選例子是門(mén)手藝活。太簡(jiǎn)單的例子比如“學(xué)生選課”一張圖就畫(huà)完了學(xué)不到東西太復(fù)雜的例子比如“電商中臺(tái)系統(tǒng)”信息量巨大新手看到一堆類(lèi)直接勸退。課件里我選了三個(gè)例子來(lái)承載不同階段的內(nèi)容。第一個(gè)是圖書(shū)借閱系統(tǒng)用于基礎(chǔ)篇。它貼近校園生活領(lǐng)域概念清晰實(shí)體關(guān)系不超過(guò)6個(gè)類(lèi)適合講類(lèi)圖基本語(yǔ)法和對(duì)象圖畫(huà)法。第二個(gè)是訂單管理系統(tǒng)用于建模篇。它引入訂單狀態(tài)流轉(zhuǎn)待支付、已支付、已發(fā)貨、已完成、服務(wù)層接口設(shè)計(jì)這些真實(shí)項(xiàng)目要素能講清楚用例圖、活動(dòng)圖、時(shí)序圖怎么配合。第三個(gè)是支付網(wǎng)關(guān)對(duì)接用于設(shè)計(jì)實(shí)戰(zhàn)。這個(gè)案例有“技術(shù)含量”因?yàn)樯婕安呗阅J健Ц秾殹⑽⑿?、銀聯(lián)這些不同支付渠道被抽象成統(tǒng)一的支付策略接口讓新手直觀(guān)看到設(shè)計(jì)模式在UML圖里是怎么表達(dá)的還能引出“開(kāi)閉原則”對(duì)擴(kuò)展開(kāi)放、對(duì)修改關(guān)閉這類(lèi)設(shè)計(jì)思想。三個(gè)案例的共同點(diǎn)是“有真實(shí)感但不過(guò)度復(fù)雜”每一階段學(xué)完都能獨(dú)立畫(huà)出一組圖成就感來(lái)得很快也方便讀者在練習(xí)時(shí)對(duì)照自己的生活經(jīng)驗(yàn)理解業(yè)務(wù)。3. 核心知識(shí)點(diǎn)拆解這些細(xì)節(jié)是新手必過(guò)的坎3.1 類(lèi)圖關(guān)系的箭頭含義對(duì)照表類(lèi)圖是UML里出現(xiàn)頻率最高的圖但對(duì)新手而言最頭疼的就是那一堆箭頭。說(shuō)實(shí)話(huà)考試畫(huà)錯(cuò)箭頭頂多扣兩分工作里類(lèi)圖畫(huà)錯(cuò)箭頭評(píng)審會(huì)上就是公開(kāi)處刑。下面這張表我建議直接抄走貼在工位旁邊關(guān)系類(lèi)型圖形表示方向語(yǔ)義說(shuō)明代碼對(duì)應(yīng)繼承/泛化空心三角實(shí)線(xiàn)子類(lèi)指向父類(lèi)“is-a”關(guān)系子類(lèi)擁有父類(lèi)的能力extends實(shí)現(xiàn)空心三角虛線(xiàn)類(lèi)指向接口類(lèi)實(shí)現(xiàn)接口中定義的方法implements依賴(lài)普通箭頭虛線(xiàn)使用方指向被使用方某個(gè)方法參數(shù)、返回類(lèi)型或局部變量用到對(duì)方方法局部變量、方法參數(shù)關(guān)聯(lián)普通箭頭實(shí)線(xiàn)按需標(biāo)注方向類(lèi)持有對(duì)方的引用穩(wěn)定的“has-a”關(guān)系成員變量聚合空心菱形實(shí)線(xiàn)菱形端指向整體整體與局部可分離局部生命周期獨(dú)立構(gòu)造注入、setter注入組合實(shí)心菱形實(shí)線(xiàn)菱形端指向整體整體與局部同生命周期局部沒(méi)有獨(dú)立意義類(lèi)內(nèi)部創(chuàng)建成員變量特別注意后三行的區(qū)別。依賴(lài)是最弱的關(guān)系強(qiáng)調(diào)的是“方法層面碰了一下”關(guān)聯(lián)是相對(duì)穩(wěn)定的持有聚合和組合都屬于“整體-部分”區(qū)別在于生命周期是否綁定。教你一個(gè)生活化記法一輛汽車(chē)和它的發(fā)動(dòng)機(jī)是組合發(fā)動(dòng)機(jī)拆了車(chē)就不能開(kāi)兩者生命周期強(qiáng)綁定一個(gè)教室和里面的椅子是聚合椅子搬走了教室照樣存在生命周期互相獨(dú)立。3.2 用例圖不是畫(huà)幾個(gè)圈就完事用例圖看起來(lái)最簡(jiǎn)單——小人和橢圓新手半小時(shí)就能畫(huà)一張。但真正難的是“用例粒度”的把握。一個(gè)“用戶(hù)登錄”是畫(huà)成一個(gè)用例還是拆成“密碼登錄”“短信驗(yàn)證碼登錄”“掃碼登錄”三個(gè)用例這沒(méi)有絕對(duì)標(biāo)準(zhǔn)取決于你想表達(dá)的業(yè)務(wù)層級(jí)。課件里給了一個(gè)判斷原則如果這個(gè)用例能讓參與者感知到一個(gè)完整的業(yè)務(wù)價(jià)值閉環(huán)那就夠“粗”如果只是業(yè)務(wù)流程中的某個(gè)步驟那應(yīng)該降級(jí)成子流程或者放到活動(dòng)圖里當(dāng)一個(gè)節(jié)點(diǎn)。用例之間的關(guān)系也是高頻考點(diǎn)。include包含表示“主用例執(zhí)行過(guò)程中一定會(huì)調(diào)用的子功能”比如“下訂單”包含“庫(kù)存查詢(xún)”extend擴(kuò)展表示“在特定條件下才會(huì)觸發(fā)的可選項(xiàng)”比如“下訂單”擴(kuò)展“使用優(yōu)惠券”。一個(gè)代表必然發(fā)生一個(gè)代表可能發(fā)生這個(gè)區(qū)別是最容易考到、也最容易混淆的知識(shí)點(diǎn)。在畫(huà)圖時(shí)include和extend都使用虛線(xiàn)箭頭區(qū)別在箭頭指向include是被包含用例放在執(zhí)行方extend是擴(kuò)展用例指向主用例。3.3 時(shí)序圖和狀態(tài)圖的適用場(chǎng)景怎么分這兩個(gè)圖常被初學(xué)者當(dāng)成同一個(gè)東西其實(shí)關(guān)注點(diǎn)完全不一樣。時(shí)序圖關(guān)注“多個(gè)對(duì)象之間消息的時(shí)間順序”解決的是“誰(shuí)調(diào)誰(shuí)、什么時(shí)候調(diào)、按什么順序調(diào)”狀態(tài)圖關(guān)注“單個(gè)對(duì)象在其生命周期內(nèi)狀態(tài)的變遷”解決的是“這個(gè)對(duì)象在什么條件下變成什么狀態(tài)”。用一個(gè)例子秒懂。一個(gè)訂單對(duì)象有“待支付”“已支付”“已發(fā)貨”“已完成”這些狀態(tài)以及“支付成功”“發(fā)貨”“確認(rèn)收貨”這些觸發(fā)遷移的事件這就是狀態(tài)機(jī)圖的主場(chǎng)。而用戶(hù)點(diǎn)擊“提交訂單”之后OrderService要調(diào)用StockService扣庫(kù)存、調(diào)用PaymentService生成支付單、再調(diào)用MessageService給管理員發(fā)通知這個(gè)調(diào)用順序和消息內(nèi)容就是時(shí)序圖的主場(chǎng)。建模的功力很大程度上體現(xiàn)在“選對(duì)圖”這件事上。選對(duì)了一張圖頂千行文檔選錯(cuò)了畫(huà)得再漂亮也是在繞遠(yuǎn)路。4. 從建模到寫(xiě)代碼把圖翻譯成實(shí)現(xiàn)的路子4.1 建模的三個(gè)層次缺一不可很多初學(xué)者把建模理解成“畫(huà)一張能看懂的圖”但實(shí)際工程中的建模有三個(gè)層次不同階段關(guān)注的內(nèi)容完全不同。概念層建模最貼近業(yè)務(wù)。這個(gè)階段不涉及任何技術(shù)棧只關(guān)注業(yè)務(wù)領(lǐng)域里的實(shí)體、規(guī)則和關(guān)系。比如“讀者可以借閱多本圖書(shū)但同一本書(shū)最多借兩周”畫(huà)出來(lái)的類(lèi)圖只有業(yè)務(wù)名詞和關(guān)鍵關(guān)系不寫(xiě)方法、不寫(xiě)字段類(lèi)型連屬性可見(jiàn)性都不用標(biāo)。規(guī)格層建模開(kāi)始考慮軟件系統(tǒng)了類(lèi)的屬性、方法、可見(jiàn)性、關(guān)系上的多重性都要明確寫(xiě)出來(lái)。同一張讀者借書(shū)圖這個(gè)階段就會(huì)出現(xiàn)borrowDate、returnDate這些字段出現(xiàn)borrowBook()這樣的方法也要標(biāo)出Reader和Book之間的1對(duì)多關(guān)系。實(shí)現(xiàn)層建模則要貼近具體代碼框架。比如用Spring要做三層架構(gòu)那類(lèi)圖里就會(huì)出現(xiàn)Controller、Service、Mapper這些技術(shù)模塊甚至?xí)屑兗夹g(shù)類(lèi)如BookMapper接口、BookService接口等。大多數(shù)教材只停在規(guī)格層課件把概念層和實(shí)現(xiàn)層補(bǔ)上就是為了說(shuō)明一個(gè)道理同一個(gè)系統(tǒng)可以有多個(gè)UML模型它們描述的是不同視角沒(méi)有哪張圖是“唯一正確答案”關(guān)鍵是搞清楚當(dāng)前階段要解決什么問(wèn)題。4.2 從用例到類(lèi)圖的推導(dǎo)過(guò)程建模實(shí)操中新手最容易卡在“用例圖怎么變成類(lèi)圖”。課件總結(jié)了三個(gè)樸素的方法找名詞、標(biāo)動(dòng)詞、分邊界。第一步找名詞把用例描述里的名詞圈出來(lái)比如“圖書(shū)”“訂單”“用戶(hù)”“借閱記錄”這些大概率就是候選類(lèi)。第二步標(biāo)動(dòng)詞動(dòng)詞短語(yǔ)往往對(duì)應(yīng)類(lèi)的方法或類(lèi)之間的關(guān)聯(lián)比如“用戶(hù)提交訂單”“提交”是OrderService的方法“用戶(hù)”和“訂單”之間就產(chǎn)生了關(guān)聯(lián)。第三步分邊界有些名詞不適合做成類(lèi)比如“身份證號(hào)”更適合作為User的一個(gè)屬性而不是單獨(dú)建一個(gè)IdCard類(lèi)“微信支付配置”雖然能獨(dú)立成類(lèi)但如果你只是在數(shù)據(jù)庫(kù)表里存幾行配置那做一個(gè)Config實(shí)體就夠了。這個(gè)過(guò)程不是一步到位的通常需要在用例圖和類(lèi)圖之間來(lái)回迭代好幾輪。課件里特意保留了推導(dǎo)過(guò)程的修改痕跡截圖就是為了讓讀者看到建模本來(lái)就是一個(gè)不斷修正的過(guò)程第一稿不完美是正常的不可能拿著需求就能直接畫(huà)出滿(mǎn)分設(shè)計(jì)。4.3 讓模型不變成擺設(shè)很多開(kāi)發(fā)者的真實(shí)狀態(tài)是項(xiàng)目啟動(dòng)時(shí)辛辛苦苦畫(huà)了三五張UML圖一進(jìn)編碼階段圖就再也沒(méi)更新過(guò)三個(gè)月后圖和代碼完全脫節(jié)圖淪為評(píng)審時(shí)的擺設(shè)。解決這個(gè)問(wèn)題的思路是把UML圖當(dāng)成代碼的“注釋升級(jí)版”而不是代碼的“前置交付物”。具體操作上建議把圖納入版本管理跟代碼一樣提交到Git倉(cāng)庫(kù)每次更新圖就留一個(gè)commit記錄。代碼評(píng)審的時(shí)候順手看一眼對(duì)應(yīng)的類(lèi)圖有沒(méi)有同步更新?,F(xiàn)在不少工具支持從代碼反向生成UML類(lèi)圖比如IntelliJ IDEA的Diagram功能、StarUML的代碼工程導(dǎo)入雖然不能做到代碼和模型全自動(dòng)雙向同步但“小步同步、每次迭代都更新”至少能讓圖保持活力。課件最后一章專(zhuān)門(mén)講“怎么讓UML活下來(lái)”核心就一句話(huà)別把圖當(dāng)圣旨把圖當(dāng)溝通工具。5. 一個(gè)完整例子圖書(shū)借閱系統(tǒng)的建模實(shí)戰(zhàn)5.1 第一步從需求到用例圖用圖書(shū)借閱系統(tǒng)完整走一遍建模流程。先給一段需求描述“系統(tǒng)面向圖書(shū)館管理員和普通讀者。讀者可以檢索圖書(shū)、借閱圖書(shū)、歸還圖書(shū)、查看個(gè)人借閱記錄和欠款。管理員負(fù)責(zé)圖書(shū)的錄入、下架、讀者賬號(hào)管理以及處理借還和罰款業(yè)務(wù)?!毙枨蟛婚L(zhǎng)但夠用了。先確定參與者讀者、管理員。然后畫(huà)用例圖讀者有檢索圖書(shū)、借閱圖書(shū)、歸還圖書(shū)、查看借閱記錄管理員有圖書(shū)錄入、圖書(shū)下架、借還處理、罰款處理。注意“讀者借閱圖書(shū)”和“管理員處理借還”從業(yè)務(wù)上看是同一個(gè)動(dòng)作的兩個(gè)視角在用例圖中這很正常只要參與者區(qū)分開(kāi)就行。另外“系統(tǒng)自動(dòng)計(jì)算超期罰款”可以作為一個(gè)參與者是“時(shí)間觸發(fā)器”的用例初學(xué)階段容易漏掉這種非人類(lèi)參與者。用例圖畫(huà)完別急著進(jìn)入類(lèi)圖。每個(gè)用例還要配有基本的用例描述主成功場(chǎng)景、異常分支、前置條件、后置條件。這些描述才是后續(xù)畫(huà)時(shí)序圖的原料。5.2 第二步識(shí)別類(lèi)與關(guān)系畫(huà)出類(lèi)圖基于用例描述開(kāi)始找類(lèi)。名詞有讀者、圖書(shū)、借閱記錄、罰款單、館藏副本動(dòng)詞有借閱、歸還、繳納。這里遇到一個(gè)關(guān)鍵設(shè)計(jì)決策“圖書(shū)”和“館藏副本”要分還是合在需求“一本書(shū)可以有多本副本”出現(xiàn)時(shí)就必須拆成Book書(shū)目和BookCopy副本兩個(gè)類(lèi)否則無(wú)法表達(dá)多本副本同時(shí)被不同讀者借出。繼續(xù)梳理關(guān)系Reader讀者和LoanRecord借閱記錄是一對(duì)多BookCopy和LoanRecord也是一對(duì)多LoanRecord同時(shí)關(guān)聯(lián)Reader和BookCopy。這里有一個(gè)值得思考的設(shè)計(jì)點(diǎn)借閱記錄應(yīng)該關(guān)聯(lián)到BookCopy而不是Book因?yàn)樽x者實(shí)際借走的是具體的一本副本而不是書(shū)目。這種“為什么這樣建?!钡乃伎歼^(guò)程比最終圖本身更重要也是我想通過(guò)例子傳達(dá)的。5.3 第三步用時(shí)序圖驗(yàn)證設(shè)計(jì)合理性類(lèi)圖畫(huà)好不代表設(shè)計(jì)完成。我習(xí)慣畫(huà)一張時(shí)序圖走一遍“借閱圖書(shū)”主流程驗(yàn)證類(lèi)圖能不能支撐業(yè)務(wù)。流程大致是管理員掃描圖書(shū)條碼系統(tǒng)根據(jù)條碼找到BookCopy檢查該副本狀態(tài)是否“可借”如果可借再校驗(yàn)ReaderAccount是否有超期未還圖書(shū)或未繳罰款校驗(yàn)通過(guò)后創(chuàng)建LoanRecord更新BookCopy狀態(tài)為“借出”最后返回借閱成功。這個(gè)時(shí)序圖畫(huà)下來(lái)很容易暴露一個(gè)類(lèi)職責(zé)問(wèn)題檢查讀者是否有欠款這個(gè)邏輯應(yīng)該寫(xiě)在LoanRecord里還是抽出一個(gè)AccountService如果寫(xiě)在LoanRecord里它的職責(zé)就太重了抽一個(gè)AccountService職責(zé)更清晰。所以我說(shuō)時(shí)序圖不只是“畫(huà)個(gè)流程”它是一個(gè)驗(yàn)證設(shè)計(jì)合理性的工具。時(shí)序圖能順利走通類(lèi)圖的職責(zé)分配基本不會(huì)有方向性問(wèn)題走不通說(shuō)明哪里責(zé)任沒(méi)理清該加的類(lèi)加該拆的類(lèi)拆。6. 建模實(shí)操中的常見(jiàn)問(wèn)題和避坑建議6.1 新手最容易踩的五個(gè)坑第一個(gè)坑畫(huà)圖前不明確受眾。面向產(chǎn)品經(jīng)理的用例圖和面向開(kāi)發(fā)的類(lèi)圖詳細(xì)程度完全不同。先問(wèn)“這圖給誰(shuí)看”再?zèng)Q定畫(huà)到什么粒度。第二個(gè)坑濫用依賴(lài)關(guān)系和關(guān)聯(lián)關(guān)系。方法參數(shù)里用到類(lèi)A就畫(huà)一條依賴(lài)箭頭字段里有個(gè)List就畫(huà)一條關(guān)聯(lián)箭頭結(jié)果圖亂成一團(tuán)。我自己的原則是類(lèi)圖優(yōu)先表達(dá)關(guān)聯(lián)、聚合、組合和繼承這四種關(guān)系依賴(lài)只在標(biāo)注某個(gè)特定調(diào)用關(guān)系時(shí)才畫(huà)。第三個(gè)坑把所有方法都畫(huà)進(jìn)類(lèi)圖。類(lèi)圖是給人看的不是給編譯器看的。方法太多時(shí)只畫(huà)核心方法的簽名即可其余用省略號(hào)一帶而過(guò)。第四個(gè)坑狀態(tài)圖和活動(dòng)圖混用。狀態(tài)圖是單個(gè)對(duì)象在生命周期內(nèi)的“縱向觀(guān)察”活動(dòng)圖是業(yè)務(wù)流程在不同參與者間流動(dòng)的“橫向觀(guān)察”。分不清的時(shí)候問(wèn)問(wèn)自己圖里有沒(méi)有“對(duì)象狀態(tài)”有就是狀態(tài)圖沒(méi)有純流程節(jié)點(diǎn)就是活動(dòng)圖。第五個(gè)坑畫(huà)完圖就當(dāng)甩手掌柜半年不更新。圖是活的文檔不是一次性的交差物品這個(gè)毛病得從做項(xiàng)目的第一天就改掉。6.2 建模工具怎么選課件里沒(méi)有強(qiáng)推某款工具因?yàn)椴煌瑘?chǎng)景適合不同工具。學(xué)生黨推薦StarUML跨平臺(tái)、支持教學(xué)用途免費(fèi)許可畫(huà)類(lèi)圖和用例圖操作順暢足夠應(yīng)付課程設(shè)計(jì)和畢業(yè)設(shè)計(jì)。喜歡寫(xiě)文本的開(kāi)發(fā)者可以試試PlantUML用代碼描述圖配合Markdown寫(xiě)文檔非常舒服而且圖源文件是文本方便版本控制Git diff時(shí)能看清改動(dòng)點(diǎn)。團(tuán)隊(duì)協(xié)作可以用draw.io免費(fèi)、有網(wǎng)頁(yè)版、支持多人實(shí)時(shí)編輯缺點(diǎn)是比較復(fù)雜的圖排版容易飄。Enterprise Architect這類(lèi)工具功能極其強(qiáng)大但學(xué)習(xí)成本也極高教學(xué)場(chǎng)景性?xún)r(jià)比不高不建議初學(xué)者一上來(lái)就啃。6.3 講圖比畫(huà)圖更考驗(yàn)功力最后這個(gè)經(jīng)驗(yàn)送給要答辯、要做設(shè)計(jì)評(píng)審的同學(xué)。畫(huà)圖的人容易陷入“我畫(huà)的就是對(duì)的”思維定勢(shì)講圖的時(shí)候語(yǔ)速飛快全是自嗨。真實(shí)的評(píng)審場(chǎng)景里聽(tīng)眾看一張圖第一眼只關(guān)心三件事核心實(shí)體是哪些、實(shí)體間的主要關(guān)系是什么、關(guān)鍵的流程從哪到哪。所以講圖要先整體后細(xì)節(jié)先用一句話(huà)概括這張圖表達(dá)的模型是什么再按閱讀順序從上到下或從左到右把關(guān)鍵關(guān)系講清楚最后才提一兩個(gè)設(shè)計(jì)要點(diǎn)和備選方案。千萬(wàn)別一上來(lái)就鉆進(jìn)某個(gè)類(lèi)的某個(gè)方法那樣聽(tīng)眾會(huì)立刻失去耐心。以上這些都是我一次次踩坑踩出來(lái)的體會(huì)。第一次講UML的時(shí)候我對(duì)著圖瘋狂念標(biāo)簽把“關(guān)聯(lián)”“聚合”這些術(shù)語(yǔ)背得滾瓜爛熟學(xué)員卻全程一臉茫然。后來(lái)把“先整體、再關(guān)鍵、后細(xì)節(jié)”這套講述方式固定下來(lái)課堂反饋才明顯好轉(zhuǎn)。UML本質(zhì)上不復(fù)雜它就是蓋房子之前的建筑施工圖唯一目的是讓所有參與者對(duì)齊認(rèn)知。把它當(dāng)溝通工具用它價(jià)值巨大把它當(dāng)成應(yīng)付檢查的文檔那它就是個(gè)形式主義。希望這套課件和例子能幫你在真實(shí)項(xiàng)目里把圖畫(huà)起來(lái)、用起來(lái)而不是讓UML永遠(yuǎn)停留在書(shū)架和課件里吃灰。本文還有配套的精品資源點(diǎn)擊獲取