時序圖是可視化地展示對象與對象之間的聯系的圖,與其他的圖相比,它跟側重於表現為了完成一個用例,對象之間是怎么協同工作的。
之前學習的組件圖、用例圖都能表現對象之間的聯系,側重的是“有哪些聯系”,這是屬於水平維度的展示,而時序圖,它更像一個是從縱向維度用一個個的用例,將各個對象串起來,從而展現出它們之間的聯系,在軟件開發中,有了時序圖,基本上就可以指導軟件開發了。
1、基本元素
a、角色(actor)
角色不一定是人,也可以是組織、模塊或者其他的系統以及子系統,用下圖表示。
創建時序圖的時候,在staruml里的工具欄里是找不到這個圖的,需要在創建的module右鍵,選擇 add,選擇 actor
然后將左鍵長按actor1拖動到繪畫面板里,就可以添加了,不要使用用例圖里的小人,否則無法畫出生命線。
b、對象
(1)對象的命名
對象名稱,包含兩部分:對象名+類名,中間用”:”隔離開來,有三種命名方式;
第一種:對象名+類名,比如說 貓頭鷹:鳥;
第二種:類名,如果在項目中,無需區別具體的對象,可以省略掉對象名,但冒號不能省略,以表示這是一個類名,比如說:鳥;
第三種:對象名,如果項目中無需區別具體的類,可以直接寫對項目名,比如說 貓頭鷹。
(2)命名方式的選擇
命名只要遵循命名規則,選擇最能讓時序圖邏輯清晰地命名方式。
(3)對象的排序
遵循兩個約束:交互頻繁的盡量在一起(減少跨對象連接線的數量),用例發起者要放在最左端(遵循普通人的思維,從左往右)。
c、生命線
從對象上向下延伸的虛線,表示對象存在的時間
d、控制焦點
代表對象活躍的時間區間,所謂活躍,就是該對象在執行內置邏輯,運行代碼,類似於在代碼里表示{},是用一個小矩形表示。
控制焦點可重疊,兩個控制焦點重疊,就相當於{{}}
e、消息
消息分為發送消息和返回消息,發送消息又根據發送形式不同,分為同步消息和異步消息
發送消息類似於代碼中的調用關系,A對象調用B對象,就相當於A對象向B對象發送了調用消息,需要B執行相關邏輯,箭頭指向消息接收方,也就是B
同步消息代表着調用之后,要一直等待,等待消息處理並返回;異步消息則可以馬上回來,去做別的事情,所以如果是同步消息,並且需要畫返回消息,則控制焦點就需要拉長,直到返回消息回來,而異步消息就沒有這個限制
返回消息就是發生調用之后返回的結果,有返回消息,之前必須要有發送消息。
f、自關聯消息
對象內方法調用
g、迷路消息和拾取消息
迷路消息,意思是消息發出去了,沒有被處理或者接受者不在這個系統里,沒有被處理的情況,不存在於函數調用中,存在於消息隊列中,當消息隊列中的消息出列被處理的時候,發現不存在處理者;
拾取消息,意思是來自其他系統的消息。
2、高級元素
高級元素是在時序圖中加入邏輯控制,指示交互執行的條件和方式,總共有13種
着重描述常用的四種
a、抉擇(alt)
抉擇就相當於if else,兩條路只能走一條
在staruml中,所有的高級元素(也稱組合片段)都是通過這個來畫的,通過設置它的屬性來決定畫哪種高級元素
改變交互操作屬性為 alt,此時在圖標中顯示地就是alt
注意:此處的name已經被我刪除掉,所有這里沒有顯示name,在使用的時候,name可以有也可以沒有
雙擊seq,會出現一個黑色小框,點擊它
中間會出現一條黑色的線
在上面的框框任意處雙擊,會出現一個文本框,在文本框里填寫條件
這代表的意思就是 當 a>0的時候,執行第9條命令,否則執行第10條命令
b、選項 (opt)
包含一個可能發生或可能不發生的序列。 可以在臨界中指定序列發生的條件,對應於 switch
畫法與alt畫法類似,只是 交互操作屬性 設置成opt。
c、循環(loop)
相當於 for,while,foreach
無限循環
循環10次
從1循環到10
一直循環,直到當num<0的時候退出
d、退出循環(break)
當滿足條件的時候退出循環(案例圖的意思是 當num等於10的時候執行save命令,並退出循環)
e、 並行執行(par)
代表同時進行,與編碼中的並行概念一致。
3、畫圖思想
第一,划清界限,圖不能呈現太多的重點,所以有些上游的流程和下游的流程,不要畫進去,否則會導致整個圖失去重點,如果確實需要表達一種語境,可以添加ref的高級元素(可以理解為子系統)。
這是成績查詢系統,查詢啊前肯定是要登錄的,但是這張圖的重點是查詢邏輯,登錄的邏輯可以用這個高級元素替代即可。
第二,理清角色和對象,對象一定是名詞,不能是動詞。
注意:StarUML 刪除的時候一定要用 Ctrl+delete,直接delete是刪不掉的,只是不可見,它還是會占用位置!
本文學習文章:http://www.woshipm.com/ucd/607593.html
https://www.jianshu.com/p/e8a53300aa79
https://sparxsystems.cn/resources/uml2_tutorial/uml2_sequencediagram.html
疑問:一個對象引出多個生命線,這個還不知道怎么畫
類似於此(來自 https://sparxsystems.cn/resources/uml2_tutorial/uml2_sequencediagram.html)