UML行為圖實(shí)戰(zhàn):狀態(tài)圖與活動(dòng)圖的核心差異與選型指南
1. 從“靜態(tài)”到“動(dòng)態(tài)”為什么我們需要行為圖在軟件設(shè)計(jì)和系統(tǒng)分析的世界里我們常常從“靜態(tài)”開(kāi)始。類圖、組件圖、部署圖這些UML圖描繪了系統(tǒng)的骨骼和器官——有哪些類、它們?nèi)绾侮P(guān)聯(lián)、系統(tǒng)由哪些部分組成、最終部署在哪里。這就像拿到了一張建筑的結(jié)構(gòu)藍(lán)圖知道了承重墻在哪、房間如何布局。但光有藍(lán)圖我們無(wú)法知道這棟樓里人們一天的生活是如何流動(dòng)的早晨如何從臥室走到廚房晚上客廳的燈光如何依次亮起又熄滅訪客按門(mén)鈴后主人如何響應(yīng)。要理解這些“動(dòng)態(tài)”的行為我們就需要UML中的行為圖。行為圖的核心任務(wù)就是捕捉系統(tǒng)在運(yùn)行時(shí)的“活”的狀態(tài)。它關(guān)注的是對(duì)象如何隨著時(shí)間變化如何響應(yīng)事件以及一系列動(dòng)作如何按順序或并發(fā)地執(zhí)行。在UML的眾多行為圖中狀態(tài)圖和活動(dòng)圖是兩種最常用、也最容易被混淆的利器。很多人覺(jué)得它們看起來(lái)有點(diǎn)像都是帶箭頭的框框但它們的關(guān)注點(diǎn)和適用場(chǎng)景有著本質(zhì)區(qū)別。簡(jiǎn)單來(lái)說(shuō)狀態(tài)圖關(guān)注的是“對(duì)象在特定條件下會(huì)變成什么樣”它描繪的是一個(gè)對(duì)象或系統(tǒng)在其生命周期內(nèi)因事件觸發(fā)而在不同狀態(tài)間遷移的歷程。而活動(dòng)圖關(guān)注的是“為了完成一件事需要按什么步驟做”它更像一個(gè)流程圖描述了從活動(dòng)到活動(dòng)的控制流和數(shù)據(jù)流。理解并正確使用這兩種圖是設(shè)計(jì)清晰、健壯、可維護(hù)系統(tǒng)的關(guān)鍵。狀態(tài)圖能幫你精準(zhǔn)定義業(yè)務(wù)實(shí)體的復(fù)雜生命周期比如訂單從“待支付”到“已發(fā)貨”再到“已完成”的完整旅程避免出現(xiàn)“幽靈狀態(tài)”或非法狀態(tài)遷移活動(dòng)圖則能幫你梳理清晰的業(yè)務(wù)流程比如用戶從登錄、瀏覽商品、下單到支付的完整操作序列或者規(guī)劃復(fù)雜的算法邏輯。接下來(lái)我們就深入這兩種圖的內(nèi)部看看它們各自如何工作以及在實(shí)際項(xiàng)目中如何選擇和應(yīng)用。2. 狀態(tài)圖描繪對(duì)象的生命律動(dòng)狀態(tài)圖有時(shí)也叫狀態(tài)機(jī)圖它描述了一個(gè)對(duì)象在其生命周期內(nèi)所經(jīng)歷的狀態(tài)序列以及導(dǎo)致?tīng)顟B(tài)轉(zhuǎn)換的事件和動(dòng)作。它的核心建模元素是“狀態(tài)”和“遷移”。想象一下一臺(tái)老式的CD播放機(jī)它可能有“關(guān)機(jī)”、“待機(jī)”、“播放”、“暫?!?、“彈出”等狀態(tài)。當(dāng)你按下“播放”鍵事件它從“待機(jī)”狀態(tài)遷移到“播放”狀態(tài)同時(shí)執(zhí)行“啟動(dòng)光盤(pán)旋轉(zhuǎn)并讀取數(shù)據(jù)”的動(dòng)作。這就是狀態(tài)圖要刻畫(huà)的東西。2.1 狀態(tài)圖的核心構(gòu)成要素一個(gè)完整的狀態(tài)圖由以下幾個(gè)關(guān)鍵部分組成理解它們是畫(huà)好狀態(tài)圖的第一步。狀態(tài)表示對(duì)象生命周期中的一個(gè)階段或條件。在狀態(tài)持續(xù)期間對(duì)象會(huì)滿足某些條件、執(zhí)行某些活動(dòng)或等待某些事件。狀態(tài)用一個(gè)圓角矩形表示。初態(tài)和終態(tài)初態(tài)用一個(gè)實(shí)心圓點(diǎn)表示代表對(duì)象生命周期的起點(diǎn)終態(tài)用一個(gè)圓圈套一個(gè)實(shí)心圓點(diǎn)表示代表對(duì)象生命周期的結(jié)束可能是銷毀也可能是完成使命。簡(jiǎn)單狀態(tài)與復(fù)合狀態(tài)簡(jiǎn)單狀態(tài)內(nèi)部沒(méi)有子結(jié)構(gòu)。復(fù)合狀態(tài)則可以包含嵌套的子狀態(tài)機(jī)這對(duì)于建模復(fù)雜的狀態(tài)行為非常有用可以分層細(xì)化。遷移表示狀態(tài)之間的變化由某個(gè)事件觸發(fā)。用一條帶箭頭的實(shí)線表示從源狀態(tài)指向目標(biāo)狀態(tài)。遷移上可以標(biāo)注三個(gè)部分事件 [守衛(wèi)條件] / 動(dòng)作。事件觸發(fā)狀態(tài)遷移的事情如“收到付款”、“超時(shí)”、“用戶取消”。守衛(wèi)條件一個(gè)布爾表達(dá)式寫(xiě)在方括號(hào)[]里。只有當(dāng)事件發(fā)生且守衛(wèi)條件為真時(shí)遷移才會(huì)發(fā)生。例如“收到訂單 [庫(kù)存0]”。動(dòng)作在遷移發(fā)生時(shí)立即執(zhí)行的、不可中斷的操作寫(xiě)在斜杠/后面。例如“/ 扣減庫(kù)存”。內(nèi)部活動(dòng)在狀態(tài)內(nèi)部執(zhí)行的活動(dòng)。寫(xiě)在狀態(tài)框內(nèi)格式為活動(dòng)類型 描述。常見(jiàn)的活動(dòng)類型有entry / 動(dòng)作進(jìn)入該狀態(tài)時(shí)執(zhí)行的動(dòng)作。exit / 動(dòng)作離開(kāi)該狀態(tài)時(shí)執(zhí)行的動(dòng)作。do / 活動(dòng)在該狀態(tài)處于激活狀態(tài)時(shí)持續(xù)執(zhí)行的活動(dòng)如“播放音樂(lè)”。event / 動(dòng)作在該狀態(tài)下特定事件觸發(fā)并執(zhí)行一個(gè)動(dòng)作但不引起狀態(tài)遷移這很重要。2.2 一個(gè)電商訂單的狀態(tài)圖實(shí)戰(zhàn)理論有點(diǎn)抽象我們用一個(gè)經(jīng)典的電商訂單狀態(tài)機(jī)來(lái)實(shí)戰(zhàn)一下。假設(shè)一個(gè)訂單有以下幾個(gè)核心狀態(tài)待支付、已支付、備貨中、已發(fā)貨、已完成、已取消。graph TD A[初態(tài)] -- B[待支付] B -- 用戶支付 / 更新支付時(shí)間 -- C[已支付] B -- 用戶取消 / 釋放庫(kù)存 -- F[已取消] C -- 系統(tǒng)檢查庫(kù)存 / 鎖定庫(kù)存 -- D[備貨中] D -- 倉(cāng)庫(kù)揀貨打包完成 / 生成運(yùn)單 -- E[已發(fā)貨](méi) E -- 用戶確認(rèn)收貨 / 結(jié)算給商家 -- G[已完成] C -- 用戶申請(qǐng)退款 -- H((退款中)) H -- 退款成功 / 釋放庫(kù)存 -- F H -- 退款駁回 -- C D -- 用戶取消發(fā)貨前 / 釋放庫(kù)存 -- F注上圖僅為示意圖實(shí)際UML狀態(tài)圖使用標(biāo)準(zhǔn)圖形符號(hào)我們來(lái)拆解這個(gè)狀態(tài)圖背后的設(shè)計(jì)邏輯初態(tài)訂單創(chuàng)建成功立即進(jìn)入待支付狀態(tài)。這里通常隱含了一個(gè)entry動(dòng)作比如“生成訂單號(hào)”、“記錄創(chuàng)建時(shí)間”。從待支付遷移這里有兩個(gè)互斥的遷移。事件用戶支付。守衛(wèi)條件支付金額等于訂單金額且支付渠道有效。動(dòng)作更新支付狀態(tài)與時(shí)間。完成后進(jìn)入已支付狀態(tài)。事件用戶取消。動(dòng)作釋放預(yù)占的庫(kù)存如果創(chuàng)建訂單時(shí)預(yù)占了庫(kù)存。完成后進(jìn)入已取消狀態(tài)這是一個(gè)終態(tài)。已支付狀態(tài)進(jìn)入此狀態(tài)時(shí)可能執(zhí)行entry / 發(fā)送支付成功通知。這個(gè)狀態(tài)可能不會(huì)停留太久系統(tǒng)會(huì)觸發(fā)一個(gè)自動(dòng)的遷移。事件可以是系統(tǒng)檢查庫(kù)存這是一個(gè)內(nèi)部或自動(dòng)事件。守衛(wèi)條件[所有商品庫(kù)存充足]。動(dòng)作鎖定庫(kù)存。然后遷移到備貨中。這里引入了一個(gè)新?tīng)顟B(tài)退款中。當(dāng)事件用戶申請(qǐng)退款發(fā)生時(shí)從已支付遷移到退款中。這是一個(gè)重要的設(shè)計(jì)它表明“退款”是一個(gè)可能需要人工審核或第三方支付接口處理的獨(dú)立子流程在此期間訂單主狀態(tài)懸停。復(fù)合狀態(tài)與并發(fā)備貨中可以設(shè)計(jì)成一個(gè)復(fù)合狀態(tài)。它內(nèi)部可能包含并發(fā)的子狀態(tài)揀貨、打包、質(zhì)檢。只有當(dāng)所有這些子活動(dòng)都完成后整個(gè)備貨中狀態(tài)才完成觸發(fā)倉(cāng)庫(kù)作業(yè)完成事件遷移到已發(fā)貨。并發(fā)用水平粗線分叉與匯合表示這清晰地展示了業(yè)務(wù)流程中的并行環(huán)節(jié)。狀態(tài)內(nèi)的內(nèi)部事件在已發(fā)貨狀態(tài)我們可能想處理“用戶查詢物流”這個(gè)事件但這不改變訂單狀態(tài)。我們可以寫(xiě)在狀態(tài)框內(nèi)物流查詢 / 返回物流信息。這是一個(gè)event/動(dòng)作的典型例子。終態(tài)已完成和已取消都是終態(tài)。進(jìn)入終態(tài)意味著該訂單對(duì)象的核心生命周期結(jié)束。2.3 繪制狀態(tài)圖的避坑指南與心得畫(huà)了這么多年?duì)顟B(tài)圖我總結(jié)出幾個(gè)最容易踩坑的地方坑一把系統(tǒng)級(jí)流程和對(duì)象狀態(tài)混為一談。狀態(tài)圖應(yīng)該專注于一個(gè)對(duì)象或一個(gè)緊密關(guān)聯(lián)的聚合對(duì)象如訂單的狀態(tài)變化。如果你發(fā)現(xiàn)圖上出現(xiàn)了“用戶”、“庫(kù)存系統(tǒng)”、“物流系統(tǒng)”等不同對(duì)象的行為那很可能畫(huà)成了活動(dòng)圖或序列圖。狀態(tài)圖的視角始終跟隨一個(gè)對(duì)象。坑二濫用復(fù)合狀態(tài)和并發(fā)。復(fù)合狀態(tài)是管理復(fù)雜性的利器但過(guò)度使用會(huì)讓圖變得難以理解。一個(gè)經(jīng)驗(yàn)法則是如果一組子狀態(tài)緊密相關(guān)并且它們與外界的交互方式一致即進(jìn)入/退出這組狀態(tài)的事件是統(tǒng)一的那么就將它們封裝成復(fù)合狀態(tài)。并發(fā)狀態(tài)要謹(jǐn)慎使用確保并發(fā)的子狀態(tài)在邏輯上確實(shí)是獨(dú)立的并且有明確的同步點(diǎn)匯合??尤z漏異常和超時(shí)路徑。這是業(yè)務(wù)邏輯漏洞的主要來(lái)源。在待支付狀態(tài)除了“支付”和“取消”是否要考慮“超時(shí)未支付自動(dòng)取消”在備貨中狀態(tài)如果某個(gè)商品缺貨了怎么辦是遷移到一個(gè)部分缺貨狀態(tài)還是直接取消訂單這些邊界情況必須在狀態(tài)圖中體現(xiàn)出來(lái)通常通過(guò)時(shí)間事件如after(30分鐘)或異常事件來(lái)觸發(fā)遷移??铀膭?dòng)作Action與活動(dòng)Activity混淆。在狀態(tài)內(nèi)部do/活動(dòng)指的是一個(gè)需要時(shí)間才能完成的過(guò)程比如“播放視頻”對(duì)象可以在這個(gè)過(guò)程執(zhí)行期間響應(yīng)其他事件。而遷移上的動(dòng)作或entry/exit動(dòng)作應(yīng)該是瞬時(shí)完成的、原子性的操作比如“計(jì)數(shù)器加一”、“發(fā)送消息”。如果將一個(gè)耗時(shí)的操作放在遷移動(dòng)作上在邏輯上意味著狀態(tài)遷移被阻塞這通常不是好的設(shè)計(jì)。個(gè)人心得在項(xiàng)目初期我習(xí)慣用狀態(tài)圖來(lái)和技術(shù)團(tuán)隊(duì)、甚至產(chǎn)品經(jīng)理溝通復(fù)雜業(yè)務(wù)實(shí)體的規(guī)則。一張清晰的狀態(tài)圖比幾十頁(yè)的需求文檔更直觀能暴露出許多流程上的歧義和漏洞。畫(huà)完圖后一個(gè)很好的驗(yàn)證方法是沿著圖中的每一條路徑在腦子里“跑”一遍各種正常和異常的業(yè)務(wù)場(chǎng)景看看是否都能到達(dá)預(yù)期的終態(tài)有沒(méi)有“死胡同”無(wú)法遷移出去的非終態(tài)或者“黑洞”非法遷移。3. 活動(dòng)圖刻畫(huà)過(guò)程的步驟與決策如果說(shuō)狀態(tài)圖是對(duì)象的“個(gè)人傳記”那么活動(dòng)圖就是一項(xiàng)工作的“操作規(guī)程”或一個(gè)用例的“劇本”。它專注于描述從一個(gè)活動(dòng)到另一個(gè)活動(dòng)的控制流也可以展示并發(fā)的流和數(shù)據(jù)流?;顒?dòng)圖脫胎于流程圖但比傳統(tǒng)流程圖更強(qiáng)大因?yàn)樗街С植l(fā)、分區(qū)泳道和對(duì)象流。3.1 活動(dòng)圖的核心構(gòu)成要素活動(dòng)圖的元素更貼近我們熟悉的流程概念?;顒?dòng)表示一個(gè)工作單元或任務(wù)步驟用一個(gè)圓角矩形表示。它可以是原子的也可以被分解成另一個(gè)活動(dòng)圖。例如“驗(yàn)證用戶身份”、“計(jì)算訂單總價(jià)”、“調(diào)用支付接口”??刂屏鞅硎净顒?dòng)之間的執(zhí)行順序用帶箭頭的實(shí)線表示。這就是流程的主線。初始節(jié)點(diǎn)與活動(dòng)最終節(jié)點(diǎn)初始節(jié)點(diǎn)用一個(gè)實(shí)心圓點(diǎn)表示標(biāo)志流程開(kāi)始?;顒?dòng)最終節(jié)點(diǎn)用一個(gè)圓圈套一個(gè)實(shí)心圓表示標(biāo)志整個(gè)活動(dòng)流程的終止。注意還有一個(gè)流最終節(jié)點(diǎn)一個(gè)圓圈內(nèi)加一個(gè)叉它只終止當(dāng)前的控制流不影響其他并發(fā)的流。決策節(jié)點(diǎn)與合并節(jié)點(diǎn)決策節(jié)點(diǎn)菱形表示一個(gè)分支選擇通常有一個(gè)流入和多個(gè)帶守衛(wèi)條件的流出。合并節(jié)點(diǎn)也是菱形則將多個(gè)可選路徑匯合成一個(gè)流出。它們通常成對(duì)出現(xiàn)用于表示if...else...或switch邏輯。分叉節(jié)點(diǎn)與匯合節(jié)點(diǎn)分叉節(jié)點(diǎn)一條粗水平線將一個(gè)控制流拆分成多個(gè)并發(fā)的執(zhí)行流。匯合節(jié)點(diǎn)另一條粗水平線等待所有并發(fā)的流都到達(dá)后再合并成一個(gè)流繼續(xù)執(zhí)行。這是活動(dòng)圖支持并發(fā)的關(guān)鍵。分區(qū)也叫泳道用垂直或水平的線將活動(dòng)圖分區(qū)每個(gè)分區(qū)代表一個(gè)責(zé)任區(qū)域如一個(gè)組織單元用戶、系統(tǒng)、后臺(tái)服務(wù)、一個(gè)角色客戶、客服、管理員或一個(gè)對(duì)象。它能清晰地表達(dá)“誰(shuí)負(fù)責(zé)做什么”。對(duì)象流可以顯示活動(dòng)如何輸入和輸出對(duì)象數(shù)據(jù)。用虛線箭頭表示連接活動(dòng)和對(duì)象節(jié)點(diǎn)一個(gè)矩形。這有助于理解數(shù)據(jù)在流程中的傳遞和變換。3.2 一個(gè)用戶在線購(gòu)物的活動(dòng)圖剖析讓我們用活動(dòng)圖為“用戶在線購(gòu)買(mǎi)商品”這個(gè)業(yè)務(wù)流程建模。為了清晰我們使用泳道來(lái)區(qū)分“用戶”、“Web前端”、“訂單服務(wù)”和“支付服務(wù)”的責(zé)任。| 用戶 | Web前端 | 訂單服務(wù) | 支付服務(wù) | |---------------|----------------|-------------------|-------------------| | [開(kāi)始] | | | | | 瀏覽商品 | | | | | 添加至購(gòu)物車(chē) | | | | | | 提交購(gòu)物車(chē)頁(yè)面 | | | | | | 創(chuàng)建待支付訂單 | | | | | [庫(kù)存檢查] | | | | | 庫(kù)存充足? | | | | | (是) 鎖定庫(kù)存 | | | | | (否) 返回缺貨信息 | | | | 顯示訂單確認(rèn)頁(yè) | | | | 選擇支付方式 | | | | | 確認(rèn)支付 | | | | | | 調(diào)用支付API | | 生成支付流水 | | | | | 跳轉(zhuǎn)至支付網(wǎng)關(guān) | | [在支付網(wǎng)關(guān)完成支付] | | | | | | | | 接收支付回調(diào) | | | | 更新訂單為已支付 | | | | 顯示支付成功頁(yè) | | | | | | 異步通知倉(cāng)庫(kù)備貨 | | | [結(jié)束] | | | |注這是一個(gè)簡(jiǎn)化的文本表示意在展示泳道和活動(dòng)序列的邏輯。實(shí)際繪圖應(yīng)使用UML圖形工具。我們來(lái)分析這個(gè)活動(dòng)圖揭示的設(shè)計(jì)要點(diǎn)明確的責(zé)任邊界泳道一眼就能看出“創(chuàng)建訂單”、“鎖庫(kù)存”是訂單服務(wù)的職責(zé)“生成支付流水”是支付服務(wù)的職責(zé)。這非常有助于進(jìn)行微服務(wù)或模塊的職責(zé)劃分。并發(fā)性的體現(xiàn)在“更新訂單為已支付”之后活動(dòng)分為兩條線。一條是同步的流向“顯示支付成功頁(yè)”給用戶即時(shí)反饋另一條是異步的“異步通知倉(cāng)庫(kù)備貨”。在活動(dòng)圖中這可以用一個(gè)分叉節(jié)點(diǎn)來(lái)表示這兩件事可以同時(shí)進(jìn)行無(wú)需等待對(duì)方。這反映了現(xiàn)實(shí)系統(tǒng)中為了提高響應(yīng)速度而采用的常見(jiàn)設(shè)計(jì)。決策邏輯清晰“庫(kù)存檢查”后的決策節(jié)點(diǎn)清晰地給出了兩條路徑庫(kù)存充足則繼續(xù)鎖定庫(kù)存庫(kù)存不足則直接返回錯(cuò)誤信息給前端流程終止或?qū)蛞粋€(gè)異常處理流程圖中未展開(kāi)。這種明確的決策點(diǎn)是梳理業(yè)務(wù)規(guī)則的關(guān)鍵。對(duì)象流的潛在應(yīng)用我們可以補(bǔ)充對(duì)象流。例如“創(chuàng)建待支付訂單”活動(dòng)會(huì)產(chǎn)生一個(gè)“訂單對(duì)象”這個(gè)對(duì)象會(huì)作為輸入傳遞給“鎖定庫(kù)存”和后續(xù)的“更新訂單為已支付”等活動(dòng)。用虛線箭頭標(biāo)出這些對(duì)象流能讓數(shù)據(jù)傳遞一目了然。3.3 活動(dòng)圖實(shí)戰(zhàn)技巧與常見(jiàn)誤區(qū)活動(dòng)圖看似簡(jiǎn)單但要用好需要注意以下幾點(diǎn)技巧一選擇合適的粒度?;顒?dòng)圖可以畫(huà)得很高層如“處理客戶訂單”也可以畫(huà)得很詳細(xì)如“驗(yàn)證信用卡號(hào)的算法步驟”。我的經(jīng)驗(yàn)是用于描述跨角色/系統(tǒng)的業(yè)務(wù)流程時(shí)活動(dòng)圖最有效。此時(shí)每個(gè)活動(dòng)應(yīng)該對(duì)應(yīng)一個(gè)有意義的工作單元比如“客服審核申請(qǐng)”、“系統(tǒng)發(fā)送確認(rèn)郵件”而不是“變量i加1”。過(guò)細(xì)的粒度會(huì)讓圖變得冗長(zhǎng)失去溝通價(jià)值。技巧二善用泳道但別過(guò)度。泳道是活動(dòng)圖的靈魂它能清晰劃分職責(zé)。但泳道也不宜過(guò)多通常3-5個(gè)為宜代表流程中主要的參與方。如果參與方太多可以考慮將一些內(nèi)部協(xié)作緊密的服務(wù)合并到一個(gè)泳道如“后端服務(wù)”或者分層繪制先畫(huà)一個(gè)高層的跨系統(tǒng)圖再為某個(gè)復(fù)雜系統(tǒng)畫(huà)一個(gè)內(nèi)部的活動(dòng)圖。技巧三區(qū)分控制流與數(shù)據(jù)流。初學(xué)者常把數(shù)據(jù)和操作混在一起畫(huà)。記住實(shí)線箭頭是控制流表示“做完A后做B”。虛線箭頭是對(duì)象流表示“活動(dòng)A產(chǎn)生了數(shù)據(jù)X活動(dòng)B需要消費(fèi)X”。不是所有數(shù)據(jù)都需要畫(huà)出來(lái)只畫(huà)出關(guān)鍵的業(yè)務(wù)對(duì)象如訂單、支付單、物流單即可。常見(jiàn)誤區(qū)一把活動(dòng)圖當(dāng)成代碼流程圖。這是最大的誤解?;顒?dòng)圖用于建模業(yè)務(wù)過(guò)程或系統(tǒng)工作流它不關(guān)心具體的編程語(yǔ)言實(shí)現(xiàn)。圖中的“活動(dòng)”可能對(duì)應(yīng)著一行代碼、一個(gè)函數(shù)、一個(gè)服務(wù)接口調(diào)用甚至是一段人工操作。它的目的是溝通和設(shè)計(jì)而非直接指導(dǎo)編碼。常見(jiàn)誤區(qū)二忽視異常流和取消流。和狀態(tài)圖一樣只畫(huà)“陽(yáng)光大道”是不夠的。支付可能失敗網(wǎng)絡(luò)可能超時(shí)用戶可能中途關(guān)閉頁(yè)面。這些異常路徑應(yīng)該在活動(dòng)圖中有所體現(xiàn)可以通過(guò)決策節(jié)點(diǎn)導(dǎo)向不同的異常處理活動(dòng)或者使用中斷活動(dòng)區(qū)域一種高級(jí)特性來(lái)建??芍袛嗟牧鞒?。個(gè)人心得在敏捷開(kāi)發(fā)中我經(jīng)常用活動(dòng)圖來(lái)梳理用戶故事User Story的驗(yàn)收標(biāo)準(zhǔn)。和產(chǎn)品經(jīng)理、測(cè)試人員一起在白板上畫(huà)出核心流程的泳道活動(dòng)圖過(guò)程中大家會(huì)對(duì)“這一步到底誰(shuí)來(lái)做”、“這個(gè)異常情況怎么處理”等問(wèn)題達(dá)成一致這張圖隨后就可以作為開(kāi)發(fā)和測(cè)試的共同依據(jù)。它比純文字的描述性驗(yàn)收標(biāo)準(zhǔn)直觀得多。4. 狀態(tài)圖 vs. 活動(dòng)圖關(guān)鍵差異與選型指南到了這里你可能已經(jīng)感覺(jué)到兩者的不同但面對(duì)一個(gè)具體問(wèn)題時(shí)到底該用狀態(tài)圖還是活動(dòng)圖這里有一個(gè)清晰的對(duì)比和選型指南。4.1 本質(zhì)區(qū)別對(duì)比我們可以從幾個(gè)維度進(jìn)行對(duì)比對(duì)比維度狀態(tài)圖活動(dòng)圖核心焦點(diǎn)單個(gè)對(duì)象在其生命周期內(nèi)的狀態(tài)變化。一系列活動(dòng)組成的過(guò)程或工作流。主要元素狀態(tài)、遷移事件、守衛(wèi)、動(dòng)作、初態(tài)、終態(tài)?;顒?dòng)、控制流、決策/合并節(jié)點(diǎn)、分叉/匯合節(jié)點(diǎn)、泳道。時(shí)間維度強(qiáng)調(diào)狀態(tài)在時(shí)間上的持續(xù)性。對(duì)象會(huì)在一個(gè)狀態(tài)停留等待事件。強(qiáng)調(diào)活動(dòng)在時(shí)間上的序列性或并發(fā)性。一個(gè)活動(dòng)完成立即轉(zhuǎn)向下一個(gè)。驅(qū)動(dòng)因素由外部或內(nèi)部事件驅(qū)動(dòng)狀態(tài)遷移。由前一個(gè)活動(dòng)的完成來(lái)驅(qū)動(dòng)控制流前進(jìn)。并發(fā)表示通過(guò)復(fù)合狀態(tài)中的正交區(qū)域來(lái)表示并發(fā)子狀態(tài)。通過(guò)分叉和匯合節(jié)點(diǎn)來(lái)表示并發(fā)的控制流。最佳適用場(chǎng)景建模具有復(fù)雜、清晰狀態(tài)的生命周期對(duì)象。如訂單、工單、用戶賬戶、游戲角色、設(shè)備控制器。建模業(yè)務(wù)流程、用例場(chǎng)景、算法流程或跨組件的協(xié)作流程。如用戶注冊(cè)流程、訂單處理流程、數(shù)據(jù)導(dǎo)出流程。一個(gè)簡(jiǎn)單的記憶口訣狀態(tài)圖看“對(duì)象”活動(dòng)圖看“流程”。4.2 實(shí)戰(zhàn)選型用例子說(shuō)話場(chǎng)景A設(shè)計(jì)一個(gè)“審批請(qǐng)假單”的功能。狀態(tài)圖視角我們會(huì)關(guān)注“請(qǐng)假單”這個(gè)對(duì)象本身。它的狀態(tài)可能是草稿、已提交、部門(mén)經(jīng)理審批中、HR審批中、已批準(zhǔn)、已駁回、已取消。事件包括員工提交、經(jīng)理通過(guò)、經(jīng)理駁回、HR通過(guò)、HR駁回、申請(qǐng)人取消。狀態(tài)圖能清晰地定義從草稿到終態(tài)已批準(zhǔn)或已駁回的所有合法路徑以及每個(gè)狀態(tài)下可以執(zhí)行的操作如只有草稿狀態(tài)才能取消?;顒?dòng)圖視角我們會(huì)關(guān)注“審批流程”這個(gè)動(dòng)作序列。泳道可能包括員工、部門(mén)經(jīng)理、HR?;顒?dòng)包括填寫(xiě)請(qǐng)假單、提交申請(qǐng)、經(jīng)理審核、HR備案、發(fā)送通知?;顒?dòng)圖能展示出串行或并行的審批步驟例如超過(guò)10天的假期可能需要經(jīng)理和HR并行審批以及每個(gè)步驟由誰(shuí)負(fù)責(zé)。如何選如果你需要嚴(yán)格定義請(qǐng)假單的業(yè)務(wù)規(guī)則和生命周期防止出現(xiàn)非法狀態(tài)如“已批準(zhǔn)的請(qǐng)假單又被駁回”用狀態(tài)圖。如果你需要向團(tuán)隊(duì)成員解釋整個(gè)審批過(guò)程是如何一步步進(jìn)行的各個(gè)角色如何配合用活動(dòng)圖。在大型系統(tǒng)中兩者常結(jié)合使用用狀態(tài)圖定義核心領(lǐng)域?qū)ο笳?qǐng)假單的內(nèi)部邏輯用活動(dòng)圖定義跨服務(wù)的業(yè)務(wù)流程。場(chǎng)景B實(shí)現(xiàn)一個(gè)“文件上傳”服務(wù)。狀態(tài)圖視角關(guān)注“上傳任務(wù)”對(duì)象。狀態(tài)等待中、上傳中、校驗(yàn)中、轉(zhuǎn)碼中、已完成、已失敗。事件用戶選擇文件、分片上傳完成、MD5校驗(yàn)通過(guò)、轉(zhuǎn)碼成功、網(wǎng)絡(luò)超時(shí)、校驗(yàn)失敗。狀態(tài)圖非常適合定義任務(wù)的重試邏輯例如在上傳中狀態(tài)遇到網(wǎng)絡(luò)超時(shí)事件可能遷移回等待中狀態(tài)進(jìn)行重試。活動(dòng)圖視角關(guān)注“上傳流程”?;顒?dòng)前端分片、上傳分片至服務(wù)器、服務(wù)器合并文件、計(jì)算文件哈希、與源文件哈希比對(duì)、異步轉(zhuǎn)碼、通知用戶?;顒?dòng)圖可以清晰展示哪些步驟是順序的必須先合并才能計(jì)算哈希哪些是可以并發(fā)的多個(gè)分片同時(shí)上傳以及異常路徑哈希比對(duì)失敗則刪除文件。如何選如果你在設(shè)計(jì)一個(gè)可靠的上傳任務(wù)調(diào)度器需要精確管理每個(gè)任務(wù)的狀態(tài)機(jī)用狀態(tài)圖。如果你在編寫(xiě)上傳服務(wù)的架構(gòu)設(shè)計(jì)文檔需要說(shuō)明各個(gè)微服務(wù)前端、網(wǎng)關(guān)、上傳服務(wù)、校驗(yàn)服務(wù)、轉(zhuǎn)碼服務(wù)如何協(xié)作完成一次上傳用活動(dòng)圖。4.3 我的混合使用策略在實(shí)際項(xiàng)目中我很少孤立地使用某一種圖。它們是一個(gè)工具箱里的不同工具。需求分析階段多用活動(dòng)圖與業(yè)務(wù)方溝通梳理主干和異常流程明確角色職責(zé)。這時(shí)活動(dòng)圖是探索和達(dá)成共識(shí)的工具。領(lǐng)域設(shè)計(jì)階段針對(duì)識(shí)別出來(lái)的核心領(lǐng)域?qū)嶓w如訂單、合同、設(shè)備使用狀態(tài)圖來(lái)精確定義其生命周期和業(yè)務(wù)規(guī)則。這相當(dāng)于為這些實(shí)體編寫(xiě)了一份“憲法”后續(xù)的代碼實(shí)現(xiàn)如使用狀態(tài)模式將直接以此為依據(jù)。系統(tǒng)設(shè)計(jì)階段對(duì)于復(fù)雜的跨服務(wù)流程再次使用活動(dòng)圖但此時(shí)的泳道可能變成了各個(gè)微服務(wù)或子系統(tǒng)活動(dòng)變成了服務(wù)間的API調(diào)用。同時(shí)可以引用狀態(tài)圖來(lái)說(shuō)明關(guān)鍵服務(wù)內(nèi)部的核心狀態(tài)變化。記住沒(méi)有“最好”的圖只有“最合適”的圖。選擇的標(biāo)準(zhǔn)永遠(yuǎn)是你想傳達(dá)什么信息以及給誰(shuí)看。給產(chǎn)品經(jīng)理看業(yè)務(wù)流程用活動(dòng)圖。給后端開(kāi)發(fā)講訂單狀態(tài)機(jī)用狀態(tài)圖。很多時(shí)候把兩者放在同一份設(shè)計(jì)文檔里相互參照能產(chǎn)生一加一大于二的效果。

