原文鏈接:UML之時序圖——博客園
原文鏈接:UML-順序圖與通信圖——CSDN
原文鏈接:UML 2 順序圖——SPARX
概念
順序圖是按時間順序顯示對象交互的圖。它顯示了參與交互的對象和所交換信息的先后順序,用來表示用例中的行為,並將這些行為建模成信息交換。
- 順序圖是一種交互圖,強調消息的時間順序,亦稱時序圖。
- 順序圖主要包括四個元素:對象、生命線、激活和消息。
- 在UML中,順序圖將交互關系表示為一張二維圖。
- 縱向是代表時間維度,時間向下延伸,按時間依次列出各個對象所發出和接收的消息。
- 水平方向是代表對象的維度,排列着參與交互的各個獨立的對象。
順序圖的三種主要作用:
- 細化用例的表達。使用順序圖的一大用途,就是講用例所描述的需求與功能轉化為更加正式、層次更加分明的細化表達。
- 有效地描述類職責的分配方式。我們可以根據順序圖中各對象之間的交互關系和發送的消息來進一步明確對象所屬類的職責。
- 豐富系統的使用語境的邏輯表達。系統的使用語境即為系統可能的使用方式和使用環境。
組成元素
順序圖的組成元素:對象、生命線、激活、消息。
對象(Object)
順序圖中的對象與對象圖中的概念一樣,都是類的實例。順序圖中的對象可以是系統的參與者或者任何有效的系統對象。
對象的創建由頭符號來表示,即在對象創建點的生命線頂部使用顯示對象名和類名的矩形框來標記。
在位置上,一個被放置於順序圖頂端的對象,意味着在這個交互的開始之前,我們已經擁有這樣一個對象了。如果一個對象出現在其它位置上(不在頂端),則說明這個對象是在交互執行到某些步驟的時候被創建出來的。被創建出來的對象可以在接下來的時間里被其它對象的消息所激活,也可以以同樣的方式被銷毀。
生命線( Life-lin e)
生命線代表了一次交互中的一個參與對象在一段時間內存在。具體地說,在生命線所代表的時間內,對象一直是可以被訪問的——可以隨時發送消息給它。
在順序圖中,生命線位於每個對象的底部中心位置,顯示為一條垂直的虛線,與時間軸平行,帶有一個顯示對象的頭符號。
對於在交互過程中被創建的對象,其生命線從接收到新建對象的消息時開始。對於在交互過程中被銷毀的對象,其生命線在接收到銷毀對象的消息時或在自身最后的返回消息之后結束,同時用一個“X”標記表明生命線的結束。
時間和期限約束
消息默認顯示為水平線。因為生命線顯示為沿屏幕向下的時間通道,所以當給實時系統建模,或是有時間約束的業務過程建模,考慮執行動作所需時間長度是很重要的。因此可以給消息設置一個期限約束,這樣的消息顯示為下斜線。
部分分解
一個對象可以引出多條生命線,使得對象內部和對象之間的消息顯示在同一圖上。
狀態常量 / 延續
狀態常量是生命線的約束,運行時始終為"真"。顯示為兩側半圓的矩形,如下圖:
激活(Focus of control)
激活,又稱為控制焦點,表示一個對象執行一個動作所經歷的時間段,既可以是直接執行,也可以是安排下級過程執行。同時,激活也可以表示對應對象在這段時間內不是空閑的,它正在完成某個任務,或正被占用。
激活在UML中用一個細長的矩形表示,顯示在生命線上。矩形的頂部表示對象所執行動作的開始,底部表示動作的結束。
消息(Message)
面向對象方法中,消息是對象間交互信息的主要方式。 結構化程序設計中,模塊間傳遞信息的方式主要是過程(或函數)調用。 對象A向對象B發送消息,可以簡單地理解為對象A調用對象B的一個操作(operation)。
順序圖中,盡力保持消息的順序是從左到右排列的。 一個順序圖的消息流開始於左上方,消息2的位置比消息1低,這意味着消息2的順序比消息1要遲。因為西方的閱讀習慣是從左到右。 順序圖中消息編號可顯示,也可不顯示。協作圖中必須顯示。
UML三種消息: 調用(Procedure Call) 異步(Asynchronous) 返回(Return)
調用: 發送者把消息發送后,等待直到接收者返回控制,可以表示同步; 實心箭頭符號
異步: 消息發送后,發送者繼續操作,不等待,常用於並發; 線箭頭符號
返回:表示消息的返回。
- 消息上方放置返回值。
- 同步消息的返回可以畫出(如果想明確表達返回值),也可以不畫出,直接隱含。
- 異步消息可以有返回,也可以沒有。(可以響應異步消息,也可以不響應該異步消息。)
- 如果順序圖上顯示有編號,則返回消息的編號和當初發送消息的編號完全一樣。
- 虛線箭頭表示,和依賴關系不要混淆
Rose擴充: 阻止(Balking) 超時(Time-out)
阻止消息:當消息的發送者傳遞消息給接收者,如果接收者無法立即接收,則發送者放棄該消息。
超時消息:若發送消息后接收者無法在指定時間內接收,則發送者放棄該消息。
門
門是連接片段內消息和片段外消息的連接點。 在EA中,門顯示為片段框架上的小正方形。作用為順序圖與頁面外的連接器。 用來表示進來的消息源,或者出去消息的終點。下面兩個圖顯示它們在實踐中的使用。注意:" top level diagram"中的門用消息箭頭指向參考片段,在這里沒有必要把它畫成方塊。
內部通信
內部消息表現為一個操作的遞歸調用,或一個方法調用屬於同一個對象的其他方法。顯示為生命線上執行事件的嵌套控制焦點。
迷路消息和拾取消息
迷路消息是那些發送了卻沒有到達指定接收者,或者到達的接收者不再當前圖中。拾取消息是收到來自那些未知的發送者,或者來自沒有顯示在當前圖的發送者的消息。它們都表明是去往或來自一個終點元素。
順序圖中的結構化控制
在UML 2中,順序圖提供了“片段” 機制,可以通過順序圖來表達更加復雜的動作序列。
可選片段:關鍵字為opt,表示一種單條件分支,為 "switch"(開關) 結構建模。
條件片段:關鍵字為alt,表示一種多條件分支,為 if…then…else 結構建模。
並行片段:關鍵字為par,表示片段內有多個並行子片段的片段,為並發處理建模。
循環片段:關鍵字為loop,表示一個循環,包含一系列被重復的消息。
交互片段:關鍵字為ref,表示對一段交互的引用。
弱順序片段: 關鍵字為seq, 包含了一組消息,這組消息必須在后繼片段開始之前被處理。但不會把片段內消息的先后順序強加到不共享同一條生命線的消息上。
嚴格順序片段: 關鍵字為strict, 包含了一系列需要按照給定順序處理的消息。
非片段: 關鍵字為neg, 包含了一系列不可用的消息。
斷言片段: 關鍵字為assert,標明任何沒有顯示為聲明操作數的順序都是無效的。
順序圖建模技術
按時間順序對控制流建模:
- 設置交互的語境。交互語境即交互所在的環境,包括交互屬於那個系統、子系統,包含哪些類和對象,對應於哪個用例或協作的腳本等。
- 設置交互的場景,即識別對象在交互中扮演的角色,根據對象的重要性排列對象的順序。
- 為對象設置生命線。
- 按時間順序排列消息。
- 設置激活期。
- 附加時間和空間約束。
- 設置前置與后置條件。
建立順序圖的步驟:
- 確定需要建模的工作流
- 從左到右布置對象
- 添加消息和條件以便創建工作流
案例(1)就餐
需求描述如下:客人到餐廳就餐,服務員提供菜單,客人點菜后把菜單交給服務員。服務員向客人確定菜單后,將菜單提交給大堂經理。大堂經理把菜單提交給大廚,大廚完成菜品后傳遞給大堂經理,大堂經理安排服務員傳菜。有的客人可能需要酒水,有的客人不需要酒水。客人結束用餐后,服務員提供賬單,客人結賬。
-
確認對象
-
確定出現順序
-
確定消息
案例(2)ATM機取款
需求描述如下:用戶通過ATM機,插入銀行卡。系統提示輸入密碼,用戶輸入密碼。系統檢查密碼是否正確,密碼正確用戶選擇取款。系統提示輸入取款金額。用戶輸入金額,系統判斷其合法性。在獲取用戶輸入金額后,系統開始事物處理,減少賬戶金額,輸出相應現金。
案例(3)成績查詢
需求描述如下:老師通過學號在系統查詢成績,有存在、不存在兩種情況。存在顯示成績,不存在顯示查無此人。
補充
順序圖的變體——時間圖
時間圖是UML 2中新增加的圖,相當於另一種顯示順序圖的方法。
時間圖與順序圖的主要不同之處有:
- 時間軸與對象軸交換了位置。在時間圖中,縱向表示不同對象,橫向表示時間的延伸。
- 不同對象的生命線在獨立的矩形框中顯示,矩形框縱向堆砌成整個圖。
- 對象可以有不同的狀態。每個對象的狀態在其生命線的最左側縱向排列,生命線通過上下起伏來表示對象當前所處的狀態。
- 可以顯示一個時間標尺。時間標尺上有時間刻度,用來表示時間間隔。
- 不同對象生命線上的時間是同步的。