Java 建模: UML 工作簿, 第 2部分――序列圖中的條件邏輯
Granville 繼續(xù)討論“統(tǒng)一建模語言”和序列圖的繪制。他仔細(xì)研究了序列圖繪制過程中條件邏輯的角色,并討論了為什么要在圖中包含或排除條件和循環(huán)。Granville 還描述了序列圖的兩種形態(tài) -- 常規(guī)和實(shí)例 -- 并說明了它們?cè)陂_發(fā)周期中各自的應(yīng)用。
我在 介紹性專欄中曾經(jīng)解釋過,序列圖用于描述系統(tǒng)隨時(shí)間而產(chǎn)生的內(nèi)部行為。因?yàn)橄到y(tǒng)行為是對(duì)象相互之間發(fā)送消息的結(jié)果,因此序列圖繪制了那些消息在對(duì)象之間移動(dòng)時(shí)的路線。 歸根結(jié)底,序列圖就是交互圖。在前一部分中,盡管我們描述了無數(shù)交互,但只創(chuàng)建了一個(gè)相當(dāng)簡(jiǎn)單的圖。這次,我們將做進(jìn)一步的研究,看看 UML 指定的序列圖的兩種形態(tài)。這兩種形態(tài)是 常規(guī)和 實(shí)例。讓我們從每種形態(tài)的正確應(yīng)用開始。
序列圖用于描述對(duì)象之間兩種不同類型的交互。一種交互類型是 必須 (must) 交互,其中對(duì)象 A 必須向?qū)ο?B 發(fā)送特定消息。另一種交互類型是 可能 (may) 交互,其中對(duì)象 A 可能(但不一定)向?qū)ο?B 發(fā)送特定消息。這兩種形態(tài)的序列圖描述了這兩種不同類型的交互。常規(guī)形態(tài)描述的是 必須交互,而實(shí)例形態(tài)則描述了 可能交互。
常規(guī)形態(tài)的序列圖描述初始刺激因素所產(chǎn)生的類交互。常規(guī)形態(tài)則記述了初始刺激因素能夠產(chǎn)生的一切交互。成功和失敗條件與循環(huán)、條件和分支一樣,都是這種圖的組成部分。
常規(guī)序列圖在水平軸方向上的每個(gè)框中只包含一個(gè)類名,如圖 1 所示。它的含義是,交互背后的對(duì)象是匿名的,該類的任何對(duì)象都可以參與到交互中。因此,必須為所有路徑明確建模。在常規(guī)序列圖中,對(duì)象 A 必須向?qū)ο?B 發(fā)送模型中的一條消息。
圖 1. 常規(guī)序列圖

序列圖的第二種形態(tài)是實(shí)例形態(tài)。實(shí)例序列圖描述了兩個(gè)實(shí)例之間可能發(fā)生的單一消息交換。這樣的圖將在水平軸方向的框中包含一個(gè)變量名及其類類型,如圖 2 所示。這種形態(tài)不包括常規(guī)形態(tài)中常見的循環(huán)、條件和分支。在系統(tǒng)中實(shí)際的控制流程中,在交互過程中所進(jìn)行的某些斷言可能為假。如果發(fā)現(xiàn)斷言為假,實(shí)例序列圖中的所有消息都為空,這種情形將不出現(xiàn)。實(shí)例序列圖描述了可能發(fā)生也可能不發(fā)生的單一情形。
圖 2. 實(shí)例序列圖