相關(guān)新聞

5大場(chǎng)景重塑你的思維:為什么你需要一個(gè)真正強(qiáng)大的思維導(dǎo)圖工具?

5大場(chǎng)景重塑你的思維:為什么你需要一個(gè)真正強(qiáng)大的思維導(dǎo)圖工具?

5大場(chǎng)景重塑你的思維:為什么你需要一個(gè)真正強(qiáng)大的思維導(dǎo)圖工具? 【免費(fèi)下載鏈接】mind-map SimpleMindMap(思緒思維導(dǎo)圖):一個(gè)強(qiáng)大的思維導(dǎo)圖。A powerful mind map. 項(xiàng)目地址: https://gitcode.com/GitHub_Trending…

2026/8/2 14:56:17 閱讀更多
REBUILD企業(yè)管理系統(tǒng):零代碼搭建企業(yè)級(jí)應(yīng)用的終極指南

REBUILD企業(yè)管理系統(tǒng):零代碼搭建企業(yè)級(jí)應(yīng)用的終極指南

REBUILD企業(yè)管理系統(tǒng):零代碼搭建企業(yè)級(jí)應(yīng)用的終極指南 【免費(fèi)下載鏈接】rebuild 高度可配置化的企業(yè)管理系統(tǒng)!企業(yè)內(nèi)部可免費(fèi)使用!零代碼/低代碼快速搭建企業(yè)中臺(tái)、CRM客戶關(guān)系管理、WMS庫(kù)存管理、TMS運(yùn)輸管理、SCM供應(yīng)鏈管理、MES/MOM&#…

