[問題] 有關Association,Aggregation 及 Comp …

看板C_and_CPP (C/C++)作者 (貧窮工程師(b))時間16年前 (2010/06/02 17:57), 編輯推噓1(1021)
留言22則, 3人參與, 最新討論串1/1
最近在把之前寫好的程式轉成UML 順便看一下架構有沒有需要改變的地方 不過有幾個地方比較模糊 希望有經驗的大大可以解答一下 謝謝。 Association (關聯) |A|────────>|B| 例1 class A { private: B* itsB; }; Aggregation (聚合) 例2 |Node|◇──────────>|Node| class Node { private: vector<Node*> itsNodes; }; 例3 |B|◇──────────>|A| class A{…}; class B{ A* theA;…}; Composition (合成) 例4 |Car|◆─────────>|Carburetor| class Car { public: virtual ~Car() {delete itsCarb;} private: Carburetor* itsCarb }; 例5 |B|◆─────────>|A| class A{…}; class B{A theA;…}; 上述的例子都是在網路上找到的 比較有疑問的地方是 我覺的 例3 跟 例1 蠻像的 但一個卻分到Association,另一個卻是Aggregation 而 例4 跟 例3及例1 只差了一個 delete 的動作,就被分到 Composition 感覺上程式好像沒什麼差別,但圖示就有差 這個就是我有疑問的地方 該怎麼正確的分辦這三種 Association,Aggregation 及 Composition 一般我的寫法是以例3居多 另外以例3來說 main() { B* b = new B; delete b; } 這樣裡面的 theA 不也一樣被 delete 了(還是我的認知有誤) 還是說,其實 theA 還是佔著記憶體空間? 不然感覺跟 例4 一樣 @@ -- http://blog.pixnet.net/brian6724 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.120.188.59

06/02 21:53, , 1F
之前學UML的印象是基本上只要A use B(例如A在自己的mem_fun
06/02 21:53, 1F

06/02 21:54, , 2F
使用到B)都算是association
06/02 21:54, 2F

06/02 21:55, , 3F
至於Aggregation 及 Composition的區別在於Composition的
06/02 21:55, 3F

06/02 21:56, , 4F
物件被delete之後,裡面的聚合物件也會跟著delete
06/02 21:56, 4F

06/02 21:57, , 5F
就好比carburetor是car的一部分,如果今天car消失了
06/02 21:57, 5F

06/02 21:59, , 6F
合成
06/02 21:59, 6F

06/02 21:59, , 7F
car裡面的carburetor也不能夠苟活...
06/02 21:59, 7F

06/02 22:04, , 8F
至於例三的theA可以由外部傳近B裡,當B被delete外部可以有其
06/02 22:04, 8F

06/02 22:05, , 9F
他參考到theA的方式
06/02 22:05, 9F

06/03 05:40, , 10F
association 有含括 aggregation 和 composition 的概念。
06/03 05:40, 10F

06/03 05:41, , 11F
在分析期你看到的線 99% 都是 association,
06/03 05:41, 11F

06/03 05:42, , 12F
設計期才會明確區分它們是哪一種。
06/03 05:42, 12F

06/03 05:43, , 13F
分析期是有可能看得到 composition,像是永續性資料物件,
06/03 05:43, 13F

06/03 05:44, , 14F
特別是要跟資料庫對應用的那些 classes。
06/03 05:44, 14F
所以我可以大致上下一個結論 你們看看對不對 Association 包含 Aggregation 及 Composition 所以如果懶一點,有關 Aggregation 及 Composition 的線都可以用 Association 來代替 如果要細分到 Aggregation 及 Composition 的話 Aggregation 是不會跟著物件消失而消失,也就是沒被 delete (可能其它的地方還要用) 所以他們的宣告通常是 A* theA 用法有可能是會這樣用 B(A* aaa) {theA = aaa;} ~B(){} Composition 是會跟著物件消失而消失 所以他們的宣告通常會是 A theA 或是 A* theA 但在 ~b() 時會 delete theA 不知道這樣說對不對 :) ※ 編輯: aagogo 來自: 59.120.188.59 (06/03 10:04)

06/03 15:37, , 15F
對,三種都能模塑 has-a 的概念。
06/03 15:37, 15F

06/03 15:37, , 16F
composition 又能更進一步指明是 owns-a 的關係。
06/03 15:37, 16F

06/03 15:38, , 17F
至於另一種叫做 dependency 的 relationship,
06/03 15:38, 17F

06/03 15:39, , 18F
它是虛線箭頭,耦合性最弱,只有 function parameter 或
06/03 15:39, 18F

06/03 15:39, , 19F
local variable 用到那個 type,沒保存在物件內,
06/03 15:39, 19F

06/03 15:40, , 20F
只是臨時拿來用。
06/03 15:40, 20F

06/03 15:40, , 21F
考慮到你可能會看到這種線,所以這邊順便提一下。
06/03 15:40, 21F

06/03 16:08, , 22F
那種的我知道,非常謝謝你~
06/03 16:08, 22F
文章代碼(AID): #1C1YiTYA (C_and_CPP)
文章代碼(AID): #1C1YiTYA (C_and_CPP)