實(shí)例序列圖最適合于在軟件開發(fā)生命周期的分析階段對(duì)個(gè)別方案建模。常規(guī)序列圖可以為包含多個(gè)方案的整個(gè)用例建模。其它一些類型的活動(dòng) -- 例如為子系統(tǒng)或框架與其各個(gè)部分之間使用的協(xié)議建模 -- 可以使用任何一種形態(tài),這取決于組件在軟件開發(fā)生命周期中所處的位置。與實(shí)例形態(tài)相比,常規(guī)形態(tài)更接近于在最終產(chǎn)品中出現(xiàn)的實(shí)際代碼。
我們?cè)谇耙粚谥惺褂玫氖浅R?guī)形態(tài),并將在此繼續(xù)研究這種形態(tài)。這一次,我們將探究條件邏輯在常規(guī)序列圖中所扮演的角色,通過它來讓您了解有關(guān) UML 表示的更多知識(shí)。
![]() |
|
常 規(guī)序列圖利用了條件邏輯,這對(duì)于描述交互過程中事件的可選流程來說很有用處。根據(jù)軟件開發(fā)生命周期中所處的不同階段,可以繪制詳略度不同的圖。在分析階 段,您可能愿意將詳細(xì)信息排除在條件表達(dá)式以外,而在設(shè)計(jì)階段,您卻可能希望將最終產(chǎn)品中要使用的代碼的片段包括在條件表達(dá)式中。
無論處于開發(fā)周期中的哪個(gè)階段,隨著條件表達(dá)式圖的繪制,序列圖與如 Java 語言這樣的面向?qū)ο笳Z言之間那種自然的一致性就愈發(fā)清楚了。例如,請(qǐng)考慮一個(gè)允許出納員接受存款的銀行業(yè)務(wù)應(yīng)用。除了其它一些事項(xiàng)以外,還規(guī)定了系統(tǒng)必須防止出納員把負(fù)的金額記入帳戶貸方,因?yàn)檫@會(huì)導(dǎo)致從帳戶中扣除。因此系統(tǒng)必須有一種檢查鍵入的所有金額均為正數(shù)的機(jī)制。 清單 1 顯示了確保存款為正數(shù)的條件表達(dá)式。
清單 1. 帶有條件表達(dá)式的方法
|
在分析階段,您不是很關(guān)心細(xì)節(jié),因此圖只需要表明存款為正數(shù)。在常規(guī)序列圖中,條件作為帶有消息名的保護(hù)機(jī)制出現(xiàn),位于水平調(diào)用箭頭上方。這些保護(hù)條件用方括號(hào)括起,放在消息名的左側(cè),如圖 3 所示。
圖 3. 在分析期間添加的條件

上述方法和序列圖之間的關(guān)系在圖 4 中顯現(xiàn)得更為清楚,我們?cè)趫D 4 中看到了在設(shè)計(jì)階段可能用到的更明確的圖。當(dāng)然沒有顯示全部方法:缺少了 else 子句。不過,圖中消息箭頭的語義規(guī)定只能在條件有效時(shí)發(fā)送消息。
圖 4. 更明確的條件

可以通過在
Teller
類和
ImproperDepositException
之間添加另一個(gè)調(diào)用箭頭來為
else 子句建模。在這個(gè)調(diào)用上會(huì)有一個(gè)與 if
相反的條件;在本例中,即存款必須小于等于
0。您不妨自己嘗試為這個(gè)語句建模。
![]() |
|
如上例所示,常規(guī)序列圖 -- 以及實(shí)際上所有 UML 圖 -- 幾乎映射了 Java
語言的語法。所以,大多數(shù) Java
開發(fā)者對(duì)這些圖都有一個(gè)直觀的理解,并且可以很快地學(xué)會(huì)如何使用它們。為進(jìn)一步探討常規(guī)序列圖和
Java 語言之間的一致性,我們將繪制
for
循環(huán)圖,如清單 2
所示。
清單 2. for 循環(huán)
|
在序列圖中,迭代是通過水平箭頭上消息名之前的星號(hào) (*)
來表示的。如果迭代的次數(shù)已知并且固定 -- 這種情況非常少見 --
這個(gè)數(shù)字出現(xiàn)在星號(hào)后面的方括號(hào)中。因?yàn)榇蠖鄶?shù)
for
循環(huán)處理的復(fù)雜邏輯不允許靜態(tài)地確定迭代次數(shù),因此您不會(huì)經(jīng)常使用這種格式的括號(hào)表示。圖
5 顯示了上述
for
循環(huán)的序列圖。
圖 5. for 循環(huán)序列圖

![]() |
|
因?yàn)?
while
循環(huán)將循環(huán)與條件結(jié)合起來,因此它是個(gè)非常容易接受的示例。我們將對(duì)清單
3 中顯示的
while
循環(huán)繪制圖。
清單 3. while 循環(huán)
|
我們的
while
循環(huán)圖既包含條件,又包含表明迭代的星號(hào),但您會(huì)發(fā)現(xiàn),沒有迭代的次數(shù)。
while
循環(huán)很少包含迭代次數(shù) -- 除非它是一個(gè)偽裝的
for
循環(huán)。圖 6 顯示了
while
循環(huán)圖。
圖 6. while 循環(huán)序列圖

