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,車需要一個個部份安裝
- 先建立車
- 安裝車架
- 安裝車蓋
- 安裝引擎
- 塔好電線
- 安裝窗
- 安裝坐位
- 安裝輪胎
最後
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 的項目




No comments:
Post a Comment