2026/8/2 14:56:17 閱讀更多
格拉姆角場(chǎng)(GAF)原理與實(shí)戰(zhàn):時(shí)序信號(hào)轉(zhuǎn)圖像用于軸承故障診斷

格拉姆角場(chǎng)(GAF)原理與實(shí)戰(zhàn):時(shí)序信號(hào)轉(zhuǎn)圖像用于軸承故障診斷

1. 項(xiàng)目概述:從時(shí)序信號(hào)到圖像識(shí)別的故障診斷新思路格拉姆角場(chǎng)(Gramian Angular Field, GAF)結(jié)合軸承故障診斷,這個(gè)組合在工業(yè)預(yù)測(cè)性維護(hù)領(lǐng)域已經(jīng)不算新鮮,但對(duì)于剛接觸的同學(xué)來(lái)說(shuō),看到東南大學(xué)…

2026/8/2 14:56:17 閱讀更多
5分鐘掌握My-TODOs:你的跨平臺(tái)桌面任務(wù)管理神器

5分鐘掌握My-TODOs:你的跨平臺(tái)桌面任務(wù)管理神器

5分鐘掌握My-TODOs:你的跨平臺(tái)桌面任務(wù)管理神器 【免費(fèi)下載鏈接】My-TODOs A cross-platform desktop To-Do list. 跨平臺(tái)桌面待辦小工具 項(xiàng)目地址: https://gitcode.com/gh_mirrors/my/My-TODOs 還在為繁雜的待辦事項(xiàng)而煩惱嗎?想要一款既簡(jiǎn)潔又強(qiáng)…

