在
前面的文章中,我們從Rational Rose開(kāi)始,啟動(dòng)并建立了一個(gè)類(lèi)圖。今天我們的任務(wù)就是要通過(guò)BankAPP實(shí)例來(lái)了解如何用Rose構造業(yè)務(wù)模型。
業(yè)務(wù)企業(yè)模型
業(yè)務(wù)前景,目標,組織-分別提供
業(yè)務(wù)事件[UML信號事件-指定的激勵表格或文檔]和過(guò)程(UML 用例)
過(guò)程名 參與者 事件/輸入 轉換 事件/輸出 約束 描述 引用 聯(lián)系點(diǎn)
WithdrawFromAccount Customer,Teller,BankDB WithdrawRequest UpdateAccount WithdrawRecord
[譯注:Customer:客戶(hù);Teller:出納員 ;withdraw:取款;account:賬戶(hù);BankDB:銀行數據庫]
Business Actors, Business Workers,業(yè)務(wù)實(shí)體(問(wèn)題域實(shí)體)
業(yè)務(wù)參與者(UML 參與者) 業(yè)務(wù)員(UML 參與者) 業(yè)務(wù)實(shí)體(UML 類(lèi))
Customer Teller Account,SavingsAccount,CheckingAccount
[譯注:saving:儲蓄;checking:支票]
業(yè)務(wù)規則目錄
規則標識符 參與者,實(shí)體,過(guò)程 描述:IF條件..then 動(dòng)作 區域 引用 聯(lián)系點(diǎn)(Point of Contact)
ValidAccount Account If AccountNum 有效,then Acccount 有效
業(yè)務(wù)接口(指定操作集)-由架構師提供
業(yè)務(wù)模式目錄-參見(jiàn)《Business Modeling with UML》(Eriksson 和Penker 著(zhù))。
業(yè)務(wù)術(shù)語(yǔ)-待完備
業(yè)務(wù)系統體系結構-由架構師提供
需求模型
需求:BankApp應該管理支票和存款賬戶(hù)的存款和取款。將來(lái)(還要提供)查詢(xún),轉賬,透支,等等從TellerGUI 到BankApp的輸入/輸出: sAcctNum, nDeposit, nWithdraw,sText。從BankApp 到BankDB的輸入/輸出: sAcctNum, nDeposit, nWithdraw.
需求可追蹤性表:需求號,名稱(chēng),引用,用例名,UML元素,測試用例,描述,職責。
需求可追蹤性表(部分)
需求編號 需求名 引用 用例名 UML元素 測試實(shí)例 描述 職責
1.1 DepositToSavingsAccount DepositToSavingsAccount BankPkg
1.2 DepositToCheckingAccount DepositToCheckingAccount BankPkg
1.3 WithdrawFromSavingAccount WithdrawFromSavingAccount BankPkg
1.4 WithdrawFromCheckingAccount WithdrawFromCheckingAccount BankPkg
需求-用例圖-所有用例
Rose用例圖:在瀏覽器窗口,選擇Use Case View;Main Use CaseDiagram;在圖上放置參與者,用例,關(guān)系[Rose單向關(guān)聯(lián)(Unidirectional Association)],泛化;選擇每一個(gè)參與者-單擊鼠標右鍵鍵入參與者的操作;選擇Tools-Check Model;選擇File-Save.
需求-高級別協(xié)作圖[環(huán)境圖(Context Diagram)]
Rose高級別協(xié)作圖:在瀏覽器窗口,選擇Use Case View;選擇Browse-Interaction Diagram(交互圖)-Use Case View- ;選擇Collaboration Diagram;鍵入圖名;在圖上放置對象表示參與者;雙擊每個(gè)對象,然后從下拉列表中選擇參與者名;在圖的中央放置一個(gè)對象以表示系統;雙擊對象,鍵入系統名;選擇Rose Object Link (對象連接符)并且在參與者和系統之間拖曳;選擇Rose 文本框TextBox"ABC" ,鍵入傳遞的對象/數據;選擇Tools-Check Model;選擇File-Save。
需求-用例增量
增量1:支票和儲蓄賬戶(hù)的存款和取款
增量2:查詢(xún)和轉賬
增量3:透支
每個(gè)增量?jì)冗M(jìn)行迭代:樂(lè )觀(guān)的,正常的,悲觀(guān)的
需求用例規約:名稱(chēng),觸發(fā)器,輸入參數,輸出返回值,出現的前置條件/異常,出現的(raised)后置條件/異常,基本的/樂(lè )觀(guān)場(chǎng)景,替代性可選的/悲觀(guān)的場(chǎng)景,業(yè)務(wù)規則,測試實(shí)例。
WithdrawFromCheckingAccount用例的用例規約
用例名:WithdrawFromCheckingAccount
觸發(fā)器: WithdrawFromCheckingAccount
輸入參數: sAcctNum, nWithdraw
輸出返回值: sText
前置條件: ValidAccount = true and nWithdraw <= nCurrentBalance
出現的前置條件異常: 待定的
描述/轉換: nCurrentBalance = nCurrentBalance - nWithdraw
后置條件: nCurrentBalance < nOldBalance
后置條件異常:無(wú)
相關(guān)用例: Generalization, Includes, Extends/Extension Point: 無(wú)
基本場(chǎng)景/樂(lè )觀(guān)場(chǎng)景: Text(文本) - 待定;Diagram(圖) -見(jiàn) WithdrawFromCheckingAccount樂(lè )觀(guān)場(chǎng)景順序圖
替代性可選場(chǎng)景/被動(dòng)場(chǎng)景:Text -待定;Diagram -見(jiàn)WithdrawFromCheckingAccount 活動(dòng)圖
業(yè)務(wù)規則: ValidAccountRule, AdequateBalanceRule
測試實(shí)例:1 - 樂(lè )觀(guān)的:輸入: sAcctNum - BGates001, nWithdraw - 100, nCurrentBalance - 1000 Conditions: None, 輸出:"BGates001 withdraw $100 OK and recorded";2 ...待定
輸入/輸出表單:
WithdrawFromCheckingAccount用例的輸入/輸出表單
Withdraw Request Form(取款需求表單)
Customer Account Number(客戶(hù)賬號)__________
Withdraw Amount(取款數量) ________
Button-Submit(提交按鈕) Button-Clear(清除按鈕)
Withdraw Response Form(取款響應窗體)
Customer Account Number __________
Withdraw Amount __________
Status (狀態(tài)) ________________________
Button-OK(OK 按鈕)
需求-順序圖WithdrawFromCheckingAccount - 樂(lè )觀(guān)場(chǎng)景
注:getApp的第一筆事務(wù)需要達到應用程序的最高級別
Rose 順序圖:在瀏覽器窗口,選擇Use Case View;選擇 Use Case Diagram;選擇一個(gè)用例;選擇Browse-Interaction Diagram-Use Case View- ;選擇Sequence Diagram;鍵入圖名,例如WithdrawFromCheckingAccount-OptiminticScenario;在圖上放置對象以表示參與者;雙擊每個(gè)對象,然后從下拉列表中選擇參與者名;
在圖的中央放置一個(gè)對象以表示系統;雙擊對象,從下拉列表中鍵入系統名;選擇Rose Object Link (對象連接符),在參與者和系統之間拖曳;選擇Tools-Check Model;選擇File-Save .
4-WithdrawFromCheckingAccount用例-所有場(chǎng)景的需求活動(dòng)圖
注:getApp的第一筆事務(wù)需要達到應用程序的最高級別
Rose狀態(tài)-活動(dòng)圖: 在瀏覽器窗口,選擇Use Case View;
選擇Use Case Diagram 顯示圖;
選擇一個(gè)用例;選擇Browse - State Diagram;
如果"State Diagram" 是灰色,則返回到用例圖并重新選擇一個(gè)用例;
在圖上放置活動(dòng)狀態(tài)(activity states);通過(guò)在兩個(gè)狀態(tài)之間拖曳,放置轉移;
選擇Tools-Check Model;
選擇File-Save 。
需求-產(chǎn)品性能:高可靠性,10個(gè)并發(fā)的用戶(hù),2秒響應時(shí)間。
需求/分析-高階概念模型(HOCM--High Order Concept Model)
外部參與者:TellerGUI,BankDB.內部實(shí)體(Internal Entities): BankApp, Account, CheckingAccount, SavingsAccount
Rose高級別概念模型圖: 推薦使用鉛筆和紙做HOCM。作為替代,創(chuàng )建不含屬性和操作的Rose類(lèi)圖。
分析模型-草圖
分析類(lèi)圖 - 最簡(jiǎn)結構
Rose類(lèi)圖: 見(jiàn)〈使用Rational Rose〉
分析包圖
Rose包圖:在瀏覽器窗口選擇Logical View;選擇Browse-Class Diagram-Logical View- 。輸入包圖名;在圖上放置包;從工具條中選擇依賴(lài)箭頭然后從源包到目的包拖曳,放置依賴(lài)關(guān)系。在瀏覽器中,拖動(dòng)每個(gè)類(lèi)到適當的包;選擇Tools-Check Model;選擇File-Save。
分析 WithdrawFromCheckingAccount順序圖-樂(lè )觀(guān)場(chǎng)景
注:getApp的第一筆事務(wù)需要達到應用程序的最高級別
Rose順序圖:見(jiàn)〈使用Rational Rose〉
8- 分析Account類(lèi)的狀態(tài)圖
Rose 狀態(tài)-活動(dòng)圖:在瀏覽器窗口,選擇Use Case View;選擇Use Case Diagram 顯示;選擇一個(gè)用例;選擇Browse - State Diagram;如果 "State Diagram" 是灰色,則返回到用例圖并重新選擇一個(gè)用例;在圖上放置活動(dòng)狀態(tài)(activity states);通過(guò)在兩個(gè)狀態(tài)之間拖曳,放置轉移;選擇Tools-Check Model;選擇File-Save .
分析-復雜操作:待定的-每一個(gè)操作的活動(dòng)圖 和/或操作規約:名稱(chēng),輸入,前置條件/異常,轉換,后置條件/異常,業(yè)務(wù)規則,描述。
Rose規約: 顯示類(lèi)圖;選擇一個(gè)類(lèi);按鼠標右鍵顯示Specification Dialog Box;選擇一個(gè)標簽,例如Operations;雙擊一個(gè)操作;填寫(xiě)操作信息;選擇 Tools - Check Model;選擇File - Save.
設計模型 - 編碼的基礎
設計過(guò)程環(huán)境:Linux 6.2版, GNU C++ 6.2版, C++ 標準庫,CORBA 3。
設計潛在模式
企業(yè)級:基于分布式CORBA,具有公共接口的組件
系統(組件到組件):分層,會(huì )話(huà)-實(shí)體(Session - Entity),回調(Callbacks),發(fā)行者-訂閱者(Publisher - Subscriber)
組件:應用-文檔,控制器-實(shí)體-邊界,虛包(Facade)
類(lèi)設計:UML, Factory(工廠(chǎng)),事務(wù)
JAVA 語(yǔ)言:Java Bean, Enterprise Java Bean, Servlet, RMI
設計包圖
設計類(lèi)圖 說(shuō)明類(lèi)型和參數-目標是完成編碼
注:CheckingAccount和SavingsAccount 提供多態(tài)操作的實(shí)現。
設計順序圖WithdrawFromCheckingAccount - 樂(lè )觀(guān)場(chǎng)景
注:getApp的第一筆事務(wù)需要達到應用程序的最高級別
設計協(xié)作圖WithdrawFromCheckingAccount - 樂(lè )觀(guān)場(chǎng)景
在Rational Rose中打開(kāi)順序圖,按F5 自動(dòng)創(chuàng )建協(xié)作圖。
設計CheckingAccount類(lèi)withdraw()操作的操作規約
用例名: withdraw
觸發(fā):withdraw
輸入參數: nWithdraw : int
輸出返回值: boolean
前置條件: nWithdraw <= nCurrentBalance
出現的前置條件/異常: exInsuffientFunds
描述/轉換: nCurrentBalance = nCurrentBalance - nWithdraw
后置條件: nCurrentBalance < priorCurrentBalance
后置條件異常: exIncorrectBalance
基本/樂(lè )觀(guān)場(chǎng)景 :見(jiàn)WithdrawFromCheckingAccount 順序圖
替代性場(chǎng)景/悲觀(guān)場(chǎng)景:見(jiàn)WithdrawFromCheckingAccount 活動(dòng)圖
業(yè)務(wù)規則:ValidAccountRule, AdequateBalanceRule
設計異常類(lèi)(exception classes)異常超類(lèi)(操作:Exception()/Exception(string);異常子類(lèi):exInsufiicientFunds [操作 :exInsufiicientFunds()、exInsufiicientFunds(string)];exIncorrectBalance[操作:exIncorrectBalance()、exIncorrectBalance(string)]。
設計 CheckingAccount 類(lèi)的狀態(tài)圖
實(shí)施模型(Implementation Models)
實(shí)施模型
設計過(guò)程環(huán)境
實(shí)施組件圖
實(shí)施文件(Implementation Files): TellerGUI.exe, BankApp.exe, BankDB.exe
組件接口選擇:
1) BankApp具有單接口 IbankApp,其所有操作都是公有的(exposed)
2) BankApp暴露(exposes) IBankApp, ICheckingAccount, & ISavingAccount 接口
3) BankApp暴露(exposes) IBankApp, IWithdraw, IDeposit, ICheckingAccount, & ISavingAccount 接口
CORBA IDL/C++ 需要對接口進(jìn)行描述
Rose 組件圖:在瀏覽器窗口,選擇Component View;,將"Main"重命名為"Component View";雙擊圖名顯示該圖;在圖上放置組件和依賴(lài)關(guān)系(從client組件到supplier組件拖曳);在瀏覽器中把每個(gè)類(lèi)拖到相應的組件中;選擇Tools-Check Model;選擇File-Save.
實(shí)施部署圖
Rose 部署圖:在瀏覽器窗口選擇Deployment View;雙擊以顯示該圖;在圖上放置節點(diǎn)和關(guān)系;選擇Tools-Check Model;選擇File-Save.
//使用CORBA的 BankApp系統的接口

