從類別圖了解類別之間的依賴關係 - Miles' Blog

文章推薦指數: 80 %
投票人數:10人

類別圖(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)。

知道有不同的關係後,才知道如何比較不同的程式碼,進而達到改善的目的。



請為這篇文章評分?