![]() |
|
一般來說, 必須和 可能行為是 UML 和軟件開發(fā)的基本概念。用例捕捉 必須行為;方案捕捉 可能行為。 類圖捕捉 必須行為;實(shí)例圖捕捉 可能行為。 我主要討論這一概念是因?yàn)槲野l(fā)現(xiàn)許多人沒能掌握序列圖的根本靈活性,而分化成直覺和形態(tài)使用這兩個(gè)極端。
在閱讀這些文章時(shí),您應(yīng)該把精力集中在發(fā)展模型語義的直觀理解上。 隨著看到越來越多的序列圖并開始創(chuàng)建自己的序列圖,您會(huì)發(fā)現(xiàn)許多序列圖依賴于條件邏輯和圖表上下文來說明圖所表示的是 必須還是 可能的系統(tǒng)視圖。隨著我們深入到更加復(fù)雜的圖表繪制技術(shù),及早學(xué)習(xí)如何識(shí)別和使用這種差別將對(duì)您今后有所幫助。
除了探討序列圖繪制中
必須和
可能行為的重要性以外,我還向您介紹了如何在圖中表示條件和迭代。既然您已經(jīng)知道如何繪制
for
和
while
循環(huán)圖,我建議您在其它 Java
構(gòu)造(例如
do-while
循環(huán))上實(shí)踐一下建模表示。隨著您自己練習(xí)繪制這些簡(jiǎn)單構(gòu)造圖,自然會(huì)逐漸加深對(duì)序列圖繪制的理解。
![]() |
|
- 您可以參閱本文在 developerWorks 全球站點(diǎn)上的
英文原文.
- 通過單擊本文頂部或底部的
討論來參與有關(guān)該文章的
討論論壇。
- 有關(guān)“統(tǒng)一建模語言”和序列圖繪制的介紹,請(qǐng)參閱
本系列的第一個(gè)專欄。
- 要了解有關(guān) UML 和序列圖繪制的詳細(xì)信息,請(qǐng)仔細(xì)查看 Hans-Erik
Eriksson 和 Magnus Penker 的
UML
Toolkit
(John Wiley & Sons, 1997)。
- 另一個(gè)非常有幫助的資源是
UML in a Nutshell
,由 Sinan Si Alhir 著 (O'Reilly &
Associates, 1998)。
- “UML 標(biāo)準(zhǔn)”的權(quán)威來源是 OMG 的
統(tǒng)一建模語言規(guī)范
(Unified Modeling Language Specification)(在本文寫作時(shí)是版本
1.4)。
- 有關(guān)序列圖和 UML 的其它信息,請(qǐng)參閱 "
建立帶有樣式的
UML 序列圖",由 Scott W. Ambler 著(developerWorks,2001 年 2
月)。
- Allen Holub 在他有關(guān)面向?qū)ο笤O(shè)計(jì)過程的系列中提供了
用例方案的深入說明(developerWorks,2001 年 1 月)。
- 閱讀
OCL,它是 UML 的表達(dá)式語言。
- IBM 和其它一些業(yè)界領(lǐng)先者創(chuàng)建了
XMI,一種新的開放業(yè)界標(biāo)準(zhǔn),它將一些基于 Web
的用于定義、確認(rèn)和共享文檔格式等 XML 標(biāo)準(zhǔn)的優(yōu)點(diǎn)和 UML
的優(yōu)點(diǎn)結(jié)合了起來。
![]() |
|
![]() | |
Granville
加入面向?qū)ο笊鐓^(qū)已有 13 年了。他是
高級(jí)用例建模 (Advanced Use
Case
Modeling)系列的合著者,并在全世界范圍的各種面向?qū)ο蠹夹g(shù)會(huì)議中介紹過教程。他的面向?qū)ο箝_發(fā)的實(shí)踐方法來自于他在多家公司供職的經(jīng)驗(yàn),其中包括從處于創(chuàng)業(yè)階段的公司到相當(dāng)成熟的軟件業(yè)巨擘在內(nèi)的各種公司。
|
posted on 2006-02-18 15:07 Vincent.Chen 閱讀(104) 評(píng)論(0) 編輯 收藏