UML學習之對象圖和類圖

參考《UML面向對象系統分析與設計教程》

第五章    對象圖和類圖

5.1 概述

    UML的類圖和對象圖表達的是對象模型的靜態結構方面。它不僅定義系統中的類,表示類之間的聯繫,如關聯、依賴、聚合等,還包括類的內部結構,如類的屬性和操作等。

    類圖描述的是一種靜態關係,在系統的整個生命週期都是有效的。通過分析問題域和用例,就可以得到相關的類,然後再把邏輯上相關的類封裝成包。這樣可以很好地體現出系統的分層 結構,使人們對系統層次關係一目瞭然。

    一個對象圖是類圖的一個實例,對象圖只能在系統的某一時間存在。

5.2 對象類定義

    類是對一組具有相同屬性、操作、關係和語義的對象的描述。

    類的名稱:

    如“學校::教師”,其中“學校”是類“教師”所在的包名。

    定義屬性:

    wKiom1amz-fg0kV8AAATpugooOU761.png

    類中屬性的可見性主要包括public private 和protected,分別是+ - #。(package用~符號)

    類的屬性必須有一個名字以區別於類的其他屬性。冒號:後緊跟屬性值的數據類型,數據類型的表示依賴於實現語言。類型後的“=初始值”表示新建該對象時該屬性的初始值。

    在類的屬性框中,方括號“【】”中的部分是可選項目。方括號中的多重性用多值表達式表示,其值是該對象類的每個實例的屬性值的個數。多值表達式的格式爲:

        integer, integer,...... 或低界...高界

    (書中的圖是圖中上面的圖,在Jude中,[多重性]符號顯示在類型後面,如圖中下面的圖)

    其中低界表示多值表達式的最小值,高界爲多值表達式的最大值,"低界...高界"表示屬性必定在此範圍內取值。低界和高界可以是一個整形數或星號“*”,表示任意的非負整數。例如,“0...*”表示0個或無限多個。“職務【2】:string”表示有2個值,數據類型爲“string”;“姓名【0...1】:string”說明屬性“姓名”可以爲空或一個姓名值,數據類型爲“string”。

    屬主範圍是屬性的另一個重要性質。屬主範圍有兩種情況:實例和分類。如果一個屬性的屬主範圍是實例,則該對象 類的每一個實例對象都有一個自己的該屬性的值要一個屬性的屬主範圍是分類符,則對於該對象類本屬性只有一個值,該對象類的每一個實例對象都持有此唯一的值,該對象類該屬性名下應加下劃線。對象類的大多數屬性的屬主範圍都是實例。(類似於static關鍵字)

    定義操作

    操作的可視性的含義和表示方法與類的屬性相同。

    一個操作可以有參數,也可以沒有參數。參數列表由逗號分隔的操作的形式參數組成,格式爲:

        參數名:類型=默認值,...

    冒號“:”後緊跟返回列表,返回列表規定了當該操作完成時的返回值的類型,它由逗號分隔的操作的返回值類型表達式組成,基格式爲:

        返回類型

        返回名字=類型,...

    操作也有屬主範圍的區分,它的含義與表示方法與類的屬性相同。對象的構造操作(構造函數)必須帶有下劃線,表示它的屬主範圍是分類符。構造操作也可以用構造型<<constructor>>表示。

    操作定義的最後花括號{}中的性質,是一個文字串,說明該操作的一些有關信息。性質是一個可選項。

(在Jude中,性質是點擊“約束”進行修改)

    wKiom1am1rPheOpAAAAViHNvQR8845.png

5.3 對象類的關聯

    5.3.1 關聯的定義

    在對象類圖上,關聯用一條實線表示。一個關聯至少有兩個關聯端,每個關聯端連接到一個類,關聯端是有序的。關聯線旁可以標出關聯的名字,線旁的小實心箭頭表示關聯的方向,從源對象類指向目標對象類。關聯可以是單向的或雙向的,如果是雙向的則不必標出方向箭頭。

wKioL1am2-CT1MsvAAAWODUGPtM574.png

    在UML類圖中,關聯的每個端點都可以帶有一個多重性標註。關聯的多重性標註用於指定關聯的另一站內所鏈接的類的一個實例可以和多少個對象相連。常用的多重性標記有0...1,1,* 等。

wKiom1am3YGzOFfoAAARMnDHP6o672.png

    在關聯的對象類圖標旁可以標註類的角色名(Role)。角色表示被關聯的類參與關聯的特定的行爲。角色名可以後跟一個冒號“:”和類名。

    限定符可以有名字或標識,表示被管理的對象的一個屬性或多個屬性的列表。限定符包含在一個小矩形內,限定符的名字可以默認省略。例如,下圖中“訂貨”帶有限定符“ProductID:Int“,它限定訂貨的產品ID必須爲整數。該限定符說明,在與”訂貨“的鏈接中,每一個由整型數標識的產品,可以由一條訂貨作業線來處理。(Jude上不知道怎麼加入限定,嘗試用畫圖工具畫出書上的圖)

