lazyload the images

最新精選 Featured post

異世界穿越作品整合

訂閱

訂閱 FB 專頁

每月雙數周日為固定發佈日

訂閱FB 專頁,有新發佈時將會立即看見。
Youtube 頻道經常會有電玩錄影

27/11/2025

association, aggregation, composition difference

文章分類: ,

Association vs Aggregation vs Composition 傻傻分不清

三者是對objects之間不同關係的名詞


Association

代表object與另一object有連結,或有接觸

兩object data type 不同,即是不同class 的instance

這種連結/關係,可以是單向,可以是雙向


Aggregation

是association當中一種獨特形式,一object 持有/包含另一object

舉例 team (容器 container) 有teammate,不論數量,可以是0個/1個/多個 teammate


同時 teammate可以在沒有team的情況下獨立存在

換句話說,即是teammate被加進team後,team死了,teammate仍然還在


UML 當中以上這些符號都有指向性,兩邊箭頭是不同的,請留意箭頭。

hollow diamond (空心鑽頭) 指向的會是 container


這種關係就是 Aggregation


Composition

是一個連結更加強的關係,一object 持有/包含另一object

同時,如 容器 (container) 死亡,被持有/有關連的object也會死亡


例如勇者小隊擊敗魔王後,小隊解散,4名小隊成員亦不再是

是否雙向,勇者 / 魔法師 / 補師 / 坦 任何一人死亡,立即團滅

答案︰否

A物件的生命周期依賴B,同時B的生命周期依賴不可依賴A


雖然program 能寫出來,可以complie,但執行時互相依賴會造成迴圈,C#為例發生StackOverflowException

https://gist.github.com/dolphinotaku/7b6e1f17c297c9f4f17779f5df082282

UML 當中以上這些符號都有指向性,兩邊箭頭是不同的,請留意箭頭。

solid diamond (實心鑽頭)  指向的會是 container

[圖1]

[圖2]



海豚感想

初學時海豚認為這三件事很模糊又搞不清,總是用記program的方法去記︰這是Association,這是 Aggregation, 這是Composition。

其實就是用錯方法。


Association, Aggregation, Composition 是三種object與object之間,關係的概念

大家只需要記概念,這program是因應實際需求而寫的,隨時可變


引用的文章中,Composition 舉例 是車與引擎

車在,引擎就必需在,車死了,引擊也會跟著死了

海豚猜它的車其中一個需求就是要跑得動,車都沒了,沒法跑,引擎存在也沒意義,一起殺掉吧


如果海豚的車與引擎本來只是Association,兩者分開建立後才加在一起,車死時,沒有為

引擎.Dispose()

引擎便會一直都在


假如是汽車廠在組合汽車,組裝前,引擎在車未建立前就在了

全都好了,車才建立成功,拿去測試整架車發現引擎出問題,

把引擎從車折出來,車也不會死亡

引擎不可以立即死掉,因為製作一個引擎太貴,先試一下維修保救

車則立即安裝另一副引擎,不要因為除錯,影響整個流水生產線

這種情況,就需要引擎沒了車仍然可以獨立存在

車在組合過程中,也有很多不同的state,車需要一個個部份安裝

  1. 先建立車
  2. 安裝車架
  3. 安裝車蓋
  4. 安裝引擎
  5. 塔好電線
  6. 安裝窗
  7. 安裝坐位
  8. 安裝輪胎
都成功,最後state 可能是 is全部安裝成功 = true


最後

Association vs Aggregation vs Composition 三個並非 OOP 的東西

而是UML 畫圖時的概念,以及 Aggregation/composition 是很多 design parttern的根基


如要判斷program 寫的是這一項,直接看code


如是畫圖或思考要用這個 design pattern

先寫 user requirements ,再寫code,再判斷


雖然傳統上 waterfall / spiral 等等 development methodologies 會教

都是先寫user requirements ,再畫UML,最後寫code

但這根本不現實

海豚也不喜歡看這些圖和 sign,根本一段簡單文字描述整過work flow 勝過這一切

見過這些箭號有幾個版本,又不直覺 intuitive 和 可視化 Visualization

而且現實中也很少機會閱讀這些圖,沒事硬要將一堆事情標準化


教科書一般會說 Aggregation is hollow diamond,Composition is solid diamond

但見過有的不是 Rhombus 菱形 表示,見過 Square 正方形


現實是很多時program寫出來的根本沒有跟畫的,之後又要回去改,不是改UML就是改code。

而通常code寫好了就沒人想改,所以都回去改UML

因為很多情況都沒人想理code內裡是怎運作,整個系統可以跑起來就好


加上現在都 agile / Rapid application development 之類的敏捷開發

海豚個人評價就是覺得︰如不是一些涉及巨大生命財產/人命攸關的項目,都不用這堆垃圾

除非這項目只適合用 Waterfall / sprint model 的項目


Reference

https://medium.com/@emad-mohamed/association-vs-aggregation-vs-composition-vs-inheritance-3d63ac32ed92

No comments:

Post a Comment