//Sample IDL Interface Code(IDL 接口代碼樣本) module BankApp { interface IBankApp { exception exInsuffientFunds; IBankApp getApp(); boolean depositToCheckingAccount (in string sAcctNum, in int nDeposit) ; boolean depositToSavingAccount (in string sAcctNum, in int nDeposit) ; boolean withdrawFromCheckingAccount (in string sAcctNum, in int nWithdraw)raises (exInsuffientFunds); boolean withdrawFromSavingAccount (in string sAcctNum, in int nWithdraw) raises (exInsuffientFunds); };}; //Sample Java Interface Code Using Remote Method Invocation //(使用RMI 的Java接口樣本) import java.rmi.*; package BankApp; public interface IBankApp extends java.rmi.Remote { boolean depositToCheckingAccount (String sAcctNum, int nDeposit) throws java.rmi.RemoteException ; boolean depositToSavingAccount (String sAcctNum, int nDeposit) throws java.rmi.RemoteException ; boolean withdrawFromCheckingAccount (String sAcctNum, int nWithdraw) throws java.rmi.RemoteException; boolean withdrawFromSavingAccount (String sAcctNum, int nWithdraw) throws java.rmi.RemoteException; } //Sample Microsoft IDL Interface Code for COM - Simplified //(Microsoft IDL 的COM接口編碼樣本-簡(jiǎn)化版) library BankAppLib { dispinterface IBankApp { IBankApp getApp(); boolean depositToCheckingAccount (BSTR sAcctNum, int nDeposit) ; boolean depositToSavingAccount (BSTR sAcctNum, int nDeposit) ; boolean withdrawFromCheckingAccount (BSTR sAcctNum, int nWithdraw); boolean withdrawFromSavingAccount (BSTR sAcctNum, int nWithdraw); }; coclass BankApp { dispinterface IBankApp; }; }; //Sample SOAP (Simple Object Access Protocol) SDL (Service Description Language) with XML -Incomplete //包含XML 的SOAP SDL樣本-不完全 <?xml version=‘1.0‘?> <serviceDescription name=‘BankApp‘ xmlns=‘urn:schemas-xmlsoap-org:sdl.2000-01-25‘ xmlns:dt=‘http://www.w3.org/1999/XMLSchema‘ xmlns:IBankApp=‘IBankApp‘> <import namespace=‘IBankApp‘ location=‘#IBankApp‘/> <soap xmlns=‘urn:schemas-xmlsoap-org:soap-sdl-2000-01-25‘> <interface name=‘IBankApp‘> <requestResponse name=‘WithdrawFromCheckingAccount‘> <request ref=‘IBankApp:WithdrawFromCheckingAccount‘/> <response ref=‘IBankApp:WithdrawFromCheckingAccountResponse‘/> </requestResponse> </interface> <service> <addresses> <address uri=‘http://myserver/IBankApp.asp‘/> </addresses> <implements name=‘IBankApp‘/> </service> </soap> <IBankApp:schema id=‘IBankApp‘ targetNamespace=‘IBankApp‘ xmlns=‘http://www.w3.org/1999/XMLSchema‘> <element name=‘WithdrawFromCheckingAccount‘> </element> <element name=‘WithdrawFromCheckingAccountResponse‘> <type> <element name=‘return‘ type=‘dt:boolean‘/> </type> </element> </IBankApp:schema> </serviceDescription>
構建
編碼/命名標準;接口代碼-CORBA IDL;C++代碼;CASE 工具腳本/定制報告的VBA /代碼生成
Rose代碼生成-需要Rose 專(zhuān)業(yè)版或企業(yè)版. 見(jiàn)Help Topic Code Generation(幫助主題-Code Generation)。
步驟:
1 - 檢查模型;
2 - 創(chuàng )建組件;
3 - 映射/分配類(lèi)到組件;
4 - 設定代碼生成特性;
5 - 選擇一%A