wKiom1am6maQJBZlAAASzw-HapM176.png

    關聯本身也有特性,通過關聯對象類可以進一步說明關聯的屬性、操作及其他信息。關聯對象類(或稱爲關聯類)是一個關聯,也是一個類,它定義了一組屬於該關聯的特性,這些特性不屬於被關聯的任何一個對象類。關聯類的圖標用一條虛線連到關聯線上。

wKioL1am7gfjqq0TAAATsBG0ADc647.png

    5.3.2 關聯類型

    對象類之間的關聯有以下幾種類型,自反關聯,二元關聯和N元關聯。

    5.3.3 聚合和組合

    聚合和組合是對象類之間的一種特殊的關聯關係,它主要用來描述對象類之間的整體與部分之間的關係。

    聚合用於表示事物的整體/部分關係較弱的情況,整體對象擁有部分對象。在UML中,聚合關聯用帶有空心的菱形頭的實線表示。在聚合中,代表部分事物的對象可以屬於多個聚合對象,可以爲多個聚合對象共享,而且可以隨時改變它們所從屬的聚合對象。部分對象與整體對象的生存期無關,一旦刪除了它的一個聚合對象,不一定就隨即刪除代表部分事物的對象。

wKiom1anLjPgYtVcAAAZz_EK06g996.png

    組合表示事物的整體 與部分關係較強的情況。在UML類圖中,組合關聯用帶有實心菱形頭的實線表示。在組合中,代表整體事物的組合對象負責創建和刪除代表部分事物的對象,代表部分事物的對象只屬於一個組合對象,而且與組合對象同時存在,同時消失,一旦刪除組合對象,也就隨即刪除了相應的代表部分事物的對象。

    5.3.4 泛化

    泛化是一般事物和該事物較爲特殊的種類之間的關係,子類繼承父類的屬性和操作外,通常子類還添加新的屬性和操作,或者修改了父類的某些操作。

    在UML類圖中,泛化用從子類指向父類的空心三角形箭頭表示。對象類“大學”、“小學“是泛化對象類“學校”的子類。

wKiom1anLh2SUxCpAAASiT2AvB4670.png

    5.3.5 依賴

    依賴是指一個模型元素(提供者)的變化必然影響另一個模型元素(客戶)。例如,課表信息依賴於課程信息,如果刪除了課程信息,所有關於該課程的排課信息也連帶被刪除。

    在UML中,把依賴描述成一條有方向的虛線,指向被依賴的對象。依賴可以有自己的名字,但一般都省略。對於依賴可以加上構造型,規定依賴的含義和作用,常用的構造型有<<use>(使用),<<call>>(調用 ),<<instantiate>>(實例)和<<friend>>(友元)等。類“電視”的方法“換臺”使用了類“頻道”的對象作爲參數。因此這兩個類之間存在着使用依賴關係。wKiom1anLguCbWsKAAATBACq1BM300.png

5.4 對象圖

    在建立系統模型時,一般採用對象類圖表示系統的靜態特徵,用交互圖表示系統的動態特徵。對象圖則凍結了系統的某一瞬間,表達系統的對象在該時刻的具體狀態(屬性值和操作)。

    對象的圖標與對象類一樣用實線矩形表示,矩形框中含有若干分隔區,分別表示對象的名稱、屬性及其他成分等。對象各是一個文字串,必須帶有下劃線。冒號“:”後跟一個由逗號分隔的類列表,它指出對象所屬的型或類。

    對象的屬性分隔區含有該對象的屬性值,屬性值的數據類型必須符合該對象所屬的類的規定。

    下圖是對某學校建模的一組對象。該圖描述了該學校的部門組成情況。a是類“University”的對象,這個對象與對象b1,b2,b3相鏈接,b1,b2,b3都是類“Department"的對象,它們具有不同的屬性值,即有不同的名字。

    在圖中沒有顯示對象所能進行的操作,但是每一個對象都可以進行所屬的類的定義的操作。例如,對象p1可以進行”Employee“類的所有操作。

wKioL1aoHACS-unSAAAhsGbvkSw919.png

5.5 接口

    接口是一組外部可以訪問的操作,用於爲對象類或構件提供服務。接口可以看作是一種特殊的抽象類,它不含屬性,它的操作也沒有方法,即沒有操作的實現。

    接口可以用一個類圖標表示。在接口圖標的名字分隔區中有唯一的接口名,接口名可以是簡單名,也可以是路徑名,接口名前有構造型<<interface>>。接口圖標中沒有屬性分隔區,在操作分隔區中列出抽象的公共操作,參數可有可無。

    接口也可以用一個小圓表示,圓旁標有接口的名字,稱爲棒糖式接口。如圖,這種簡單形式對於在建立模型時只打算了解系統內部的接縫的情況是有效的。

