標籤:perm 代碼 識別 注意事項 影響 技術分享 position 另一個 實作類別
簡介
類圖是物件導向分析和設計的核心,用來描述系統各個模組中類與類之間、介面與介面之間、類與介面之間的關係,以及每個類的屬性、操作等特性,一般在詳細設計過程中實施。
類圖本身就是現實世界的抽象,是對系統中各種概念進行建模,並描繪出它們之間的關係,所以類圖關注的對象就是元素及元素之間的關係。
類圖建模步驟
- 抽象出類實體
- 識別出類的主要屬性
- 畫出類之間的關係
- 對各個類進行分析、梳理、設計
類圖的元素
類圖中包含以下幾種模型元素:類、介面、關係、協作、注釋、約束、包。
在UML的圖形表示中,類的標記法是一個矩形,有三格組成,分別是類名、類屬性、類操作。抽象類別中的類名及抽象方法都用斜體表示。
- 類名:首字母大寫
- 類屬性:格式為可見度 屬性名稱:類型 =預設值,如-name: String
可見度包括四種:
+ public
- private
# protected
* package
屬性名稱:單字屬性名稱小寫;多字屬性名稱出第一個單詞外其餘單詞的首字母大寫
- 類操作:格式為可見度 操作名(參數): 傳回值類型,如+getName(): String
在UML的圖形表示中,介面的標記法是分為兩種:圓形標記法和構造型標記法。
介面由兩欄組成,第一欄頂端是介面名稱,第二欄是介面方法。介面無屬性只包含操作,且沒有對外可見的關聯。
- 圓形標記法
- 構造型標記法
類圖中類與類之間有泛化、依賴、關聯、彙總、組合關係;介面與介面之間有繼承關係;類與介面之間有實現關係。這些關係本身就是類圖中的元素,用不同的連線表示。
- 泛化關係
- 依賴關係
- 關聯關係
- 彙總關係
- 組合關係
- 實現關係
類圖中的關係較為複雜,以下分別詳述。
協作是指一些類、介面、關係等元素提供的互動行為,能夠協助其他元素執行活動、實現功能的輔助類。
對某些類和介面進行注釋。
指定某些類和介面要滿足的一個或多個規則,UML中使用花括弧括起來的自由文本標識。
UML中的包直接對應java中的包,用來展示層次和組織內容。
類圖的關係
類圖中類與類、介面與介面、類與介面之間的關係有四大類:依賴、關聯、泛化、實現,其中關聯有存在彙總、組合兩個特例。
依賴是一種單向使用關係,如果一個類為實現某一功能,使用了其他類作為參數或者調用了其他類的方法,這兩個類之間就產生了依賴關係。
依賴關係表現在在一個類中使用另一個類作為局部變數或者方法參數,以及對另一個類靜態方法的調用。
依賴關係又有五種細分類型:綁定(Binding)依賴、實現(Realization)依賴、使用(Usage)依賴、抽象(Abstraction)依賴、授權(Permission)依賴
綁定依賴
綁定<<bind>>: 以模板參數指定值,產生一個新的模型元素
關鍵字<<bind>>應用於較進階的依賴,用於綁定模板以建立新的模型元素,箭頭指向被綁定的模板
實現依賴
實現<<realize>>:實際上是兩個類/介面之間的契約,也就是說一個類/介面只定義抽象的行為,另一個類定義具體的結構和行為。
使用依賴
使用依賴表示用戶端使用提供者提供的服務協助實現自身的功能,通常有以下幾種具體應用:
- 使用<<use>>:比較寬泛的概念,表示一個類的行為或實現會影響到另一個類的行為或者實現
- 調用<<call>>:在一個類的方法中調用另一個類的操作
- 參數<<parameter>>:一個類作為另一個類的方法參數
- 發送<<send>>:用一個類中的方法把訊號發送到另一個類
- 執行個體化<<instantiate>>:用一個類的方法建立了另一個類的執行個體
授權依賴
授權依賴表示一個包/類/元素對另一個包/類/元素進行訪問的許可權和能力,包含訪問、匯入、友元等依賴關係:
- 訪問<<access>>:允許一個包/類訪問另一個包/類的內容
- 匯入<<import>>:允許一個包/類訪問另一個包/類的內容
- 友元<<friend>>: 允許一個元素訪問另一個元素
抽象依賴
抽象依賴表示用戶端與提供者在不同抽象層次上的關係,包括跟蹤、精化、匯出等依賴關係:
- 跟蹤<<trace>>:不同模型元素之間的非強相關串連
- 精化<<refine>>:由基本類分解出更明確、更精細的子類
- 匯出<<derive>>:一個執行個體可以從另一個執行個體匯出
關聯是兩個類之間或者類與介面之間的強依賴關係。可以是單向的,也可以是雙向的。
關聯關係一般長期性的、擁有性的關係,而且雙方的關係一般是平等的,如學校與學生之間、老師與學生之間。被關聯類別B以類的屬性形式出現在關聯類別A中,關聯可以是單向的,也可以是雙向的。
關聯關係在代碼上體現為四種形式:
- 單向關聯:單向擁有關係,只有一個類知道另一個類的屬性和方法
- 雙向關聯:雙向擁有關係,雙方都知道對方的屬性和方法
- 自身關聯:自己關聯自己,這種情況比較少但也有用到,如鏈表
- 多重性關聯:表示兩個類的對象在數量上的對應關係,多重性可在關聯線上用數字範圍表示
multiplicity: 多重性
1 僅為1
* 從0到無窮大
0..1 0 或者 1
n..m [n, m]之間的任何數
UML中使用直線箭頭表示,箭頭指向為被關聯的類,從類A指向類B
單向關聯
雙向關聯
自我關聯
多重性關聯
彙總關係是也是關聯關係的特例。普通關聯關係的兩個類一般處於同一平等層次上,而彙總關係的兩個類處於不同的層次,是整體與部分的關係。彙總關係中的整體和部分是可以分離的,生命週期也是相互獨立的,如公司與員工之間。
UML中使用空心菱形+實線箭頭表示,空心菱形邊指向類School(整體),實現箭頭邊指向部分類Student(部分)
組合關係也是關聯關係的特例,屬於強彙總,本身也表示整體與部分的關係,但是組合關係中的整體和部分是不可分離的,整體生命週期的結束時也是部分的生命週期到頭時。如人和大腦。
彙總和組合其實都是關聯的特例,都是整體與部分的關係。它們的區別在於整體和部分是否可分離,彙總的兩個對象之間是可分離的,且具有各自的生命週期,而組合的兩個對象往往表現為一種同命相連的關係。
UML中使用實心菱形+實線箭頭表示,實心菱形邊指向類Person(整體),實線箭頭邊指向類Brain(部分)
泛化指的是子類繼承父類、或子介面繼承父介面的功能並增加自己新功能的過程,是兩個類之間耦合度最大的關係之一。父類稱為基類或超類,子類也稱為衍生類別。子類可以繼承自抽象類別或普通類。
UML中使用實線+空心箭頭表示,箭頭由子類指向父類、或子介面指向父介面
實現關係是指一個類實現一個或多個介面功能的過程,這裡的介面更多的是一種契約或規範。實現是兩個類之間或類與介面之間耦合度最大的關係之一,在這種關係中,類實現了介面或介面類中所聲明的操作。
UML中使用虛線+空心箭頭表示,箭頭由實作類別指向介面
類圖的進階特性
抽象類別是不能直接執行個體化的類,UML中不論是抽象類別名還是抽象方法都是以斜體表示。在不嚴格要求的文檔中也可以普通類加<<abstract>>首碼的方式標識抽象類別名和抽象方法。
因為是python設計模式,所以方法名採用了更pythonic的寫法。
標準標記法
構造標記法
UML中引入模板類的目的是應用泛型程式設計。在類模板聲明的時候根據預留位置或參數來定義類,而不用說明屬性、方法參數、方法傳回值的實際類型。使用時通過實際值替代預留位置或參數即可建立新類/方法/屬性。
python因為是動態語言的原因,所以泛型在python中沒有什麼應用情境,以下以Java為例說明模板類的應用。
嵌套類是在類中定義的類,相應地把擁有嵌套類的類稱為外部類。嵌套類和外部類之間耦合度更高,並且與外部類更加緊密,在UML中是Composition的另一種表示。
主動類是一種特殊的類,其對象至少擁有一個進程或線程,能夠控制活動中的類。之所以使用主動類是因為開發中需要一些類來控制其他類的運行狀態。
關聯類別既是關聯又是類,它不僅像關聯那樣串連兩個類,而且可以定義一組屬於關聯本身的特性。
類圖注意事項
- 類圖設計初期力求重點突出、簡潔易懂,根據需求變化保持更新
- 類圖中的元素名稱應該直觀、清晰、有意義,不同類的屬性名稱盡量在全圖中唯一
- 類圖中多個元素之間有依賴關係時需避免循環相依性
- 類圖中類屬性盡量少避免整個圖過於繁雜
- 類圖中可適當使用注釋使系統更清晰易懂
- 對於需求頻繁變化的項目,可多使用草圖進行組內溝通,節省開發和返工時間
Python設計模式 - UML - 類圖(Class Diagram)