2026/8/2 15:46:23 閱讀更多
告別重復(fù)修復(fù)陷阱:安全搭建Flash運(yùn)行環(huán)境的完整指南

告別重復(fù)修復(fù)陷阱:安全搭建Flash運(yùn)行環(huán)境的完整指南

1. 為什么我們今天還要聊Flash Player? 你可能覺(jué)得這個(gè)話題有點(diǎn)“復(fù)古”。確實(shí),Adobe Flash Player在2020年底就正式停止了支持,主流瀏覽器也早已將其拒之門(mén)外。但現(xiàn)實(shí)情況是,直到今天,我們依然會(huì)時(shí)不時(shí)遇到一些“歷史…

2026/8/2 15:46:23 閱讀更多
Jmeter接口自動(dòng)化全流程:從腳本到持續(xù)集成的工程實(shí)踐

Jmeter接口自動(dòng)化全流程:從腳本到持續(xù)集成的工程實(shí)踐

1. 項(xiàng)目概述:從腳本錄制到自動(dòng)化執(zhí)行的完整閉環(huán)如果你已經(jīng)用Jmeter錄制或編寫(xiě)了一些接口測(cè)試腳本,并且手動(dòng)執(zhí)行了幾輪,那么接下來(lái)最自然的問(wèn)題就是:如何讓這些腳本“自己跑起來(lái)”?這就是接口自動(dòng)化測(cè)試要解決的核心問(wèn)題…