wKioL1aoH1KjgmwaAAAZf-UIpn0771.png

    接口可以通過一個實現聯繫獲得其他對象類的支持,這些對象類提供在接口中定義的全部操作。實現聯繫是一種泛化聯繫,用帶空心三角箭頭的虛箭頭表示(稱爲虛泛化符)。對於棒糖式接口的實現聯繫則用一條虛線表示。對象類可以通過依賴聯繫(虛箭頭線)使用接口。此時可以標出構造型"<<use>>",也可不標。

5.6 高級對象類

    5.6.1 抽象類

    在UML中,可以用斜體的類名來表示抽象類,而不使用約束{abstract}。

wKioL1aoIcigi9DdAAAY3MSFXd4445.png

    5.6.2 模板對象類模板對象類又稱參數對象類,量一個尚未完全具體說明的類。模板中提供參數表,利用參數表向模板傳遞信息可最終形成用戶需要的具體類。參數可以是類,也可以是整數,布爾型等基本類型。由於給定不同的參數便可確定不同的類,所以模板能夠說明許多類,故又稱模板是一個用參數表示的類。

5.7 對象類圖建模

    5.7.1 建立對象類圖

    一般情況下,建立對象類圖包含以下幾個步驟:

  1. 研究和分析問題域,確定系統的需求。

  2. 發現、識別、確定系統中的類和對象,明確它們的含義和責任,確定屬性和操作。

  3. 找出類之間存在的靜態聯繫。要重點分析出類之間存在的一般與特殊、部分與整體關係,研究類之間的繼承性和多態性,把類之間的這種聯繫用泛化、聚合和組合、關聯、依賴等關聯表達出來。

  4. 對已經發現的類之間存在的聯繫進行調整和優化,去除可能存在的命名衝突和功能重複等問題。

  5. 繪製對象類圖並編制相應的說明。

    繪製好的對象類圖不應過於複雜,圖形元素一般不要超過9個,類圖的大小一般以一張A4紙爲宜。如果一張類圖中圖形元素太多,就應該按照類圖的抽象層次分層繪製,同一個層次的類圖按一個Use Case或一個子系統繪製。如果圖形仍然過大,則再進行劃分。

    5.7.2 類和對象建模中應注意的問題

    1. 模型視角(Perspectives)和粒度

    通常情況下,鏗現實世界的問題域,建立對象模型和繪製對象類圖可以從以下三個模型視角出發:概念視角、說明視角和實現視角。

    從概念視角出發,可以通過對象類來表現問題域的概念模型。在概念模型中不考慮軟件實現方面的問題,因而它是獨立於程序設計語言的。在系統的分析階段一般從概念視角出發建立系統的分析模型。

    從說明視角出發,可以通過對象類圖來表現軟件的結構和接口,而不是軟件的實現。在系統的設計階段一般從說明視角出發建立系統的設計模型。

    按照實現視角繪製的對象類圖體現在構建階段產生的實現模型,它具體定義對象類及其實現。

    在建立對象模型時,可以採取由頂向下或由底向上的方式進行。頂層的對象類圖是概念性的,下層的對象類圖是上層對象類圖的細化,增加了一些細節。最底層的對象類圖是實現性的,一般可直接映射到程序設計語言。系統分析人員和高級程序員關心的是對象類的基本特性和它們之間的關係,他們只需要邏輯說明層的粒度較粗的對象類圖。一般程序員關心的是對象類的屬性、操作和聯繫的實現,需要的是實現層的粒度較細的對象類圖。

    2. 例外建模(Exception)

    在UML中,可以把例外情況的處理用一個專門的類--信號來表達。當在某個操作的執行中出現例外的情況的條件成立時,就發送一個處理該例外情況的信號。

    對於系統中例外情況的建模可以按以下步驟進行:

    1.對每一個對象類和接口,找出可能出現的例外情況及其出現條件。

    2.將每一個例外情況用一個信號類來描述,類名前加上構造型<<exception>>。

    3.建立例外情況的層次結構,將一般性的例外情況置於頂層,把特殊性的例外情況置於底層。

    4.找出每一個操作可能出現的例外情況,將操作和它的例外情況的信號圖標之間用一條虛箭頭線連接,其上標出構造型<<send>>,表示操作的例外情況的“send”依賴。

    3.包建模技術

    當對大型系統進行建模時,經常需要處理大師的類、接口、構件、節點和圖,這時就有必要將這些元素進行分組,即把那些語義相近並傾向於一起變化的元素組織起來加入同一包,這樣方便理解和處理整個模型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章