【转】【UML】使用Visual Studio 2010 Team System中的架构师工具(设计与建模)
Lab 1:?應(yīng)用程序建模
實(shí)驗(yàn)?zāi)繕?biāo)
這個(gè)實(shí)驗(yàn)的目的是展示如何在Visual Studio 2010旗艦版中進(jìn)行應(yīng)用程序建模。團(tuán)隊(duì)中的架構(gòu)師會(huì)通過建模確定應(yīng)用程序是否滿足客戶的需求。 你可以創(chuàng)建不同級(jí)別的詳細(xì)模型,并將它們彼此結(jié)合、測(cè)試然后發(fā)布到你的開發(fā)計(jì)劃里。
在這個(gè)實(shí)驗(yàn)中, 我們將重點(diǎn)放在如何創(chuàng)建一系列簡(jiǎn)單的系統(tǒng)建模圖形上.
每個(gè)練習(xí)應(yīng)該在 30分鐘內(nèi)完成.
Exercise 1 –?理解用戶需求
繪制活動(dòng)、類以及其他UML圖形能幫助架構(gòu)師清晰辨別客戶的習(xí)慣、業(yè)務(wù)規(guī)則以及其他需求,從而使設(shè)計(jì)與客戶需求保持一致。
微軟Visual Studio 2010旗艦版可以讓你繪制關(guān)于客戶的活動(dòng)以及你的系統(tǒng)如何幫助客戶達(dá)到他們的預(yù)期,這樣有助于你理解用戶需求,并能夠與客戶進(jìn)行良好的溝通和討論。
需求模型可以幫助你:
l 專注于系統(tǒng)的外部行為,并與系統(tǒng)內(nèi)部設(shè)計(jì)分離。
l 使用比自然語言更少的更精準(zhǔn)的方法描述客戶以及投資者的需求。
l 定義一個(gè)可以由客戶、開發(fā)人員以及測(cè)試人員一致使用的術(shù)語詞匯。
l 減少需求中的差距和分歧。
l 降低針對(duì)需求變化的響應(yīng)所付出的工作量。
l 規(guī)劃哪些功能需要開發(fā)。
l 使用模型作為系統(tǒng)測(cè)試的基礎(chǔ),使其成為客戶需求與測(cè)試人員之間的紐帶。當(dāng)需求變更時(shí),這種紐帶可以幫助你迅速更新測(cè)試。這樣可以使系統(tǒng)盡快滿足新的需求。
如果你將重點(diǎn)放在每次迭代開始時(shí)與客戶的討論上,那么需求模型會(huì)給你提供很大的便利。而且你不能在完成設(shè)計(jì)之前編寫詳細(xì)代碼。部分應(yīng)用程序功能,即使它非常簡(jiǎn)單,通常也是構(gòu)成與用戶討論時(shí)最敏感的需求基礎(chǔ)。模型可以有效地總結(jié)討論結(jié)果。
Task 1 –用戶需求建?!?/strong>用例圖
創(chuàng)建用例圖來描述誰使用該系統(tǒng),以及他們?nèi)绾问褂?。用例圖代表一個(gè)系統(tǒng)用戶的目標(biāo),以及他們執(zhí)行程序的流程。
這個(gè)任務(wù)中,客戶需要一個(gè)在線餐飲銷售系統(tǒng)。該系統(tǒng)必須允許客戶從菜單中選擇食品,而且必須提供銷售商更新食品品種的菜單。你可以使用以下步驟實(shí)現(xiàn)該用例圖:
1. 啟動(dòng)?Microsoft Visual Studio 2010.
2. 選擇?文件->新建->項(xiàng)目,如下所示:.
?
Figure?1: 打開新建項(xiàng)目對(duì)話框
3. 在新建項(xiàng)目對(duì)話框中, 選擇項(xiàng)目類型下的建模項(xiàng)目,然后在右側(cè)項(xiàng)目模板中選擇建模項(xiàng)目.
修改項(xiàng)目名稱為ModelingProjectDinnerNow. 保持默認(rèn)項(xiàng)目路徑.
Figure?2: 創(chuàng)建新建模項(xiàng)目
4. 單擊確定,應(yīng)用你的選擇,打開一個(gè)空的建模項(xiàng)目.
Figure?3: 空的建模項(xiàng)目
5. 在解決方案瀏覽器中右鍵單擊ModelingProjectDinnerNow項(xiàng)目根節(jié)點(diǎn),在彈出菜單中選擇添加->添加新項(xiàng)
Figure 4: 添加新項(xiàng)菜單
6. 在彈出的添加新項(xiàng)對(duì)話框中,選擇UML用例圖模板,并修改用例圖的名稱為UMLUseCaseDiagramDinnerNow.usecasediagram
Figure 5: 添加新項(xiàng)對(duì)話框
7. 單擊添加,此時(shí)會(huì)打開空白用例圖
Figure 6: 空白用例圖UMLUseCaseDiagramDinnerNow.usecasediagram
8. 根據(jù)案例用戶需求,從左側(cè)工具箱中的UML用例圖節(jié)點(diǎn)下拖拽兩個(gè)用例圖標(biāo)到右側(cè)設(shè)計(jì)界面。
Figure 7: 從工具箱中拖拽兩個(gè)用例圖標(biāo)
9. 點(diǎn)選用例圖標(biāo)的”UseCase1”文字部分,使其變?yōu)榭删庉嫚顟B(tài),然后將其內(nèi)容修改為Order a Meal
10. 重復(fù)步驟9的操作,將用例2的用例內(nèi)容修改為Update Menu。
Figure 8: 用例定義修改后的效果
11. 根據(jù)案例用戶需求,從左側(cè)工具箱中的UML用例圖節(jié)點(diǎn)下拖拽兩個(gè)活動(dòng)者圖標(biāo)到右側(cè)用例圖設(shè)計(jì)界面
Figure 9: 從工具箱中添加活動(dòng)者
12. 點(diǎn)選用活動(dòng)者圖標(biāo)的”Actor1”文字部分,使其變?yōu)榭删庉嫚顟B(tài),然后將其內(nèi)容修改為Customer
13. 重復(fù)步驟12的操作,將活動(dòng)者2的定義修改為Restaurant
Figure 10: 定義活動(dòng)者后的效果
14. 在工具箱中選中Association圖標(biāo),然后在設(shè)計(jì)界面中首先點(diǎn)選Customer圖標(biāo),并保持鼠標(biāo)按下,拖拽到Order a Meal用例上。
Figure 11: 選擇Association圖標(biāo)后的效果
Figure 12: 拖拽過程中的效果
Figure 13: 拖拽完成的效果
15. 按照步驟14的方法,為Restaurant活動(dòng)者與Update Menu用例建立聯(lián)系
Figure 14: 用例圖初步完成效果
16. 還可以生成更精確的用例圖。例如,訂餐只是購(gòu)買活動(dòng)的一個(gè)步驟。整個(gè)購(gòu)買活動(dòng)應(yīng)該還包含付款和交貨等。
17. 在工具箱中選擇子系統(tǒng)圖標(biāo),并將其拖拽到設(shè)計(jì)界面中,放置于前一步驟中完成的用例圖的下方
Figure 15: 添加子系統(tǒng)圖標(biāo)
18. 點(diǎn)選子系統(tǒng)圖標(biāo)中左上角的“SubSystem1”文字,使其可以編輯。將“SubSystem1”文本修改為“Dinner Now System”
Figure 16: 修改子系統(tǒng)名稱
19. 選中上面我們定義的兩個(gè)用例:Order a Meal、Update Menu。將其拖拽到子系統(tǒng)圖標(biāo)內(nèi),并調(diào)整相互位置。
Figure 17: 將用例拖拽到子系統(tǒng)內(nèi)
Figure 18: 目前為止完成的更精確的用例圖
20. 從工具箱中拖拽兩次用例圖標(biāo)到子系統(tǒng)圖標(biāo)內(nèi),分別定義為Buy a Meal、Pay for Meal
Figure 19: 添加子系統(tǒng)內(nèi)部用例后的效果
21. 由于訂餐和付款共同屬于購(gòu)買行為的組成部分,所以O(shè)rder a Meal、Pay for Meal都包含在Buy a Meal中。需要在工具箱中選中包含圖標(biāo),分別在Buy a Meal?與?Order a Meal?;Buy a Meal?與Pay for Meal之間建立包含關(guān)系。
Figure 20: 建立Buy a Meal包含關(guān)系后的效果
22. 由于Buy a Meal 作為客戶使用的總用例,所以這里刪除Customer活動(dòng)者與Order a Meal用例的聯(lián)系,建立Customer活動(dòng)者與Buy a Meal用例的聯(lián)系。調(diào)整用例之間的位置。
Figure 21: 修改Customer活動(dòng)者關(guān)系后的效果
23. 由于送餐并不屬于Dinner Now System的功能,可能會(huì)有專門的物流或快遞系統(tǒng)負(fù)責(zé),這里,將送餐定義在Dinner Now System系統(tǒng)的外部。在Dinner Now System子系統(tǒng)圖標(biāo)外部添加一個(gè)新的用例,定義為Deliver Meal。并指定它與Restaurant活動(dòng)者之間的聯(lián)系。
Figure 22: 添加送餐用例后的效果
24. 送餐用例雖不屬于Dinner Now System系統(tǒng)的功能,但是也是購(gòu)買行為的組成部分,這里需要建立Buy a Meal用例與Deliver Meal用例之間的包含關(guān)系
Figure 23: 最終用例圖完成的效果
25. 到此用例圖設(shè)計(jì)完成,保存并關(guān)閉當(dāng)前設(shè)計(jì)界面。
你還可以定義哪些用例包含在你系統(tǒng)的開發(fā)范圍之內(nèi)。例如,我們案例中的Deliver Meal用例就不需要開發(fā)。這就幫助開發(fā)人員界定了他們的工作內(nèi)容。一般用例圖中的子系統(tǒng)圖標(biāo)用來代表系統(tǒng)或組成部份。
用例圖還可以幫助你的團(tuán)隊(duì)討論功能發(fā)布的連續(xù)性。如,你可以決定是否在最初的版本中包括付費(fèi)功能,或者可以不包含。如果系統(tǒng)中不包含付費(fèi)功能,那么也可以由客戶在餐廳直接支付,而不經(jīng)過系統(tǒng)。這樣,你就可能不在你的系統(tǒng)最初版本中包含付費(fèi)功能。
用例圖只是一個(gè)總體的描述,而要想得到更詳細(xì)的用例描述,你可以將你的用例圖中的每個(gè)用例都導(dǎo)航到一個(gè)用例文檔中。用詳細(xì)的用例文檔來描述用例。
Task 2 –?概念類圖
你可以使用UML 類圖來開發(fā)用于下列用途的概念模型:
l 客戶可以自己參與到系統(tǒng)的開發(fā)過程中
l 描述用戶的需求,例如,在描述用例、業(yè)務(wù)規(guī)則以及用戶使用習(xí)慣方面。
l 系統(tǒng)中的API或用戶界面的信息類型變更
l 描述系統(tǒng)或驗(yàn)收測(cè)試
出于這樣的目的,UML類圖的概念就被定義為概念類圖。
在一個(gè)概念類圖中,你只需要展示必要的需求描述,而不需要展示系統(tǒng)內(nèi)部的設(shè)計(jì)。概念模型中不應(yīng)該出現(xiàn)操作或接口。
你可以使用如下步驟定義概念模型:
1. 在解決方案瀏覽器中右鍵單擊ModelingProjectDinnerNow項(xiàng)目根節(jié)點(diǎn),在菜單中選擇添加->添加新項(xiàng)
Figure 24: 添加新項(xiàng)對(duì)話框中選擇UML類圖
2. 在添加新項(xiàng)對(duì)話框中選擇UML類圖模板,并定義名稱為UMLClassDiagramDinnerNow.classdiagram. 效果如上圖所示。
3. 點(diǎn)擊添加按鈕,打開空白UML類圖設(shè)計(jì)界面.
Figure 25: 空白UML類圖設(shè)計(jì)界面
4. 在Task 1中我們?cè)O(shè)計(jì)到了兩個(gè)對(duì)象:訂單、菜單。根據(jù)經(jīng)驗(yàn)我們知道,訂單和菜單分別都要有各自的小項(xiàng),即訂單小項(xiàng)、菜單小項(xiàng)。所以我們首先從工具箱中拖拽四個(gè)類圖標(biāo)到設(shè)計(jì)界面,分別定義為Menu、MenuItem、Order、OrderItem。
Figure 26: 建立四個(gè)對(duì)象
5. 由于菜單和菜單小項(xiàng)、訂單與訂單小項(xiàng)是1對(duì)多的包含關(guān)系,所以我們需要在Menu與MenuItem、Order與OrderItem之間建立“構(gòu)成”關(guān)系.從工具箱中選中Composition圖標(biāo),然后點(diǎn)選Menu對(duì)象。保持鼠標(biāo)按下狀態(tài),拖拽到MenuItem對(duì)象上,生成Menu與MenuItem對(duì)象之間“構(gòu)成”關(guān)系
Figure 27: 拖拽關(guān)系
Figure 28: 建立Menu與MenuItem的構(gòu)成關(guān)系
6. 由于Menu與MenuItem是1對(duì)多的包含關(guān)系,所以,選中設(shè)計(jì)界面中在上一步驟生成的Composition圖標(biāo),點(diǎn)選右側(cè)下方的1文本,使其可以編輯。將其更改為*。選中左側(cè)下方的MenuItem文本,將其修改為Contents
Figure 29: Menu對(duì)象與MenuItem對(duì)象之間的Composition關(guān)系
7. 重復(fù)5、6步驟,設(shè)置Order對(duì)象與OrderItem對(duì)象之間的Composition關(guān)系
Figure 30: Order對(duì)象與OrderItem對(duì)象之間的Composition關(guān)系
8. Menu對(duì)象與Order對(duì)象之間存在1對(duì)多的聯(lián)系,同樣,MenuItem與OrderItem之間也存在著1對(duì)多的聯(lián)系。所以,重復(fù)5、6步,在Menu與Order之間和MenuItem與OrderItem之間分別建立Association關(guān)系
Figure 31: 建立Association關(guān)系
9. 由于MenuItem和OrderItem在數(shù)據(jù)上有一個(gè)明顯的不同就是,OrderItem必須包含數(shù)量,而MenuItem不需要包含。所以我們要在OrderItem中定義一個(gè)數(shù)量屬性。在OrderItem對(duì)象中的屬性一欄上點(diǎn)擊右鍵,在彈出的菜單中選擇添加->屬性
Figure 32: 為OrderItem對(duì)象添加屬性
10. 此時(shí)OrderItem對(duì)象中出現(xiàn)可編輯的屬性,其文本為Attribute1。將Attribute1文本修改為quantity,然后右鍵選擇quantity屬性,在屬性選項(xiàng)卡中修改屬性的數(shù)據(jù)類型為Integer
Figure 33: 定義quantity屬性
11. 至此 ,我們完成了概念模型的設(shè)計(jì)。保存并關(guān)閉當(dāng)前概念類模型設(shè)計(jì)界面
Figure 34: 初步完成概念模型設(shè)計(jì)
概念模型提供了一系列你在整個(gè)需求建模階段需要使用的詞匯和條件。例如,在Order a Meal用例的詳細(xì)描述中,可以這樣寫:
客戶可以選擇菜單來生成訂單。通過在菜單中選擇一個(gè)菜單項(xiàng),系統(tǒng)在訂單中生成訂單項(xiàng)。
注意,上面描述中使用的詞匯就是我們?cè)谀P椭惺褂玫念惷,F(xiàn)在刪除概念模型中類與類之間的不準(zhǔn)確的關(guān)系。例如,圖中明確顯示了每個(gè)訂單只關(guān)聯(lián)一個(gè)菜單。
對(duì)客戶需求的誤解可以追溯到對(duì)詞匯詳細(xì)解釋的誤解。例如,大多數(shù)餐館都有約定俗成的菜單和訂單,但是訂單項(xiàng)與菜單項(xiàng)的不同卻區(qū)分并不明顯。當(dāng)與客戶討論需求時(shí),暴露這些分歧是很重要的。類圖是一個(gè)很有用的工具,它可以幫助你明確對(duì)象以及對(duì)象之間的關(guān)系。
業(yè)務(wù)規(guī)則是一個(gè)不與特定用例相關(guān)的需求,應(yīng)該是從整個(gè)系統(tǒng)層面考慮。
許多業(yè)務(wù)規(guī)則是對(duì)概念模型中類之間關(guān)系的約束。你可以為概念類圖中的相關(guān)類,定義一些通用靜態(tài)業(yè)務(wù)規(guī)則。例如:
在概念模型中右鍵單擊Order對(duì)象,在菜單中選擇添加->添加注釋添加如下約束:“在任何訂單中,所有的訂單項(xiàng)只能來自于同一個(gè)選中的菜單”
Figure 35: 對(duì)概念模型添加約束注釋
動(dòng)態(tài)業(yè)務(wù)規(guī)則限制的是事件發(fā)生的順序。例如,你可以使用一個(gè)順序或活動(dòng)圖來展示:一個(gè)用戶必須登錄才能執(zhí)行你的系統(tǒng)上的操作。
因此,許多動(dòng)態(tài)規(guī)則能夠取代動(dòng)態(tài)規(guī)則更有效更通用的執(zhí)行約束。例如,你也許能添加一個(gè)布爾類型的屬性“Logged In”到概念類模型中。你還會(huì)將登錄成功作為登錄用例的后置條件,還可以將登錄成功作為其它用例的前置條件。這種方法可以讓你定義一系列事件的組成順序。當(dāng)你需要添加新的用例到用例模型時(shí),動(dòng)態(tài)約束更加靈活。
Task 3 –?活動(dòng)圖
你可以使用活動(dòng)圖來顯示不同用例之間的工作流程。在需求建模的開始階段繪制活動(dòng)圖是非常有用的。它可以展示用戶執(zhí)行的主要任務(wù)——包含系統(tǒng)內(nèi)外的交互。
這里以訂餐為例:客戶訂餐時(shí)首先需要選擇一個(gè)菜單,然后在菜單中選擇某樣菜品。客戶可以在某個(gè)菜單內(nèi)部重復(fù)多次的選擇相同或不同的菜品。當(dāng)菜品選擇完畢后,客戶可以將選中的菜品一并結(jié)賬付款。
1. 在解決方案瀏覽器中右鍵單擊ModelingProjectDinnerNow項(xiàng)目根節(jié)點(diǎn),在菜單中選擇添加->添加新項(xiàng).
2. 在添加新項(xiàng)對(duì)話框中選擇UML活動(dòng)圖模板,并定義名稱為UMLActivityDiagramDinnerNow.activitydiagram. 效果如上圖示.
Figure 36: 添加新項(xiàng)->UML活動(dòng)圖
3. 此時(shí)會(huì)打開活動(dòng)圖設(shè)計(jì)界面。點(diǎn)選設(shè)計(jì)界面的空白處,在屬性選項(xiàng)卡中修改活動(dòng)圖的名稱屬性為Order Meal.此時(shí)活動(dòng)圖左上角的標(biāo)簽應(yīng)該變?yōu)閍ct Order Meal
Figure 37: 修改活動(dòng)圖的名稱屬性
4. 任何活動(dòng)都從一個(gè)初始化節(jié)點(diǎn)開始的,所以從工具箱中的UML?活動(dòng)圖節(jié)點(diǎn)下選擇初始節(jié)點(diǎn)圖標(biāo),并拖拽到設(shè)計(jì)界面中.
Figure 38: 拖拽初始節(jié)點(diǎn)圖標(biāo)
5. 根據(jù)案例的描述,訂餐活動(dòng)中應(yīng)該有選擇菜單、選擇菜品、付款三項(xiàng)主要活動(dòng)。這里從工具箱中拖拽三個(gè)活動(dòng)圖標(biāo)到設(shè)計(jì)界面,分別定義活動(dòng)內(nèi)容為“Choose Menu”、“Select Menu Item”、“Pay”.
Figure 39: 定義活動(dòng)
6. 活動(dòng)圖定義的結(jié)尾,應(yīng)該是活動(dòng)的結(jié)束節(jié)點(diǎn)。從工具箱中拖拽活動(dòng)結(jié)束節(jié)點(diǎn)到設(shè)計(jì)界面
Figure 40: 定義活動(dòng)結(jié)束
7. 在工具箱中選中連接器圖標(biāo),在設(shè)計(jì)界面點(diǎn)選初始圖標(biāo)并保持鼠標(biāo)按下,拖拽到右側(cè)Choose Menu活動(dòng)圖標(biāo)上。
Figure?41:?拖拽活動(dòng)之間的連接器
Figure?42:?定義第一個(gè)連接器后的效果
8. 根據(jù)任務(wù)中需求的描述,客戶選擇菜單后,可以再瀏覽選擇菜品,即菜單項(xiàng)。而且客戶可以反復(fù)瀏覽菜單和菜品。這樣在選擇菜品和選擇菜單兩個(gè)活動(dòng)之間就形成了循環(huán)的關(guān)系。所以我們需要在Choose Menu活動(dòng)的下方放置一個(gè)合并節(jié)點(diǎn),然后在Select Menu Item活動(dòng)的下方放置一個(gè)分支節(jié)點(diǎn)
Figure?43:?添加合并節(jié)點(diǎn)和分支節(jié)點(diǎn)
9. 從Choose Menu活動(dòng)開始,以此向下添加連接器,直到Pay活動(dòng)
Figure?44:?添加正常流程連接器
10. 為了說明客戶可以在菜單中反復(fù)選擇菜品,我們需要從分支節(jié)點(diǎn)到合并節(jié)點(diǎn)添加一個(gè)連接器,用來表示循環(huán),并對(duì)循環(huán)活動(dòng)添加注釋。在分支節(jié)點(diǎn)的指向下方活動(dòng)的連接器的Guard屬性中添加如下提示:Customer has finished choosing.在返回上方的連接器的Guard屬性中添加如下提示:Customer wants to choose more.
Figure?45:?添加循環(huán)活動(dòng)
11. 當(dāng)客戶選擇完所須的菜品后,任務(wù)就完結(jié)。這里我們從Pay活動(dòng)到活動(dòng)結(jié)束節(jié)點(diǎn)添加連接器。
Figure?46:?訂餐活動(dòng)終結(jié)
12. 至此,訂餐功能的活動(dòng)圖我們就構(gòu)建完成。
你可以利用用例圖和活動(dòng)圖來展示針對(duì)相同信息的不同觀點(diǎn)。用例圖可以有效地顯示在大的功能中的嵌套的小的活動(dòng),但它不包含活動(dòng)之間的流程。
例如,同樣是描述訂餐功能,使用用例圖描述如下
Figure?47:?用例圖中的訂餐活動(dòng)
?
Task 4 –?順序圖
你可以使用順序圖來顯示你的系統(tǒng)與外部活動(dòng)者之間,或者系統(tǒng)與系統(tǒng)之間的信息交互。順序圖提供了一種用例,它可以非常清晰地展示系統(tǒng)模塊之間的互操作步驟。順序圖在描述多個(gè)用例之間的交互時(shí)非常有效,而且為你的系統(tǒng)提供一些API。
1. 在解決方案瀏覽器中右鍵單擊ModelingProjectDinnerNow項(xiàng)目根節(jié)點(diǎn),在菜單中選擇添加->添加新項(xiàng).
2. 在添加新項(xiàng)對(duì)話框中選擇UML順序圖模板,并定義名稱為UMLSequenceDiagramDinnerNow.sequencediagram.
Figure 48 新建UML 順序圖界面
3. Dinner Now系統(tǒng)中的功能主要是四個(gè)對(duì)象之間的交互,他們是客戶、Dinner Now 系統(tǒng)、餐廳、銀行。打開UML模型瀏覽器,可以看到已經(jīng)包含客戶活動(dòng)者、Dinner Now子系統(tǒng)以及餐廳活動(dòng)者,所以可以直接拖拽這三個(gè)用例到順序圖設(shè)計(jì)界面
Figure 49 添加客戶、DinnerNow子系統(tǒng)、餐廳三個(gè)生命線
4. 由于我們之前設(shè)計(jì)的用例中暫時(shí)不包含銀行用例,所以我們需要從工具箱中拖拽一個(gè)生命線圖標(biāo)到設(shè)計(jì)界面,并在空生命線的屬性面板中修改名稱屬性為Bank,修改Type屬性為None。
Figure 50 從工具箱中拖拽生命線圖標(biāo)到設(shè)計(jì)界面
Figure?51?修改Bank生命線屬性
5. 根據(jù)需求我們知道客戶需要在菜單中不斷的瀏覽,不斷的選擇,系統(tǒng)也是不斷的將客戶選中的菜品添加到訂單中。所以我們首先在Dinner Now System生命線上添加一個(gè)異步的調(diào)用。首先在工具箱中選中異步圖標(biāo),然后在設(shè)計(jì)界面上選中客戶生命線,保持鼠標(biāo)按下,拖拽到Dinner Now System生命線上
Figure?52?拖拽異步圖標(biāo)從Customer生命線到Dinner Now System生命線
Figure?53?建立異步調(diào)用后的效果
6. 單擊Message1文本,使其可編輯,將Message1文本修改為?Add Order Item
Figure?54?修改調(diào)用的名稱
7. 因?yàn)榭蛻籼暨x菜品的過程是一個(gè)循環(huán)往復(fù)的過程,所以需要標(biāo)注循環(huán)。右鍵單擊Add Order Item調(diào)用,在彈出的菜單中選擇包圍->循環(huán)組件片段。
Figure?55?添加循環(huán)組件片段菜單
Figure?56?添加循環(huán)片段的效果
8. 在循環(huán)片段左上角的Loop文本下方單擊空白區(qū)域,出現(xiàn)可編輯文本框,定義文本內(nèi)容為until complete
Figure?57?編輯循環(huán)標(biāo)簽
9. 當(dāng)客戶選擇完菜品后,需要最終確認(rèn)并提交訂單。重復(fù)步驟5、6,從客戶生命線到Dinner Now?系統(tǒng)生命線建立異步調(diào)用,并修改調(diào)用名稱為Confirm Order
Figure?58?添加Confirm Order異步調(diào)用
10. 客戶確認(rèn)訂單后,系統(tǒng)會(huì)將訂單發(fā)送給餐廳等待處理,此時(shí),餐廳需要通過系統(tǒng)反饋給客戶一個(gè)訂單發(fā)送是否成功的確認(rèn)。我們需要從工具箱中拖拽一個(gè)同步調(diào)用。在設(shè)計(jì)界面中,從Dinner Now系統(tǒng)生命線上生成的矩形圖標(biāo),拖拽到右側(cè)的餐廳生命線上
Figure?59?在Confirm Order調(diào)用與餐廳生命線之間建立同步調(diào)用
11. 將指向右側(cè)的調(diào)用文本Message1,修改為Send Order。將下方指向左側(cè)的回調(diào)文本return,修改為OK
Figure?60?修改回調(diào)方法名稱
12. 系統(tǒng)收到餐廳的確認(rèn)后,客戶就可以付款了。系統(tǒng)會(huì)請(qǐng)求客戶提交付款的詳細(xì)信息。付款成功的信息會(huì)直接返回給客戶。重復(fù)步驟10、11,從客戶生命線?到Dinner Now系統(tǒng)生命線之間建立同步調(diào)用,將指向右側(cè)的調(diào)用名稱修改為Payment detail,將指向左側(cè)的消息回調(diào)名稱修改為confirmed
Figure?61?添加付款功能調(diào)用和確認(rèn)
13. 客戶提交付款詳細(xì)信息后,系統(tǒng)會(huì)直接與銀行之間執(zhí)行付款操作流程。而系統(tǒng)與銀行之間的付款流程完成后,銀行也會(huì)返回給Dinner Now 系統(tǒng)一個(gè)確認(rèn)信息。所以重復(fù)步驟10、11,從Dinner Now系統(tǒng)上的Payment detail調(diào)用矩形圖標(biāo),到銀行生命線建立同步調(diào)用。將指向右側(cè)的調(diào)用名稱修改為Process Payment,將指向左側(cè)的回發(fā)調(diào)用名稱修改為OK
Figure?62?添加執(zhí)行付款調(diào)用和確認(rèn)
14. Dinner Now系統(tǒng)收到銀行的付款確認(rèn)后,會(huì)將確認(rèn)信息和最終訂單發(fā)送給餐廳。而餐廳收到訂單這個(gè)調(diào)用應(yīng)該先于系統(tǒng)給客戶的確認(rèn)。所以我們需要在Dinner Now系統(tǒng)生命線中的Payment detail調(diào)用矩形圖標(biāo)上,在銀行反饋給系統(tǒng)付款確認(rèn)信息之后,建立一個(gè)到餐廳生命線的異步調(diào)用。并將異步調(diào)用的名字改為Confirm Order
Figure?63?添加確認(rèn)訂單調(diào)用
15. 當(dāng)Dinner Now系統(tǒng)向客戶返回了訂餐成功的最終確認(rèn)后,餐廳就可以為客戶送餐了。而送餐的動(dòng)作不需要經(jīng)過Dinner Now系統(tǒng),所以,在Payment detail 調(diào)用結(jié)束后,直接從餐廳生命線上的Confirm Order調(diào)用上,向客戶生命線添加一個(gè)返回的異步調(diào)用Deliver Food。且confirmed回發(fā),和Deliver Food調(diào)用應(yīng)該是并行的 。
Figure?64?添加送餐調(diào)用
16. 到此我們的順序圖就繪制完成,保存并關(guān)閉設(shè)計(jì)界面。
總結(jié)
創(chuàng)建模型往往可以大幅減少需求分析中與客戶的需求相矛盾或含糊不清的地方。不同的利益相關(guān)者往往對(duì)系統(tǒng)運(yùn)行的業(yè)務(wù)流程有不同的理解。因此你的第一個(gè)任務(wù)就是解決這些你和客戶之間的分歧。
你會(huì)發(fā)現(xiàn) ,
Exercise 2 –?軟件設(shè)計(jì)建模
圖形建模可以幫助你了解、澄清你的系統(tǒng)必須實(shí)現(xiàn)的客戶需求,并使你的代碼能夠與客戶進(jìn)行良好的意見溝通。例如,你可以使用統(tǒng)一建模語言(UML)的用例圖、活動(dòng)圖、類圖以及順序圖來描述用戶需求。你可以使用UML的組件圖、類圖、活動(dòng)圖、順序圖來描繪系統(tǒng)的功能。
Task 1?–?活動(dòng)圖
這個(gè)案例中我們需要參考在需求分析建模中構(gòu)建的活動(dòng)圖UMLActivityDiagramDinnerNow.activitydiagram。但是在軟件設(shè)計(jì)階段和需求分析階段的活動(dòng)圖略有不同,例如UMLActivityDiagramDinnerNow.activitydiagram中的Pay活動(dòng)其實(shí)并不經(jīng)過Dinner Now系統(tǒng),所以我們需要對(duì)需求分析建模中的Pay活動(dòng)進(jìn)行修改。將其換成一個(gè)行為調(diào)用活動(dòng),并命名為Confirm Order
Figure?65?修改調(diào)用活動(dòng)
通過需求分析建模中用例圖和活動(dòng)圖的描述,我們得知,創(chuàng)建訂單時(shí),配貨與付款是并發(fā)的兩件事。所以我們需要在軟件設(shè)計(jì)建模中的活動(dòng)途中對(duì)其加以細(xì)化。
1. 在解決方案瀏覽器中右鍵單擊ModelingProjectDinnerNow項(xiàng)目根節(jié)點(diǎn),在菜單中選擇添加->添加新項(xiàng)
2. 在添加新項(xiàng)對(duì)話框中選擇UML活動(dòng)圖模板,并定義名稱為UMLActivityDiagramCreateOrder.activitydiagram.
Figure?66?新建創(chuàng)建訂單活動(dòng)圖
3. 從工具箱中拖拽活動(dòng)的起點(diǎn)圖標(biāo)到設(shè)計(jì)界面,命名為InitialCreateOrder,然后再拖拽第一個(gè)活動(dòng)到設(shè)計(jì)界面,命名為Create Order
Figure?67?創(chuàng)建訂單活動(dòng)圖的起始階段
4. 從工具箱中拖拽一個(gè)并行分支節(jié)點(diǎn)到設(shè)計(jì)界面并命名為ForkCreateOrder,以此來表示任何進(jìn)入這里的處理流程都會(huì)被分解為若干個(gè)并行的處理進(jìn)程。然后添加從Create Order活動(dòng)到并行分支節(jié)點(diǎn)的連接器。
Figure?68?添加并行分支節(jié)點(diǎn)
5. 在并行分支節(jié)點(diǎn)的右側(cè),首先建立配貨活動(dòng)的進(jìn)程。從工具箱中拖拽一個(gè)活動(dòng)到設(shè)計(jì)界面中,放置在并行分支節(jié)點(diǎn)的下方偏右側(cè)區(qū)域,命名為Dispatch goods。建立分支節(jié)點(diǎn)指向Dispatch goods活動(dòng)的連接器。
Figure?69?添加配貨活動(dòng)
6. 在并行分支節(jié)點(diǎn)的左側(cè),建立與配貨進(jìn)程并行的付款進(jìn)程。通過需求分析建模中順序圖的描述,我們 了解到,付款行為并不真正由系統(tǒng)完成,而是客戶首先出發(fā)系統(tǒng)的付款事件,然后系統(tǒng)會(huì)直接將事件請(qǐng)求發(fā)送到銀行,并同樣利用事件機(jī)制監(jiān)聽銀行端發(fā)回的付款確認(rèn)。由此我們需要兩個(gè)新的活動(dòng)。一個(gè)是用來發(fā)送請(qǐng)求的事件活動(dòng),一個(gè)是用來接收回發(fā)的事件活動(dòng)。因此,從工具箱中首先拖拽一個(gè)發(fā)送請(qǐng)求活動(dòng)到設(shè)計(jì)界面中并行分支活動(dòng)的左側(cè),命名為Send invoice。并建立從并行分支活動(dòng)到Send invoice活動(dòng)的連接器。
Figure?70?添加與配貨活動(dòng)并行的發(fā)送請(qǐng)求活動(dòng)
7. 在發(fā)送請(qǐng)求Send invoice活動(dòng)的下方,再?gòu)墓ぞ呦渲型献б粋€(gè)接收事件活動(dòng),命名為Receive payment。建立從Send invoice活動(dòng)到Receive payment活動(dòng)的連接器。
Figure?71?添加接收付款確認(rèn)事件
8. 兩個(gè)并行處理進(jìn)程定義好之后,需要最終匯集到主要處理流程上繼續(xù)執(zhí)行,所以需要從工具箱中拖拽一個(gè)并行匯總圖標(biāo)到設(shè)計(jì)界面的下方,命名為JoinCreateOrder。分別從Receive payment活動(dòng)和Dispatch goods活動(dòng)向并行匯總圖標(biāo)建立連接器
Figure?72?添加并行匯總節(jié)點(diǎn)
9. 最后是關(guān)閉訂單,也代表著訂單處理成功。所以需要從工具箱中拖拽一個(gè)活動(dòng)到設(shè)計(jì)界面的下方,命名為Close Order。在Close Order活動(dòng)的下方再放置一個(gè)活動(dòng)終結(jié)圖標(biāo)。分別從上到下建立連接線。
Figure?73?完成創(chuàng)建訂單活動(dòng)圖
到此創(chuàng)建訂單的活動(dòng)就完成了。保存并關(guān)閉當(dāng)前設(shè)計(jì)界面。
Task?2?–?數(shù)據(jù)流圖
你還可以使用數(shù)據(jù)流圖來描述數(shù)據(jù)從一個(gè)動(dòng)作流向另一個(gè)動(dòng)作。這個(gè)任務(wù)中,我們模擬訂單生成過程中數(shù)據(jù)的流向及其對(duì)存儲(chǔ)介質(zhì)以及活動(dòng)的影響。在生成訂單過程中,訂單小項(xiàng)和客戶地址分別會(huì)有不同的數(shù)據(jù)流向,也會(huì)影響不同的活動(dòng),所以我們以訂單中的這兩部分?jǐn)?shù)據(jù)作為任務(wù)的開始。
1. 在解決方案瀏覽器中右鍵單擊ModelingProjectDinnerNow項(xiàng)目根節(jié)點(diǎn),在菜單中選擇添加->添加新項(xiàng)
2. 在添加新項(xiàng)對(duì)話框中選擇UML活動(dòng)圖模板,并定義名稱為UMLActivityDiagramOrderDataflows.activitydiagram.
3. 從工具箱中拖拽兩個(gè)活動(dòng)參數(shù)圖標(biāo)到設(shè)計(jì)界面,水平并排放置,通過單擊圖標(biāo)上的文本,使其可編輯。分別命名為Item list和Customer Address。
4. 訂單生成的過程首先會(huì)按照當(dāng)前訂單中的商品列表,在商品庫(kù)存中找到相應(yīng)的商品。所以需要從工具箱中拖拽一個(gè)活動(dòng)到設(shè)計(jì)界面中,Item list的下方。命名為Find goods in warehouse。
Figure?74?添加查找?guī)齑尕浳锘顒?dòng)
5. 由于Item list是以參數(shù)的形式進(jìn)入Find goods in warehouse活動(dòng)的。所以我們需要給Find goods in warehouse活動(dòng)定義輸入接口。右鍵單擊Find goods in warehouse活動(dòng),在右鍵菜單中選擇添加->Input pin。通過單擊接口上的文本Input1,使其可編輯,并將文本定義為Item list。然后從Item list參數(shù)圖標(biāo),到新建的輸入接口添加連接器。
Figure?75?添加輸入?yún)?shù)接口的右鍵菜單
Figure?76?為Find goods in warehouse活動(dòng)添加輸入?yún)?shù)Item list
6. 客戶的地址需要生成為派送貨物時(shí)的地址標(biāo)簽。所以Customer Address應(yīng)該是Print address label活動(dòng)的輸入?yún)?shù)。所以,重復(fù)步驟4、5。添加Print address label活動(dòng),并為其添加輸入?yún)?shù)接口Customer Address。
Figure?77?添加Print address label活動(dòng),并定義它的Customer Address輸入?yún)?shù)
7. 當(dāng)系統(tǒng)在物品庫(kù)存中找到了客戶選擇的物品后,會(huì)完成兩個(gè)工作。一是把每個(gè)購(gòu)買物品的數(shù)量從庫(kù)存數(shù)量中減去。二是生成訂單號(hào),以便唯一記錄或查閱訂單。要完成第一個(gè)任務(wù),我們需要定義一個(gè)對(duì)象,來保存需要修改的物品數(shù)量記錄。所以,從工具箱中拖拽一個(gè)對(duì)象節(jié)點(diǎn)圖標(biāo)到設(shè)計(jì)界面中Find goods in warehouse活動(dòng)的下方,單擊文本Object1將其內(nèi)容修改為Stock Update Record。由于不存在參數(shù)的關(guān)系,所以只需直接從Find goods in warehouse活動(dòng)到Stock Update Record對(duì)象建立連接器。
Figure?78?添加Stock Update Record對(duì)象
8. 系統(tǒng)會(huì)使用專門的活動(dòng)來將Stock Update Record對(duì)象中保留的數(shù)據(jù),更新到實(shí)際的數(shù)據(jù)庫(kù)中。從工具箱中拖拽一個(gè)活動(dòng)到設(shè)計(jì)界面,放置在Stock Update Record對(duì)象的下方,并將其命名為Update stock database。并建立從Stock Update Record對(duì)象到Update stock database活動(dòng)的連接器。(這里不使用參數(shù)的原因是由于Stock Update Record是對(duì)象,可以擁有并調(diào)用自己專屬的方法,而不是將自己作為參數(shù)傳遞給別人的活動(dòng))
Figure?79?添加Update stock database活動(dòng)
9. 步驟7中提到的第二件事就是生成訂單號(hào),而訂單號(hào)會(huì)與打印的地址標(biāo)簽一同成為配送物品的重要依據(jù)。所以從工具箱中拖拽一個(gè) 新的活動(dòng),放置在Find goods in warehouse活動(dòng)和Print address label活動(dòng)的下方。將其命名為pack goods。
Figure?80?添加Pack goods活動(dòng)
10. Pack goods活動(dòng)需要的兩個(gè)輸入?yún)?shù):訂單號(hào)和地址標(biāo)簽,分別來自于Find goods in warehouse活動(dòng)和Print address label活動(dòng)。所以可以參照步驟4、5分別為Find goods in warehouse活動(dòng)和Print address label活動(dòng)添加輸出參數(shù)接口,分別命名為Order Id和Address label。與之對(duì)應(yīng)的,要在Pack goods活動(dòng)上建立兩個(gè)輸入?yún)?shù)接口用來接收Order Id和Address label。最后,分別從Order Id輸出參數(shù)接口和Address label接口,到Pack goods活動(dòng)上各自給定的輸入?yún)?shù)接口,建立連接器。
Figure?81?為Pack goods活動(dòng)提供參數(shù)來源
11. 當(dāng)Pack goods活動(dòng)完成后,就可以發(fā)貨給客戶。此時(shí)在Pack goods活動(dòng)下方簡(jiǎn)單添加一個(gè)活動(dòng),命名為Ship goods to customer。
Figure?82?添加送貨活動(dòng)
12. 到此,關(guān)于生成訂單與送貨的數(shù)據(jù)流程圖就完成了,保存并關(guān)閉當(dāng)前設(shè)計(jì)界面。
Task?3?–?組件圖
在Visual Studio 旗艦版中,組件圖展示的是軟件系統(tǒng)設(shè)計(jì)的組成部分。組件圖可以幫助你可視化的定義高層次的系統(tǒng)結(jié)構(gòu)以及服務(wù)行為的接口與調(diào)用。這個(gè)任務(wù)中我們模擬客戶使用Web瀏覽器與我們的Dinner Now系統(tǒng)完成訂餐過程的組件間關(guān)系。
1. 在解決方案瀏覽器中右鍵單擊ModelingProjectDinnerNow項(xiàng)目根節(jié)點(diǎn),在菜單中選擇添加->添加新項(xiàng)
2. 在添加新項(xiàng)對(duì)話框中選擇UML組件圖模板,并定義名稱為UMLComponentDiagramDinnerNow.componentdiagram.點(diǎn)擊添加,進(jìn)入組件圖設(shè)計(jì)界面。
Figure?83?新建組件圖
3. 從工具箱中拖拽一個(gè)組件圖標(biāo)到設(shè)計(jì)界面,單擊文本Component1,將其修改為Web Browser。單擊Web Browser組件左上角的收放箭頭,將其收縮。
Figure?84?添加Web Browser組件
4. 從工具箱中拖拽另一個(gè)組件圖標(biāo)到設(shè)計(jì)界面,單擊Component1文本,將其修改為DinnerNow Web Service。調(diào)整其大小如下圖所示
Figure?85?添加Web Browser組件
5. 在 DinnerNow Web Service組件中應(yīng)該提供了餐廳所擁有的功能,如招待客戶訂餐的服務(wù)和進(jìn)行餐飲烹飪的服務(wù)。所以,模仿步驟3,在DinnerNow Web Service組件中放置兩個(gè)小的組件,分別命名為Customer Web Server和Kitchen Server。在屬性選項(xiàng)卡中,修改名稱屬性為相應(yīng)的名稱。
Figure?86?在DinnerNow Web Server組件中添加Customer Web Server?組件和Kitchen Server?組件,并重命名
6. 客戶通過瀏覽器請(qǐng)求訪問到DinnerNow Web Service組件中的Customer Web Server組件,進(jìn)行餐飲相關(guān)的檢索和訂餐。所以右鍵單擊Web Browser組件,選擇添加->請(qǐng)求接口。
Figure?87?添加請(qǐng)求接口菜單項(xiàng)
7. 由于瀏覽器請(qǐng)求DinnerNow Web Service使用HTTP協(xié)議,單擊請(qǐng)求接口的文本Interface1,修改為HTTP,并在屬性選項(xiàng)卡中將HTTP請(qǐng)求接口名稱Port1修改為HTTP。
Figure?88?添加HTTP請(qǐng)求接口
8. Web Browser組件的請(qǐng)求要想進(jìn)入DinnerNow Web Service組件,后者必須提供一個(gè)提供程序接口用來響應(yīng)。所以右鍵單擊DinnerNow Web Service組件,選擇添加->提供程序接口。
Figure?89?為DinnerNow WebService添加提供程序接口
9. 單擊提供程序接口上的文本Interface2,將其修改為Customer Web Site。在屬性選項(xiàng)卡中,將名稱Port1修改為Customer Web Site
Figure?90?定義DinnerNow WebService提供程序接口的名稱
10.?右鍵單擊Web Browser組件的HTTP請(qǐng)求接口,選擇添加->依賴。
Figure?91?添加依賴關(guān)系的右鍵菜單
11. 將依賴關(guān)系的另一頭拖放到DinnerNow Web Service組件的Customer Web Site提供程序接口,并單擊。
Figure?92?拖放依賴關(guān)系
Figure?93?建立依賴關(guān)系后的效果
12. 客戶的訂餐請(qǐng)求經(jīng)過Customer Web Site接收后,進(jìn)入DinnerNow Web Service執(zhí)行,但是要想讓內(nèi)部的組件獲得外部的請(qǐng)求,同樣需要在內(nèi)部組件上建立提供程序接口用來接收進(jìn)入DinnerNow Web Service的請(qǐng)求。參考步驟10,為Customer Web Server組件添加一個(gè)名稱為Sales的提供程序接口。
Figure?94?建立Sales接口
13. 在組件內(nèi)部的各個(gè)部分之間,存在著消息或事件的傳遞,就是委托。所以,在消息內(nèi)部的接口之間使用委托關(guān)系來表示消息的流向和事件的響應(yīng)。參考步驟11,在Customer Web Site接口與Sales接口之間建立委托關(guān)系.
Figure?95?建立從Customer Web Site接口到Sales接口的委托關(guān)系
14. 進(jìn)入Customer Web Server組件的訂餐請(qǐng)求,經(jīng)過處理之后,會(huì)執(zhí)行兩件事。一是向銀行發(fā)送付款驗(yàn)證,二是將客戶的菜單發(fā)送到廚房進(jìn)行加工。由于銀行屬于DinnerNow Web Service組件的外部,且DinnerNow Web Service只需向銀行發(fā)送付款驗(yàn)證請(qǐng)求即可。所以,參考步驟6、7,為Customer Web Server組件添加PaymentAuthorization請(qǐng)求接口
Figure?96?為Customer Web Server組件添加PaymentAuthorization請(qǐng)求接口
15. DinnerNow Web Service組件內(nèi)部的部件要想將消息發(fā)送到組件外部的其他系統(tǒng)中,也需要一個(gè)向外的請(qǐng)求接口。所以參考步驟8、9,在DinnerNow Web Service組件左側(cè)?邊框上添加一個(gè)PaymentAuthorization請(qǐng)求接口,用來將Customer Web Server組件的PaymentAuthorization接口發(fā)送的消息傳遞到DinnerNow Web Service組件外部
Figure?97?為DinnerNow Web Service組件添加PaymentAuthorization請(qǐng)求接口
16. 參考步驟13,從Customer Web Server組件的PaymentAuthorization請(qǐng)求接口到DinnerNow Web Service組件的PaymentAuthorization請(qǐng)求接口建立委托關(guān)系。這樣就完成了Customer Web Server向外部銀行的消息傳遞。
Figure?98?從內(nèi)部PaymentAuthorization接口到外部PaymentAuthorization接口建立委托關(guān)系
17. Customer Web Server組件的另一個(gè)功能是將客戶的菜單送到廚房進(jìn)行加工。所以,參考步驟14,為Customer Web Server組件建立另一個(gè)請(qǐng)求接口,名稱為MealOrdering。
Figure?99?為Customer Web Server組件添加MealOrdering接口
18. 參考步驟12,為Kitchen Server組件添加一個(gè)提供程序接口,命名為MealOrdering。
Figure?100?為Kitchen Server組件添加MealOrdering接口
19. 由于Customer Web Server和Kitchen Server 兩個(gè)組件同處在DinnerNow Web Service組件內(nèi)部,所以 不需要消息的傳遞和事件機(jī)制,而應(yīng)該建立直接的調(diào)用關(guān)系。右鍵單擊Customer Web Server組件的MealOrdering請(qǐng)求接口,選擇添加->部件引用。然后將鼠標(biāo)拖放到Kitchen Server組件的MealOrdering提供程序接口上,建立 直接的程序集調(diào)用關(guān)系。
Figure?101?從?Customer Web Server組件的?請(qǐng)求接口?到?Kitchen Server組件的?MealOrdering提供程序接口建立部件程序集引用關(guān)系
20. Kitchen Server組件將接受來自廚房提交的菜品制作順序,而Kitchen Server會(huì)按照制作順序進(jìn)行制作。真實(shí)的廚房應(yīng)該屬于DinnerNow Web Service組件外部的元素。所以,參考步驟8、9,在DinnerNow Web Service組件的右邊界,添加一個(gè)提供程序接口,命名為Kitchen Web Site。再參照步驟18,在Kitchen Server組件上添加一個(gè)提供程序接口,命名為KitchenWorkQueue。并參考步驟13,從前者到后者建立委托關(guān)系。
Figure?102?建立Kitchen Web Site提供程序接口和KitchenWorkQueue提供程序接口,并建立二者之間的委托關(guān)系
21. 至此,我們完成了客戶訂餐到廚房加工幾個(gè)環(huán)節(jié)的組件圖,保存并關(guān)閉設(shè)計(jì)界面
Task?4?–?類圖
軟件設(shè)計(jì)建模中的UML類圖描述了你的應(yīng)用程序中使用的對(duì)象和消息結(jié)構(gòu)。這些對(duì)象和消息,既包括系統(tǒng)內(nèi)部的調(diào)用,又包含系統(tǒng)與用戶的交互信息。它所描述的信息沒有任何實(shí)現(xiàn)。它的類和關(guān)系可以使用多種方式實(shí)現(xiàn),如數(shù)據(jù)庫(kù)表、XML節(jié)點(diǎn)、或者軟件對(duì)象組件。這個(gè)案例中,我們需要對(duì)用戶需求建模中的概念類圖進(jìn)行一定的修改
1. 在解決方案瀏覽器中的ModelingProjectDinnerNow解決方案下,雙擊類圖UMLClassDiagramDinnerNow.classdiagram,在設(shè)計(jì)界面中打開類圖。
2. 由于菜單與菜單項(xiàng)之間是所有權(quán)的關(guān)系,而訂單與訂單項(xiàng)是整體與部分的關(guān)系,所以這里要修改Menu與MenuItem之間的關(guān)系為所有權(quán)關(guān)系。單擊選中Menu類與MenuItem類之間的關(guān)系,并保持選中狀態(tài)。打開屬性選項(xiàng)卡,依次展開Navigation->First Role組。在First Role組中,找到Aggregation屬性,并在下拉列表選項(xiàng)中將值Composite,修改為Shared,此時(shí)效果如下圖所示,Menu與MenuItem類之間的關(guān)系變成了空心菱形的所有權(quán)關(guān)系
Figure?103?修改Menu類與MenuItem類之間的關(guān)系為所有權(quán)關(guān)系
3. 通常訂單總是需要一個(gè)訂單總價(jià),所以我們?yōu)镺rder類添加一個(gè)保存總價(jià)的屬性。單擊Order類左上角的擴(kuò)展箭頭,展開Order類。
Figure?104?展開Order類
4. 右鍵單擊Order類的Attributes組,在彈出的菜單中選擇添加->屬性
Figure?105?添加屬性右鍵菜單
5. 此時(shí),在Order類的屬性組內(nèi)出現(xiàn)一個(gè)可編輯的屬性,文本為+Attribute1。保持可編緝狀態(tài),將文本+Attribute1修改為+TotalPrice。然后按下回車,確認(rèn)修改。
Figure?106?修改TotalPrice屬性名
6. 再次單擊選中TotalPrice屬性,在屬性窗口中的常用屬性組中找到類型屬性。在下拉列表中輸入Money。表示這個(gè)總價(jià)屬性是貨幣類型。
Figure?107?修改TotalPrice屬性的數(shù)據(jù)類型
7. 在Order類中,常用的對(duì)訂單的操作,這里舉兩個(gè)例子。一個(gè)是添加訂單項(xiàng),一個(gè)是刪除訂單項(xiàng)。右鍵單擊Order類的操作組,在右鍵菜單中選擇添加->操作
Figure?108?為Order類添加方法菜單
8. 此時(shí),在操作組內(nèi)會(huì)出現(xiàn)一個(gè)可編輯的操作,文本為+ Operation1(),將其修改為+ AddItem()。按下回車,確認(rèn)修改。
Figure?109?為Order類添加AddItem方法
9. Order類中的添加訂單項(xiàng)方法,如果要執(zhí)行,必須接受一個(gè)訂單項(xiàng),作為待插入的資源。單擊AddItem操作,在屬性選項(xiàng)卡中找到參數(shù)列表屬性,單擊屬性值文本框中的省略號(hào)按鈕,打開
Figure?110?打開參數(shù)列表屬性的省略號(hào)按鈕
Figure?111?操作參數(shù)集合編輯器
10. 如上圖所示,點(diǎn)擊左下角的添加按鈕。在成員列表中選中自動(dòng)添加的Parameter1參數(shù),在右側(cè)屬性列表中,找到Name屬性,將其修改為MenuItem,在Type屬性的下拉列表中,選擇ModelingProjectDinnerNow::MenuItem。單擊確定完成參數(shù)的定義
Figure?112?為AddItem方法添加MenuItem參數(shù)
11. 參照步驟9、10,為Order類添加DeleteItem方法,并添加MenuItem參數(shù)。
Figure?113?添加DeleteItem方法
12. 通常餐廳除了支持網(wǎng)上下單外,更靈活的方式是電話訂餐。此時(shí)生成的訂單是電話訂單。而電話訂單中包含了普通訂單的所有數(shù)據(jù),但是卻擁有一個(gè)特殊的屬性,就是訂單反饋的電話。在設(shè)計(jì)界面的右下角空白處,單擊右鍵,選擇添加->類
Figure?114?添加新類
13. 單擊Class1類名部分,使其可編輯。將文本Class1修改為PhoneOrder。
Figure?115?修改PhoneOrder類名
14. 參照步驟4、5、6,為PhoneOrder類添加一個(gè)字符串類型屬性:CallbackNumber
Figure?116?為PhoneOrder類添加CallbackNumber屬性
15.?右鍵單擊PhoneOrder類,在菜單中選擇添加->繼承。
Figure?117?添加繼承菜單
16. 將鼠標(biāo)移動(dòng)到Order類上,直到出現(xiàn)連接標(biāo)識(shí)。點(diǎn)擊Order類,確認(rèn)建立繼承關(guān)系
Figure?118?建立PhoneOrder類到Order類的繼承關(guān)系
Figure?119?建立PhoneOrder類到Order類的繼承關(guān)系完成
17. 至此,更詳細(xì)的類圖的設(shè)計(jì)就完成了。保存并關(guān)閉當(dāng)前設(shè)計(jì)界面
Exercise 3?代碼瀏覽器
概述
當(dāng)你需要修改現(xiàn)有軟件系統(tǒng)時(shí),Visual Studio旗艦版可以幫助你以可視化的方式理解組織結(jié)構(gòu)、關(guān)系以及代碼中的行為。在你修改代碼之前,使用Visual Studio 旗艦版來瀏覽這些更改如何影響代碼,從而幫助你評(píng)估風(fēng)險(xiǎn)和工作量。
?
Task 1 –?從現(xiàn)有代碼生成圖形化文檔——查看Visual Studio解決方案中的源代碼概要
1. 打開需要查看的Visual Studio 解決方案,這里我們使用PetShop.
2. 在Visual Studio 2010的頂部菜單中選擇架構(gòu)菜單。在架構(gòu)菜單中選擇生成依賴圖形。接下來可選擇以下選項(xiàng)之一執(zhí)行
| 生成依賴圖形 | 圖形顯示的內(nèi)容 |
| 按照程序集引用 | 解決方案中的所有程序集間,以及內(nèi)部程序集與外部依賴項(xiàng)之間的聚集依賴關(guān)系。 為了查看命名空間、類和內(nèi)部方法,以圖形化的方式展開引用。外部組件,只顯示在項(xiàng)目中使用到的。 |
| 按照命名空間 | 解決方案中的所有命名空間之間,以及內(nèi)部命名空間與外部依賴的命名空間之間的聚集依賴關(guān)系。 為了查看命名空間里的類和方法,以圖形化的方式展開命名空間。外部命名空間,只顯示在項(xiàng)目中使用到的。 |
| 按照類 | 解決方案中的所有類之間的聚集依賴關(guān)系。不會(huì)出現(xiàn)用到的外部類的信息。 |
Figure?120?生成依賴圖形的菜單項(xiàng)
Figure?121?按程序集引用瀏覽的架構(gòu)圖
Figure?122?按命名空間瀏覽的架構(gòu)圖
Figure?123?按類結(jié)構(gòu)瀏覽的架構(gòu)圖
Task 2 –從現(xiàn)有代碼生成圖形化文檔——查看Visual Studio 解決方案中的源代碼的特定依賴
利用架構(gòu)資源管理可視化的查看你需要的代碼和關(guān)系。
1. 打開需要查看的Visual Studio 解決方案,這里我們使用PetShop.
2. 如果架構(gòu)瀏覽器沒有打開,在架構(gòu)菜單中,點(diǎn)擊Windows->架構(gòu)瀏覽器
Figure?124?從菜單打開架構(gòu)瀏覽器
3. 在架構(gòu)瀏覽器的第一列中的Visual Studio節(jié)點(diǎn)下選擇如下兩項(xiàng):
l 類視圖:用來查看代碼的邏輯結(jié)構(gòu)。以命名空間、類、方法等形式瀏覽。
Figure?125?類視圖效果
l 解決方案視圖:用來查看代碼的物理結(jié)構(gòu)。以項(xiàng)目、源文件等形式瀏覽。
Figure?126?解決方案視圖效果
4. 選中類視圖/解決方案視圖,右側(cè)會(huì)出現(xiàn)命名空間/項(xiàng)目列表。在列表選擇你想查看的命名空間/項(xiàng)目。全選使用Ctrl+A。多選時(shí),按住Ctrl。在第二列選擇要查看的對(duì)象同時(shí),第三列會(huì)彈出類/文件列表
5. 重復(fù)步驟4,選中你想要查看的對(duì)象。這里我們?cè)?strong>命名空間/項(xiàng)目列表中選中:BLL。并使用Ctrl+A全選類型和成員列表中的所有項(xiàng)。
Figure?127?創(chuàng)建新的圖形文檔的按鈕
6. 需要為你選中的對(duì)象建立新的關(guān)系圖,請(qǐng)?jiān)诩軜?gòu)瀏覽器的左上角標(biāo)題欄下方,單擊為你選擇的節(jié)點(diǎn)創(chuàng)建一個(gè)新的圖形文檔按鈕。此時(shí)Visual Studio 就會(huì)創(chuàng)建一個(gè)向?qū)D形文檔(.dgml),并打開它。
Figure?128?生成的向?qū)D形文檔
7. 到此,我們就成功將現(xiàn)有代碼展示成了可視化文檔。保存并關(guān)閉當(dāng)前設(shè)計(jì)界面。
?
原文地址:http://www.cnblogs.com/Phoenix-Rock/archive/2010/08/11/VS2010-Model.html
轉(zhuǎn)載于:https://www.cnblogs.com/mqxs/p/5793223.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的【转】【UML】使用Visual Studio 2010 Team System中的架构师工具(设计与建模)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 卢伟冰:小米MIX Fold 2薄到不可
- 下一篇: 俞敏洪称张朝阳是互联网祖师爷:马云、马化