2026/8/2 15:46:23 閱讀更多
終極網(wǎng)盤(pán)直鏈下載助手:無(wú)需客戶端,瀏覽器一鍵獲取九大網(wǎng)盤(pán)真實(shí)下載鏈接

終極網(wǎng)盤(pán)直鏈下載助手:無(wú)需客戶端,瀏覽器一鍵獲取九大網(wǎng)盤(pán)真實(shí)下載鏈接

終極網(wǎng)盤(pán)直鏈下載助手:無(wú)需客戶端,瀏覽器一鍵獲取九大網(wǎng)盤(pán)真實(shí)下載鏈接 【免費(fèi)下載鏈接】Online-disk-direct-link-download-assistant 一個(gè)基于 JavaScript 的網(wǎng)盤(pán)文件下載地址獲取工具。基于【網(wǎng)盤(pán)直鏈下載助手】修改 ,支持 百度網(wǎng)盤(pán) / 阿里…

2026/8/2 15:46:23 閱讀更多
氣體流量計(jì)廠家怎么選?

氣體流量計(jì)廠家怎么選?

工業(yè)氣體計(jì)量廣泛用于壓縮空氣、天然氣、氮?dú)?、蒸汽、煙氣、沼氣等介質(zhì),是空壓能耗統(tǒng)計(jì)、燃?xì)赓Q(mào)易結(jié)算、環(huán)保監(jiān)測(cè)、工藝配氣管控的核心設(shè)備。很多采購(gòu)人員采購(gòu)時(shí)只對(duì)比價(jià)格,忽略廠家研發(fā)實(shí)力、計(jì)量資質(zhì)、工況適配能力,最終出現(xiàn)儀表精度漂移、…

