面向?qū)ο蟮膯栴}的處理的關(guān)鍵是建模問題。建??梢园言趶?fù)雜世界的許多重要的細(xì)節(jié)給抽象出。許多建模工具封裝了UML(也就是Unified Modeling Language?),這篇課程的目的是展示出UML的精彩之處。 UML中有九種建模的圖標(biāo),即: - 用例圖
- 類圖
- 對象圖
- 順序圖
- 協(xié)作圖
- 狀態(tài)圖
- 活動圖
- 組件圖
- 配置圖
本課程中的某些部分包含了這些圖的細(xì)節(jié)信息的頁面鏈接。而且每個部分都有一個小問題,測試一下你對這個部分的理解。 為什么UML很重要? 為了回答這個問題,我們看看建筑行業(yè)。設(shè)計(jì)師設(shè)計(jì)出房子。施工人員使用這個設(shè)計(jì)來建造房子。建筑越復(fù)雜,設(shè)計(jì)師和施工人員之間的交流就越重要。藍(lán)圖就成為了這個行業(yè)中的設(shè)計(jì)師和施工人員的必修課。 寫軟件就好像建造建筑物一樣。系統(tǒng)越復(fù)雜,參與編寫與配置軟件的人員之間的交流也就越重要。在過去十年里UML就成為分析師,設(shè)計(jì)師和程序員之間的“建筑藍(lán)圖”。現(xiàn)在它已經(jīng)成為了軟件行業(yè)的一部分了。UML提供了分析師,設(shè)計(jì)師和程序員之間在軟件設(shè)計(jì)時的通用語言。 UML被應(yīng)用到面向?qū)ο蟮膯栴}的解決上。想要學(xué)習(xí)UML必須熟悉面向?qū)ο蠼鉀Q問題的根本原則――都是從模型的建造開始的。一個模型model就是根本問題的抽象。域domain就是問題所處的真實(shí)世界。 模型是由對象objects組成的,它們之間通過相互發(fā)送消息messages來相互作用的。記住把一個對象想象成“活著的”。對象有他們知道的事(屬性attributes)和他們可以做的事(行為或操作behaviors or operations)。對象的屬性的值決定了它的狀態(tài)state。 類Classes是對象的“藍(lán)圖”。一個類在一個單獨(dú)的實(shí)體中封裝了屬性(數(shù)據(jù))和行為(方法或函數(shù))。對象是類的實(shí)例instances。 用例圖 用例圖Use case diagrams描述了作為一個外部的觀察者的視角對系統(tǒng)的印象。強(qiáng)調(diào)這個系統(tǒng)是什么而不是這個系統(tǒng)怎么工作。 用例圖與情節(jié)緊緊相關(guān)的。情節(jié)scenario是指當(dāng)某個人與系統(tǒng)進(jìn)行互動時發(fā)生的情況。下面是一個醫(yī)院門診部的情節(jié)。 “一個病人打電話給門診部預(yù)約一年一次的身體檢查。接待員找出在預(yù)約記錄本上找出最近的沒有預(yù)約過的時間,并記上那個時間的預(yù)約記錄?!?/p> 用例Use case是為了完成一個工作或者達(dá)到一個目的的一系列情節(jié)的總和。角色actor是發(fā)動與這個工作有關(guān)的事件的人或者事情。角色簡單的扮演著人或者對象的作用。下面的圖是一個門診部Make Appointment用例。角色是病人。角色與用例的聯(lián)系是通訊聯(lián)系communication association(或簡稱通訊communication) 
角色是人狀的圖標(biāo),用例是一個橢圓,通訊是連接角色和用例的線。 一個用例圖是角色,用例,和它們之間的聯(lián)系的集合。我們已經(jīng)把Make Appointment作為一個含有四個角色和四個用例的圖的一部分。注意一個單獨(dú)的用例可以有多個角色。 
用例圖在三個領(lǐng)域很有作用。 - 決定特征(需求)。當(dāng)系統(tǒng)已經(jīng)分析好并且設(shè)計(jì)成型時,新的用例產(chǎn)生新的需求
- 客戶通訊。使用用例圖很容易表示開發(fā)者與客戶之間的聯(lián)系。
- 產(chǎn)生測試用例。一個用例的情節(jié)可能產(chǎn)生這些情節(jié)的一批測試用例。
類圖 類圖Class diagram通過顯示出系統(tǒng)的類以及這些類之間的關(guān)系來表示系統(tǒng)。類圖是靜態(tài)的-它們顯示出什么可以產(chǎn)生影響但不會告訴你什么時候產(chǎn)生影響。 下面是一個顧客從零售商處預(yù)定商品的模型的類圖。中心的類是Order。連接它的是購買貨物的Customer和Payment。Payment有三種形式:Cash,Check,或者Credit。訂單包括OrderDetails(line item),每個這種類都連著Item。 
UML類的符號是一個被劃分成三塊的方框:類名,屬性,和操作。抽象類的名字,像Payment是斜體的。類之間的關(guān)系是連接線。 類圖有三種關(guān)系。 - 關(guān)聯(lián)association-表示兩種類的實(shí)例間的關(guān)系。如果一個類的實(shí)例必須要用另一個類的實(shí)例才能完成工作時就要用關(guān)聯(lián)。在圖中,關(guān)聯(lián)用兩個類之間的連線表示。
- 聚合aggregation-當(dāng)一個類屬于一個容器時的一種特殊關(guān)系。聚合用一個帶菱形的連線,菱形指向具有整體性質(zhì)的類。在我們的圖里,Order是OrderDetails的容器。
- 泛化generalization-一個指向以其他類作為超類的繼承連線。泛化關(guān)系用一個三角形指向超類。Payment是Cash,Check和Credit的超類。
一個關(guān)聯(lián)有兩個尾端。每個尾端可以有一個角色名role name來說明關(guān)聯(lián)的作用。比如,一個OrderDetail實(shí)例是一個Order實(shí)例的項(xiàng)目。 關(guān)聯(lián)上的方向性navigability箭頭表示該關(guān)聯(lián)傳遞或查詢的方向。OrderDetail類可以查詢他的Item,但不可以反過來查詢。箭頭方向同樣可以告訴你哪個類擁有這個關(guān)聯(lián)的實(shí)現(xiàn);也就是,OrderDetail擁有Item。沒有方向性的箭頭的關(guān)聯(lián)是雙向。 關(guān)聯(lián)尾端的數(shù)字表示該關(guān)聯(lián)另一邊的一個實(shí)例可以對應(yīng)的數(shù)字端的實(shí)例的格數(shù),通過這種方式表達(dá)關(guān)聯(lián)的多樣性multiplicity。多樣性的數(shù)字可以是一個單獨(dú)的數(shù)字或者是一個數(shù)字的范圍。在例子中,每個Order只有一個Customer,但一個Customer可以有任意多個Order。 下面這個表給出了最普遍的多樣性示例。 多樣性 | 意義 |
---|
0..1 | 0或1個實(shí)例. n..m符號表示有n到m個實(shí)例 | 0..* or * | 沒有實(shí)例格數(shù)的限制(包括沒有). | 1 | 只有一個實(shí)例 | 1..* | 最少一個實(shí)例 |
每個類圖包括類,關(guān)聯(lián)和多樣性表示。方向性和角色是為了使圖示得更清楚時可選的項(xiàng)目。 包和對象圖 為了簡單地表示出復(fù)雜的類圖,可以把類組合成包packages。一個包是UML上有邏輯關(guān)系的元件的集合。下面這個圖是是一個把類組合成包的一個商業(yè)模型。 dependencies關(guān)系。如果另一個的包B改變可能會導(dǎo)致一個包A改變,則包A依賴包B。 
包是用一個在上方帶有小標(biāo)簽的矩形表示的。包名寫在標(biāo)簽上或者在矩形里面。點(diǎn)化線箭頭表示依賴 對象圖Object diagrams用來表示類的實(shí)例。他們在解釋復(fù)雜關(guān)系的細(xì)小問題時(特別是遞歸關(guān)系時)很有用。 這個類圖示一個大學(xué)的Department可以包括其他很多的Departments。 
這個對象圖示上面類圖的實(shí)例。用了很多具體的例子。 UML中實(shí)例名帶有下劃線。只要意思清楚,類或?qū)嵗梢栽趯ο髨D中被省略。 
每個類圖的矩形對應(yīng)了一個單獨(dú)的實(shí)例。實(shí)例名稱中所強(qiáng)調(diào)的UML圖表。類或?qū)嵗拿Q可能是省略對象圖表只要圖的意義仍然是明確的。 順序圖 類圖和對象圖是靜態(tài)模型的視圖。交互圖是動態(tài)的。他們描述了對象間的交互作用。 順序圖將交互關(guān)系表示為一個二維圖??v向是時間軸,時間沿豎線向下延伸。橫向軸代表了在協(xié)作中各獨(dú)立對象的類元角色。類元角色用生命線表示。當(dāng)對象存在時,角色用一條虛線表示,當(dāng)對象的過程處于激活狀態(tài)時,生命線是一個雙道線。 消息用從一個對象的生命線到另一個對象生命線的箭頭表示。箭頭以時間順序在圖中從上到下排列。 
協(xié)作圖 協(xié)作圖也是互動的圖表。他們像序列圖一樣也傳遞相同的信息,但他們不關(guān)心什么時候消息被傳遞,只關(guān)心對象的角色。在序列圖中,對象的角色放在上面而消息則是連接線。 
對象角色矩形上標(biāo)有類或?qū)ο竺ɑ蛘叨加校?。類名前面有個冒號(:)。 協(xié)作圖的每個消息都有一個序列號。頂層消息的數(shù)字是1。同一個等級的消息(也就是同一個調(diào)用中的消息)有同樣的數(shù)字前綴,再根據(jù)他們出現(xiàn)的順序增加一個后綴1,2等等。 狀態(tài)圖 對象擁有行為和狀態(tài)。對象的狀態(tài)是由對象當(dāng)前的行動和條件決定的。狀態(tài)圖statechart diagram顯示出了對象可能的狀態(tài)以及由狀態(tài)改變而導(dǎo)致的轉(zhuǎn)移。 我們的模型例圖建立了一個銀行的在線登錄系統(tǒng)。登錄過程包括輸入合法的密碼和個人賬號,再提交給系統(tǒng)驗(yàn)證信息。 登錄系統(tǒng)可以被劃分為四種不重疊的狀態(tài):Getting SSN, Getting PIN, Validating, 以及 Rejecting。每個狀態(tài)都有一套完整的轉(zhuǎn)移transitions來決定狀態(tài)的順序。 
狀態(tài)是用圓角矩形來表示的。轉(zhuǎn)移則是使用帶箭頭的連線表示。觸發(fā)轉(zhuǎn)移的事件或者條件寫在箭頭的旁邊。我們的圖上有兩個自轉(zhuǎn)移。一個是在Getting SSN,另一個則在上Getting PIN。 初始狀態(tài)(黑色圓圈)是開始動作的虛擬開始。結(jié)束狀態(tài)也是動作的虛擬結(jié)束。 事件或條件觸發(fā)動作時用(/動作)表示。當(dāng)進(jìn)入Validating狀態(tài)時,對象并不等外部事件觸發(fā)轉(zhuǎn)移。取而代之,它產(chǎn)生一個動作。動作的結(jié)果決定了下一步的狀態(tài)。 活動圖 活動圖activity diagram是一個很特別的流程圖?;顒訄D和狀態(tài)圖之間是有關(guān)系的。狀態(tài)圖把焦點(diǎn)集中在過程中的對象身上,而活動圖則集中在一個單獨(dú)過程動作流程?;顒訄D告訴了我們活動之間的依賴關(guān)系。 對我們的例子來說,我們使用如下的過程。 “通過ATM來取錢?!?/p> 這個活動有三個類Customer, ATM和 Bank。整個過程從黑色圓圈開始到黑白的同心圓結(jié)束?;顒佑脠A角矩形表示。 
活動圖可以被分解成許多對象泳道swimlanes ,可以決定哪些對象負(fù)責(zé)那些活動。每個活動都有一個單獨(dú)的轉(zhuǎn)移transition連接這其他的活動。 轉(zhuǎn)移可能分支branch成兩個以上的互斥的轉(zhuǎn)移。保護(hù)表達(dá)式(在[]中)表示轉(zhuǎn)移是從一個分支中引出的。分支以及分支結(jié)束時的合并merge在圖中用菱形表示。 轉(zhuǎn)移也可以分解fork成兩個以上的并行活動。分解以及分解結(jié)束時的線程結(jié)合join在圖中用粗黑線表示 組件與配置圖 組件component是代碼模塊。組件圖是是類圖的物理實(shí)現(xiàn)。 配置圖Deployment diagrams則是顯示軟件及硬件的配置。 下面的配置圖說明了與房地產(chǎn)事務(wù)有關(guān)的軟件及硬件組件的關(guān)系。 
物理上的硬件使用節(jié)點(diǎn)nodes表示。每個組件屬于一個節(jié)點(diǎn)。組件用左上角帶有兩個小矩形的矩形表示。 原文鏈接:http://dn./article/31863 |