學(xué)習(xí)筆記 UML類(lèi)圖詳解
本節(jié)和大家一起學(xué)習(xí)一下UML類(lèi)圖,主要包括UML2中的類(lèi)圖,大體上的結(jié)構(gòu)圖,類(lèi)的屬性列表等內(nèi)容。相信通過(guò)本文的你對(duì)UML類(lèi)圖一定會(huì)有深刻的認(rèn)識(shí)。
UML類(lèi)圖詳解
這是關(guān)于統(tǒng)一建模語(yǔ)言、即UML里采用的基本圖的文章。在這篇文章中,我將會(huì)討論結(jié)構(gòu)圖,這是已經(jīng)在UML2中提出的一種新圖種類(lèi)。由于本系列文章的目的是使人們了解記號(hào)元素及它們的含意,該文主要關(guān)注類(lèi)圖。你很快就會(huì)知道這樣做的理由。隨后的文章將會(huì)覆蓋結(jié)構(gòu)范疇中包含的其它圖。
我也想提醒讀者,這一系列文章是關(guān)于UML記號(hào)元素的,所以這些文章并不意味著為建模的最好方式提供指導(dǎo)方針,或是該如何決定哪些內(nèi)容應(yīng)該首先被建模。相反的,該文及本系列文章的目的主要是幫助大家對(duì)于記號(hào)元素--語(yǔ)法和含義有一個(gè)基本的理解。借由這些知識(shí),你應(yīng)該可以閱讀圖,并使用正確的記號(hào)元素創(chuàng)建你自己的圖。
這篇文章假定你對(duì)面向?qū)ο蟮脑O(shè)計(jì)已經(jīng)有了基本的理解。你們當(dāng)中如果有人需要一些面向?qū)ο蟾拍畹膸椭?,那么可以訪(fǎng)問(wèn)http://java.sun.com/docs/books/tutorial/java/concepts/,來(lái)獲得Sun公司關(guān)于面向?qū)ο缶幊痰暮?jiǎn)短指導(dǎo)。閱讀“什么是類(lèi)?”和什么是繼承?”章節(jié),將提供給你足夠的理解,并對(duì)該文的閱讀會(huì)有所幫助。另外,DavidTaylor的書(shū)《Object-OrientedTechnologies:AManager'sGuide》提供了面向?qū)ο笤O(shè)計(jì)的優(yōu)秀,高水平的說(shuō)明,而無(wú)需對(duì)計(jì)算機(jī)編程有高深的理解。
UML2中的陰和陽(yáng)
在UML2中有二種基本的圖范疇:結(jié)構(gòu)圖和行為圖。每個(gè)UML圖都屬于這二個(gè)圖范疇。結(jié)構(gòu)圖的目的是顯示建模系統(tǒng)的靜態(tài)結(jié)構(gòu)。它們包括UML類(lèi)圖,組件和(或)對(duì)象圖。另一方面,行為圖顯示系統(tǒng)中的對(duì)象的動(dòng)態(tài)行為,包括如對(duì)象的方法,協(xié)作和活動(dòng)之類(lèi)的內(nèi)容。行為圖的實(shí)例是活動(dòng)圖,用例圖和序列圖。
大體上的結(jié)構(gòu)圖
如同我所說(shuō)的,結(jié)構(gòu)圖顯示建模系統(tǒng)的靜態(tài)結(jié)構(gòu)。關(guān)注系統(tǒng)的元件,無(wú)需考慮時(shí)間。在系統(tǒng)內(nèi),靜態(tài)結(jié)構(gòu)通過(guò)顯示類(lèi)型和它們的實(shí)例進(jìn)行傳播。除了顯示系統(tǒng)類(lèi)型和它們的實(shí)例,結(jié)構(gòu)圖至少也顯示了這些元素間的一些關(guān)系,可能的話(huà),甚至也顯示它們的內(nèi)部結(jié)構(gòu)。
貫穿整個(gè)軟件生命周期,結(jié)構(gòu)圖對(duì)于各種團(tuán)隊(duì)成員都是有用的。一般而言,這些圖支持設(shè)計(jì)驗(yàn)證,和個(gè)體與團(tuán)隊(duì)間的設(shè)計(jì)交流。舉例來(lái)說(shuō),業(yè)務(wù)分析師可以使用類(lèi)或?qū)ο髨D,來(lái)為當(dāng)前的資產(chǎn)和資源建模,例如分類(lèi)賬,產(chǎn)品或地理層次。架構(gòu)師可以使用組件和部署圖,來(lái)測(cè)試/確認(rèn)他們的設(shè)計(jì)是否充分。開(kāi)發(fā)者可以使用類(lèi)圖,來(lái)設(shè)計(jì)并為系統(tǒng)的代碼(或即將成為代碼的)類(lèi)寫(xiě)文檔。
特殊的類(lèi)圖
UML2把結(jié)構(gòu)圖看成一個(gè)分類(lèi);這里并不存在稱(chēng)為“結(jié)構(gòu)圖”的圖。然而,類(lèi)圖提供結(jié)構(gòu)圖類(lèi)型的一個(gè)主要實(shí)例,并為我們提供一組記號(hào)元素的初始集,供所有其它結(jié)構(gòu)圖使用。由于類(lèi)圖是如此基本,本文的剩余部分將會(huì)把重點(diǎn)集中在類(lèi)圖記號(hào)集。在本文的結(jié)尾,你將對(duì)于如何畫(huà)UML2類(lèi)圖有所了解,而且對(duì)于理解在后面文章中將涉及的其他結(jié)構(gòu)圖有一個(gè)穩(wěn)固的基礎(chǔ)。
基礎(chǔ)
如先前所提到的,類(lèi)圖的目的是顯示建模系統(tǒng)的類(lèi)型。在大多數(shù)的UML模型中這些類(lèi)型包括:
類(lèi)
接口
數(shù)據(jù)類(lèi)型
組件
UML為這些類(lèi)型起了一個(gè)特別的名字:“分類(lèi)器”。通常地,你可以把分類(lèi)器當(dāng)做類(lèi),但在技術(shù)上,分類(lèi)器是更為普遍的術(shù)語(yǔ),它還是引用上面的其它三種類(lèi)型為好。
類(lèi)名
UML類(lèi)圖的UML表示是一個(gè)長(zhǎng)方形,垂直地分為三個(gè)區(qū),如圖1所示。頂部區(qū)域顯示類(lèi)的名字。中間的區(qū)域列出類(lèi)的屬性。底部的區(qū)域列出類(lèi)的操作。當(dāng)在一個(gè)類(lèi)圖上畫(huà)一個(gè)類(lèi)元素時(shí),你必須要有頂端的區(qū)域,下面的二個(gè)區(qū)域是可選擇的(當(dāng)圖描述僅僅用于顯示分類(lèi)器間關(guān)系的高層細(xì)節(jié)時(shí),下面的兩個(gè)區(qū)域是不必要的)。圖1顯示一個(gè)航線(xiàn)班機(jī)如何作為UML類(lèi)建模。正如我們所能見(jiàn)到的,名字是Flight,我們可以在中間區(qū)域看到Flight類(lèi)的3個(gè)屬性:flightNumber,departureTime和flightDuration。在底部區(qū)域中我們可以看到Flight類(lèi)有兩個(gè)操作:delayFlight和getArrivalTime。
圖1:Flight類(lèi)的類(lèi)圖
類(lèi)屬性列表
UML類(lèi)圖的屬性節(jié)(中部區(qū)域)在分隔線(xiàn)上列出每一個(gè)類(lèi)的屬性。屬性節(jié)是可選擇的,要是一用它,就包含類(lèi)的列表顯示的每個(gè)屬性。該線(xiàn)用如下格式:
name:attributetype
flightNumber:Integer
繼續(xù)我們的Flight類(lèi)的例子,我們可以使用屬性類(lèi)型信息來(lái)描述類(lèi)的屬性,如表1所示。
表1:具有關(guān)聯(lián)類(lèi)型的Flight類(lèi)的屬性名字
#p#
在業(yè)務(wù)類(lèi)圖中,屬性類(lèi)型通常與單位相符,這對(duì)于圖的可能讀者是有意義的(例如,分鐘,美元,等等)。然而,用于生成代碼的類(lèi)圖,要求類(lèi)的屬性類(lèi)型必須限制在由程序語(yǔ)言提供的類(lèi)型之中,或包含于在系統(tǒng)中實(shí)現(xiàn)的、模型的類(lèi)型之中。
在UML類(lèi)圖上顯示具有默認(rèn)值的特定屬性,有時(shí)是有用的(例如,在銀行賬戶(hù)應(yīng)用程序中,一個(gè)新的銀行賬戶(hù)會(huì)以零為初始值)。UML規(guī)范允許在屬性列表節(jié)中,通過(guò)使用如下的記號(hào)作為默認(rèn)值的標(biāo)識(shí):
name:attributetype=defaultvalue
舉例來(lái)說(shuō):balance:Dollars=0
顯示屬性默認(rèn)值是可選擇的;圖2顯示一個(gè)銀行賬戶(hù)類(lèi)具有一個(gè)名為balance的類(lèi)型,它的默認(rèn)值為0。
圖2:顯示默認(rèn)為0美元的balance屬性值的銀行賬戶(hù)UML類(lèi)圖。
類(lèi)操作記錄在類(lèi)圖長(zhǎng)方形的第三個(gè)(最低的)區(qū)域中,它也是可選擇的。和屬性一樣,類(lèi)的操作以列表格式顯示,每個(gè)操作在它自己線(xiàn)上。操作使用下列記號(hào)表現(xiàn):
name(parameterlist):typeofvaluereturned
下面的表2中Flight類(lèi)操作的映射。
表2:從圖2映射的Flight類(lèi)的操作
圖3顯示,delayFlight操作有一個(gè)Minutes類(lèi)型的輸入?yún)?shù)--numberOfMinutes。然而,delayFlight操作沒(méi)有返回值。1當(dāng)一個(gè)操作有參數(shù)時(shí),參數(shù)被放在操作的括號(hào)內(nèi);每個(gè)參數(shù)都使用這樣的格式:“參數(shù)名:參數(shù)類(lèi)型”。
圖3:Flight類(lèi)操作參數(shù),包括可選擇的“in”標(biāo)識(shí)。
當(dāng)文檔化操作參數(shù)時(shí),你可能使用一個(gè)可選擇的指示器,以顯示參數(shù)到操作的輸入?yún)?shù)、或輸出參數(shù)。這個(gè)可選擇的指示器以“in”或“out”出現(xiàn),如圖3中的操作區(qū)域所示。一般來(lái)說(shuō),除非將使用一種早期的程序編程語(yǔ)言,如Fortran,這些指示器可能會(huì)有所幫助,否則它們是不必要的。然而,在C++和Java中,所有的參數(shù)是“in”參數(shù),而且按照UML規(guī)范,既然“in”是參數(shù)的默認(rèn)類(lèi)型,大多數(shù)人將會(huì)遺漏輸入/輸出指示器。
【編輯推薦】