2026/8/2 15:36:22 閱讀更多
MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案 【免費(fèi)下載鏈接】MoneyPrinterPlus AI一鍵批量生成各類短視頻,自動(dòng)批量混剪短視頻,自動(dòng)把視頻發(fā)布到抖音,快手,小紅書(shū),視頻號(hào)上,賺錢(qián)從來(lái)沒(méi)有這么容易過(guò)! 支持本地語(yǔ)音模型chatTTS,fasterwhisper,…

2026/8/2 0:04:00 閱讀更多
3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南 【免費(fèi)下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說(shuō)說(shuō) 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過(guò),那些年發(fā)過(guò)的QQ空間說(shuō)說(shuō),那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案 【免費(fèi)下載鏈接】MoneyPrinterPlus AI一鍵批量生成各類短視頻,自動(dòng)批量混剪短視頻,自動(dòng)把視頻發(fā)布到抖音,快手,小紅書(shū),視頻號(hào)上,賺錢(qián)從來(lái)沒(méi)有這么容易過(guò)! 支持本地語(yǔ)音模型chatTTS,fasterwhisper,…

2026/8/2 0:04:00 閱讀更多
3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南 【免費(fèi)下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說(shuō)說(shuō) 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過(guò),那些年發(fā)過(guò)的QQ空間說(shuō)說(shuō),那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應(yīng)用材料(Applied Materials)公司生產(chǎn)的一款用于半導(dǎo)體設(shè)備的I/O信號(hào)分配電路板。該型號(hào)(0100-02186)的核心特點(diǎn)如下:專用于Endura等半導(dǎo)體工藝腔室。集成信號(hào)路由與分配功能。連接控制…

2026/8/2 2:51:21 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機(jī),適用于自動(dòng)化設(shè)備及通用機(jī)械驅(qū)動(dòng)。該型號(hào)(FFMN-32L-10-T0 40AX)的核心特點(diǎn)如下:三相交流異步電動(dòng)機(jī)。額定…

2026/8/2 2:52:49 閱讀更多