從類別圖了解類別之間的依賴關係 - Miles' Blog
文章推薦指數: 80 %
類別圖(class diagram)可以用圖例的方法呈現類別之間的關係,正所謂一圖勝萬言,使用圖例表達類別的關係,比直接看程式碼來的清楚很多;因為類別圖 ...
0%
物件導向程式設計,是在設計一個系統--用到多少類別,以及類別之間的關係。
類別圖(classdiagram)可以用圖例的方法呈現類別之間的關係,正所謂一圖勝萬言,使用圖例表達類別的關係,比直接看程式碼來的清楚很多;因為類別圖很常用,所以學習物件導向程式設計,至少要懂得看類別圖。
以下使用PlantUML作為畫圖的工具
首先先看單一類別是如何呈現資訊:
@startumlskinparamclassAttributeIconSize0classPerson{..publicproperty..+age:int..privateproperty..-height:float..protectedproperty..#name:string..packageproperty..~weight:float==..publicmethod..+getAge():int..privatemethod..-getHeight():float..protectedmethod..#setName(Stringname):void..packagemethod..~getWeight():float}@enduml
一個類別可以分作四個部分:
類型,比方說是介面(interface)或類別(class),上例為類別
名稱,上例為Person
屬性(property)
方法(method)
其中屬性和方法會有不同的能見度。
而能見度的表示方法如下:
+public
-private
#protected
~package
了解單一類別的表示法,再來是了解類別之間關係。
類別圖定義了六種關係,以下為簡單的說明。
依賴(Dependency)類別間的依賴,表示了A類別使用了B類別,如下圖:
@startumlscale200widthclassAclassBA.>B@enduml
在程式上的意義,指的是A類別的方法定義裡,有B類別。
比方說,Person類別使用信用卡買Switch,用PHP程式語言表達的方法如下:
classPerson{publicfunctionbuy(CreditCard$card):Switch{}}
對應的類別圖如下:
@startumlclassPerson{+buy(CreditCard):Switch}classCreditCardclassSwitchPerson..>CreditCardPerson..>Switch@enduml
這個程式寫法很常出現在靜態方法上。
關聯(Association)關聯表示的是A類別擁有B類別,如下圖:
@startumlscale200widthclassAclassBA->B@enduml
程式上的意義,指的就是類別的屬性,比方說Person類別有cellphone屬性是Cellphone類別。
PHP程式語言表達的方法如下:
classPerson{public$cellphone;}
對應的類別圖如下:
@startumlclassPerson{+cellphone:Cellphone}Person-->Cellphone@enduml
聚合(Aggregation)聚合表示的關係是A類別包含了B類別,如下圖:
@startumlscale200widthclassAclassBAo->B@enduml
程式上的意義有下面幾個:
A類別的屬性有B類別
A類別的方法會用到B的屬性
A類別與B類別的生命週期是各自獨立的,比方說B類別產生的物件可同時被另一個A類別產生的物件聚合。
第三點可能有點抽象,舉個實例:如Switch與JoyCon的關係就是一個聚合最佳實例,JoyCon不限定用在哪台主機,只要是Switch,裝上去都能正常操作。
而且兩者生命週期是各自獨立的,JoyCon壞了可以買新的裝上;Switch主機壞了,JoyCon可以留到下一台主機繼續用。
畫成類別圖如下:
@startumlclassSwitch{+joycon1:JoyCon+joycon2:JoyCon}classJoyConSwitcho-->JoyCon@enduml
組合(Composition)組合代表的意義為,B類別為A類別的一部分,如下圖
@startumlscale200widthclassAclassBA*->B@enduml
與聚合的條件類似,唯獨第三點不同:A類別與B類別的生命週期是一致的,也就是要嘛一起產生,要嘛一起死。
實務上來說,Macbook與記憶體(Memory)的關係即為組合:如果一個壞,另一個也難逃一死。
而過去較舊的機型則是聚合,因為可以抽換。
畫成類別圖如下:
@startumlclassMacbook{-memory:Memory}classMemoryMacbook*-->Memory@enduml
實作(Realization)與繼承(Generalization)就不特別說明,因為跟物件導向討論的大同小異,對應的圖如下:
實作:
@startumlscale200widthclassAclassBA.|>B@enduml
繼承:
@startumlscale200widthclassAclassBA-|>B@enduml
小結一共有六種關係,下面是一個關係由弱到強的表格
關係
描述
依賴
AuseaB
關聯
AhasaB
聚合
AownsaB
組合
BispartofA
實作
BimplementA
繼承
BextendsA
越弱的關係,在修改B的程式碼,影響A的風險就越小。
了解類別圖與這個比較表的目的有兩個:
這是共同語言(UML)。
知道有不同的關係後,才知道如何比較不同的程式碼,進而達到改善的目的。
延伸文章資訊
- 1將類別圖表新增至類別設計工具(專案) - Visual Studio (Windows)
若要設計、編輯和重構類別及其他類型,請將類別圖加入至C#、Visual Basic 或C++ 專案。 若要在專案中視覺化程式碼的不同部分,請將多個類別圖加入至 ...
- 2簡單理解UML 類別圖 - Medium
Class Diagram. 在物件導向的實作中,UML 類別圖可幫助釐清各類別的描述、擁有的屬性、可使用的方法與各物件間的相互關聯,能清楚表示實作的Design ...
- 3類別圖- 維基百科,自由的百科全書
類別圖是物件導向式的建模。他們一般都被用於概念建模(conceptual modelling)的系統分類的應用程式,並可將模型建模轉譯成程式碼。 ... 為了進一步描述系統的行為,這些類 ...
- 4Class Diagram 類別圖筆記 - 奧卡的部落格
類別圖是UML 的一種,他透過一個系統中的物件、物件的屬性、物件擁有的方法和物件與物件之間的關係來描述其結構。 ¶類別圖符號. 類別圖的符號分為兩大類.
- 5Day7. UML類別圖說明 - iT 邦幫忙
... their attributes, operations (or methods), and the relationships among objects. 類別圖描述了系統的類別集合...