Vincent.Chan‘s Blog

          常用鏈接

          統(tǒng)計

          積分與排名

          網(wǎng)站

          最新評論

          Java 建模: UML 工作簿,第 1 部分――序列圖簡介



          級別: 初級

          Granville Miller, 顧問, TogetherSoft

          2001 年 5 月 15 日

          Granville Miller 在其新專欄的第一部分中介紹了“統(tǒng)一建模語言”(UML) 的一個構(gòu)件:序列圖。在整個設(shè)計過程中都會用到序列圖,此圖用于演示系統(tǒng)執(zhí)行時參與者與對象之間的內(nèi)部交互。讓我們跟著 Granville 一起創(chuàng)建其中一個圖,我們將使用一個貸款處理應(yīng)用程序作為示例。

          統(tǒng)一建模語言 (UML) 是用于建立面向?qū)ο笙到y(tǒng)模型的標(biāo)準(zhǔn)標(biāo)記法。在 1995 到 1997 年之間,UML 登上了面向?qū)ο缶幊躺鐓^(qū)的舞臺,而且在 1997 年后期受到了對象管理組織 (OMG) 的認(rèn)可。雖然它最初頗受爭議 -- 因為它是在一片支持和反對聲中提出的 -- 但 UML 以后卻成為系統(tǒng)標(biāo)記法的行業(yè)標(biāo)準(zhǔn)。UML 的當(dāng)前版本是 1.4,而且它將不斷發(fā)展以滿足面向?qū)ο箝_發(fā)人員的需要。(有關(guān) UML 歷史的詳細(xì)信息,請參閱 參考資料。)

          UML 可能難以學(xué)習(xí),主要因為它試圖為相當(dāng)廣泛的情況提供建模標(biāo)記法。每種建模標(biāo)記法都采用一種圖,而目前在 UML 規(guī)范中有九種圖。幸好,學(xué)習(xí) UML 可以是一個漸進(jìn)過程;每次可以只學(xué)習(xí)一種圖,首次試用時不必包含圖中非常復(fù)雜的東西。

          在本專欄中,我將教您逐步學(xué)習(xí)基于 Java 應(yīng)用程序開發(fā)的 UML 設(shè)計和標(biāo)記法。我將以邏輯(可能是另人愉快的)方式介紹 UML 框架和其它建模技術(shù)的基礎(chǔ)知識,您將通過建立現(xiàn)實示例的模型來學(xué)習(xí)實際操作。在第一部分中,我們使用貸款處理應(yīng)用程序作為示例,從建立序列圖開始。請注意,假設(shè)您熟悉 Java 語言,而且掌握了面向?qū)ο蠓椒ê托g(shù)語的基礎(chǔ)知識。本專欄將簡要說明面向?qū)ο蟮母拍?,但不會進(jìn)行深入討論。

          關(guān)于序列圖

          關(guān)于參與者角色

          參與者角色有助于發(fā)現(xiàn)和標(biāo)識可以參與到用例方案中的參與者。一個參與者在一個用例和多個用例中可以有多個角色。目前,已經(jīng)將四種不同的參與者角色標(biāo)識成 UML 的增強或傳統(tǒng)角色:啟動程序、服務(wù)器、接收方和代理。因為可以在序列圖中反映參與者角色,所以您應(yīng)該熟悉它們的功能。

          • 啟動程序是設(shè)置行動中某個系統(tǒng)行為的外部實體。啟動程序可以請求服務(wù)或生成事件。在顯示參與者的序列圖中,啟動程序啟動了行動中的序列。
          • 外部 服務(wù)器角色為其它角色提供服務(wù)。服務(wù)器通過在外部提供功能或信息來幫助系統(tǒng)實現(xiàn)其目標(biāo)。許多包含了操作系統(tǒng)的外部系統(tǒng)都是服務(wù)器角色。服務(wù)器會接收消息,但也許不會生成消息。
          • 接收方角色接收來自系統(tǒng)的信息。它們以消極方式提供服務(wù)。因此,它們可能不會向系統(tǒng)提供值,但會想其它參與者提供值。接收方的一個示例就是數(shù)據(jù)倉庫或外部備份系統(tǒng)。接收方通常接收來自系統(tǒng)中對象的消息,但一般不會生成消息。
          • 代理是代表另一個參與者執(zhí)行操作的參與者。代理的一個示例就是代表顧客租借錄影帶的音像店職員。

          UML 沒有排斥任何特殊的軟件開發(fā)方法或過程;它只不過標(biāo)準(zhǔn)化了標(biāo)記法的格式。然而,許多開發(fā)方法都合并了 UML。Rational 統(tǒng)一過程 (RUP) 就是這樣一種方法;另一種方法是功能驅(qū)動的開發(fā) (FDD)。由于其直觀性和通用性,UML 序列圖已成為這些過程的前端建模活動的一部分。序列圖用于建立以下內(nèi)容的模型:

          • 用例方案
          • 框架中的協(xié)議
          • 子系統(tǒng)
          • 方法邏輯

          以下是上述每個功能的簡要說明。

          用例方案
          對于示例應(yīng)用程序,我們將使用序列圖來建立單個用例方案的模型。用例是由參與者與應(yīng)用程序交互為實現(xiàn)某個指定目標(biāo)而執(zhí)行的單個任務(wù)。參與者可以是與應(yīng)用程序交互、在應(yīng)用程序外部的任何最終用戶、組織或系統(tǒng)。(要了解四種參與者角色,請參閱 關(guān)于參與者角色;如需關(guān)于用例方案的深入討論,請參閱 參考資料。)

          框架中的協(xié)議
          協(xié)議位于框架及其稱作 集合體的可交換組件之間。了解框架必需的交互有助于開發(fā)新的集合體。序列圖通常用于記錄這些交互。

          子系統(tǒng)
          大的項目被分解成更小且易管理的部分,稱作 子系統(tǒng)。子系統(tǒng)之間的接口關(guān)于將它們集成成為更大的整體(即,系統(tǒng))是至關(guān)重要的。序列圖用于指定子系統(tǒng)邊界上的類之間的交互。


          某些類(如 SocketInetAddress )需要一個復(fù)雜的方法調(diào)用序列,以便正確交互。這些序列組成了用于與這樣的某個類或一組類交互的協(xié)議。序列圖可用于描述類或一組相互作用的類的使用,因而描述了交互所需的協(xié)議。

          方法邏輯 序列圖在記錄方法邏輯方面非常優(yōu)秀。實際上,只要給出了 Java 方法,某些 CASE 工具會自動生成一個序列圖。序列圖可用于設(shè)計未來方法或記錄現(xiàn)有方法的流程。



          回頁首


          關(guān)于示例應(yīng)用程序

          我們將在示例貸款處理應(yīng)用程序的幫助下學(xué)習(xí)序列圖。因為本專欄的重點在于建模,而不是方法,我們要直接討論建立圖,所以我們不會注重于應(yīng)用程序的細(xì)節(jié)。我們?yōu)橘J款處理應(yīng)用程序繪制的基本功能如下:

          用例:提交貸款請求

          1. 申請人通過因特網(wǎng)完成并向銀行提交貸款申請。
          2. 系統(tǒng)確認(rèn)貸款申請的信息,檢查它是否正確以及信息是否盡可能完整。
          3. 系統(tǒng)向外部商業(yè)資信咨詢機構(gòu)轉(zhuǎn)發(fā)貸款請求,以獲取該申請人的信用報告。
          4. 系統(tǒng)根據(jù)所返回的信用報告計算申請人的信用積分。


          回頁首


          入門

          創(chuàng)建序列圖的第一步是確定該圖是否表示與外部或內(nèi)部實體的交互。如果正在建立用例方案的模型,那么序列圖通常表示與外部實體的交互。如果正在建立框架中協(xié) 議的模型,那么此圖也許表示內(nèi)部或外部交互。子系統(tǒng)圖、類圖和個別方法邏輯圖通常只表示內(nèi)部實體。無論是哪種情況,將要建模的交互類型決定了序列圖中的第 一個(最左邊的)元素。

          與外部實體的交互表示參與者是交互的一部分。內(nèi)部交互可能由參與者啟動(如果子系統(tǒng)用例是交互的基礎(chǔ)),但它更可能是由叫作 Sender 的普通類啟動的。如果參與者啟動了交互,那么參與者將歸入啟動程序類別,這是四種常見參與者角色之一(有關(guān)詳細(xì)信息,請參閱 關(guān)于參與者角色)。

          我們將關(guān)注為貸款處理應(yīng)用程序(以上概述的 提交貸款請求用例)的方案建立圖。請注意當(dāng)申請人完成在線貸款申請并在因特網(wǎng)上提交它時序列圖的變化。在這個方案中,申請人在系統(tǒng)外部,因此用參與者來表示他。我們首先將參與者 Applicant 添加到序列圖,如圖 1 所示。


          圖 1. 添加申請人

          添加參與者
          一旦交互的啟動程序就位,下一步就是添加它在方案的過程中將與之交互的對象。這些對象的名稱應(yīng)該反映出類或?qū)嵗男袨?。(類或?qū)嵗倪x擇給出了與序列圖截然不同的含義,但我將把這兩者之間差異保留到下次討論。)

          對于示例方案,我們將添加兩個類: LoanApplicationLoanRequest 。當(dāng)申請貸款時,需要提交貸款申請。它包含了關(guān)于申請人和期望貸款金額的信息。貸款請求是銀行向商業(yè)資信咨詢機構(gòu)發(fā)送的關(guān)于接受貸款申請的表單。它包含了來自貸款申請的一些信息,以及獲取關(guān)于申請人的信用歷史記錄信息的請求。圖 2 中顯示了將這兩個類添加到序列圖中。


          圖 2. 添加兩個交互類

          連接各點 -- 虛線
          對于大多數(shù)軟件開發(fā)人員來說,序列圖是直觀的。它們將對象和參與者(橫軸)映射到時間(縱軸)。消息連接了對象,當(dāng)消息發(fā)生時,它們沿著縱軸從一個對象移動到另一個對象。這些消息被連接到從對象或參與者底部的中間延伸出的豎直虛線。這條線被稱作 生命線。

          在橫軸上,我們用被稱作 調(diào)用箭頭消息箭頭的 箭頭來表示消息。消息箭頭從發(fā)送方(尾)指向接收方(頭)。這些箭頭用于捕捉系統(tǒng)的動態(tài)行為。調(diào)用通常始于左邊,向右邊移動。即,交互中的初始箭頭通常來 自左邊。當(dāng)創(chuàng)建類的新實例時,我們繪制的箭頭都指向類自身,而不是生命線。我們方案中的第一步是創(chuàng)建新的貸款申請,因此我們在 ApplicantLoanApplication 之間畫出箭頭。由于用 Java 創(chuàng)建新實例涉及到調(diào)用構(gòu)造器,因此我們將這個箭頭標(biāo)上構(gòu)造器名稱,可能的話,還要標(biāo)上變量。

          我們?nèi)蕴幱谲浖_發(fā)生命周期中的分析階段,因此我們要僅可能多地包含分析信息。我們的一個商務(wù)分析員提到我們把創(chuàng)建新貸款申請的操作稱作“完成貸款申請”。如果我們要在構(gòu)造過程中使這個序列圖保持為真,那么可以將 complete 實現(xiàn)成公用方法,它將調(diào)用 LoanApplication 構(gòu)造器,如圖 3 所示。


          圖 3. 創(chuàng)建 LoanApplication

          建立某個活動的圖
          但類或?qū)嵗邮盏较r,它會在接收對象的生命線上創(chuàng)建一個框;這個框稱作 活動?;顒颖硎窘邮辗降姆椒ㄖ械目刂茩?quán)流向。當(dāng)消息導(dǎo)致創(chuàng)建了一個對象時,第一個活動表示構(gòu)造器的邏輯。隨后的消息將導(dǎo)致創(chuàng)建新的活動。

          但接收到消息時,接收對象可以依次將消息發(fā)送到它自身或其它對象。這由箭頭的尾巴顯示,它表示箭頭源于活動,而終止于新的活動。但對象調(diào)用自身時,新的活動將放到舊活動之上。

          在此方案中,申請人與貸款申請交互兩次,第一次是完成它,而第二次是提交它。當(dāng) LoanApplication 接收到 submit 消息時,它會通過將 validate 消息發(fā)送到自身來驗證它自己。如果有效,則它會創(chuàng)建要發(fā)送到商業(yè)資信咨詢機構(gòu)的新 LoanRequest 。圖 4 顯示了 LoanApplication 的驗證過程。


          圖 4. 確認(rèn) LoanApplication

          箭頭文件:表示時間流逝
          我們使用斜向箭頭來表示消息發(fā)送和接收之間的真實時間的流逝。這種標(biāo)記法用于顯示非基本調(diào)用。非基本調(diào)用的示例是經(jīng)由 CORBA 或 RMI 進(jìn)行的方法調(diào)用,或是在網(wǎng)絡(luò)上發(fā)送的消息。

          在此示例中,商業(yè)資信咨詢機構(gòu)是一個外部系統(tǒng),它是具有服務(wù)器角色的參與者(有關(guān)詳細(xì)信息,請參閱 關(guān)于參與者角色)。 服務(wù)器通常不生成消息,但會有發(fā)送給它們的消息 -- 在本例中是由信用檢查器發(fā)送的信用報告的請求。信用檢查器代表了商業(yè)資信咨詢機構(gòu)。它跟蹤請求并將請求轉(zhuǎn)發(fā)給商業(yè)資信咨詢機構(gòu),跟蹤并接收響應(yīng),此外就是 建立貸款處理應(yīng)用程序和商業(yè)資信咨詢機構(gòu)之間的連接。商業(yè)資信咨詢機構(gòu)將接收請求,并根據(jù)它自己的時間表處理請求。我們使用斜向箭頭表示這段時間的流逝, 如以下的圖 5 所示。

          在活動的結(jié)尾,返回到調(diào)用程序的結(jié)果是隱式的。然而,在某些情況下,您可能希望返回是顯式的。顯式返回調(diào)用由虛線箭頭表示,該箭頭的尾巴是接收方,頭是發(fā)送方。顯式返回箭頭通常由調(diào)用返回的值標(biāo)記。對于此示例,我們已經(jīng)在 CreditBureauCreditChecker 之間添加了顯式箭頭。這個箭頭可以是帶標(biāo)簽的 CreditReport ,因為它是從 requestCreditReport 方法返回的對象。


          圖 5. 獲取 CreditReport

          下一步
          我在本文開頭已經(jīng)提到過,序列圖用于描述系統(tǒng)運行時的內(nèi)部行為。在本文中,我已經(jīng)介紹了通過建立對象間交互的模型來構(gòu)建序列圖的第一步。在下一部分中,我將介紹兩種序列圖(常規(guī)和實例),并使用根據(jù)簡單的 Java 方法繪制的示例說明條件邏輯在序列圖中的角色。到時候見!



          回頁首


          參考資料

          • 您可以參閱本文在 developerWorks 全球站點上的 英文原文.

          • 單擊本文頂部或底部的 “討論”參加關(guān)于本文的 討論論壇。


          • Martin Fowler( UML Distilled 的作者)提供了 UML 早期歷史的 內(nèi)幕。


          • Fowler 的“ 為什么使用 UML”進(jìn)一步說明了開發(fā)周期中對標(biāo)準(zhǔn)化標(biāo)記法的需要(Software Development Online,2000 年 3 月)。


          • 如果您想要認(rèn)真學(xué)習(xí) UML,那么應(yīng)該從三個朋友(Booch、Jacobson、Rumbaugh)撰寫的原文開始: 統(tǒng)一建模語言用戶指南 (Addison Wesley Object Technology Series,1998)。


          • 接下來應(yīng)該學(xué)習(xí)的基本讀物是 OMG 的 統(tǒng)一建模語言規(guī)范(2001 年 2 月時的版本是版本 1.4)。


          • Rational 的 UML 資源頁面提供了關(guān)于 UML、RUP 的信息以及其它內(nèi)容。


          • 有關(guān)序列圖和 UML 的額外信息,請參閱 " 建立帶有樣式的 UML 序列圖",由 Scott W. Ambler 著(developerWorks,2001 年 2 月)。


          • Allen Holub 在他有關(guān)面向?qū)ο笤O(shè)計過程的系列中提供了 用例方案的深入說明(developerWorks,2001 年 1 月)。


          • 如果要更深入地研究用例建模,請參閱 Frank Armour 和 Granville Miller 合著的 " Advanced Use Case Modeling, Volume I: Software Systems"(Addison-Wesley,2001)。


          • 如需關(guān)于功能驅(qū)動的開發(fā)和 Rational 統(tǒng)一過程的優(yōu)秀讀物,請參閱 Peter Coad、Eric Lefebvre、Jeff DeLuca 合著的 Java Modeling in Color with UML (Prentice Hall,1999)。


          • 關(guān)于 RUP 的另一本好書是 Philippe Kruchten 撰寫的 The Rational Unified Process: An Introduction (Addison Wesley,2000)。


          • 請閱讀 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)點和 UML 的優(yōu)點結(jié)合了起來。



          回頁首


          關(guān)于作者


          Granville 加入面向?qū)ο笊鐓^(qū)已有 13 年了。他是 高級用例建模 (Advanced Use Case Modeling) 系列的合著者,并在全世界范圍的各種面向?qū)ο蠹夹g(shù)會議中介紹過教程。他的面向?qū)ο箝_發(fā)的實踐方法來自于他在多家公司供職的經(jīng)驗,其中包括從處于創(chuàng)業(yè)階段的公司到相當(dāng)成熟的軟件業(yè)巨擘在內(nèi)的各種公司。 他目前正在教授有關(guān)靈活過程、方法和 Java 技術(shù)的研習(xí)班、教程和課程,同時還在輔導(dǎo)和幫助實現(xiàn)一些積極的項目??梢酝ㄟ^ rmiller@togethersoft.com 與 Granville 聯(lián)系。


          posted on 2006-02-18 15:07 Vincent.Chen 閱讀(137) 評論(0)  編輯  收藏 所屬分類: Java

          主站蜘蛛池模板: 和顺县| 鄯善县| 贵南县| 南川市| 曲周县| 苏尼特右旗| 肥城市| 郓城县| 崇礼县| 原阳县| 北京市| 兴山县| 偏关县| 桂林市| 宕昌县| 社会| 高阳县| 宁化县| 平顶山市| 永安市| 怀仁县| 清流县| 开鲁县| 镇江市| 大同市| 关岭| 榆中县| 德钦县| 西平县| 苏州市| 白朗县| 泰和县| 澎湖县| 龙川县| 洛阳市| 沁水县| 潮安县| 新源县| 延津县| 临湘市| 南部县|