2010-12-06 66 views
1

我有一個Album類和一個Track類。曲目可以獨立於專輯存在,但是專輯不能沒有任何曲目存在。這是一個聚合或組合關聯?

我在想這是一個聚合,因爲當專輯被銷燬時曲目不會被銷燬。但是屬於特定專輯的特定曲目將隨專輯銷燬......所以有人可以更清楚地說明這一點嗎?

此外,這是作業,但這不是真正的問題。我們正在做一個巨大的建模練習,這是一個單一的關聯鏈接。

回答

6

在非家庭作業的世界裏,這是用例決定設計的地方。

如果曲目是獨立的實體,專輯是曲目的集合,那很好。但是,在這樣的系統下,刪除專輯並不意味着刪除曲目。

...除非你有一個選項「刪除與專輯曲​​目」

...或者你決定,只有當所有的專輯都不再包含它的軌道將被刪除。

...你有一個「未分類的曲目」專輯,無法刪除。

聽起來你需要確定你打算如何使用你的應用程序,然後再決定數據模型支持你可能想要支持的確切的使用模式。

4

一個專輯是一個軌道的集合。 A Track 相關聯的零個或多個專輯。存在沒有專輯的軌道這樣的事情。因此,專輯是軌道的彙總。一首曲目可以放在多張專輯(概念上,考慮Greatest Hits集合!),所以顯然不適合銷燬曲目,因爲它的第一張專輯已被刪除。

如果一個對象可以同時存在於多個集合中,或者可以獨立於該集合而存在,或者在收集時不應該銷燬,則這是一個聚合

爲什麼在銷燬相冊時想要銷燬曲目?如果曲目有零個或一個專輯,並且永遠不會從添加到專輯中刪除,則合成可能更合適 - 但這更像聚合,並且您的「屬於特定專輯的曲目應該被銷燬與專輯「可能不在正確的軌道上。

組合和聚合主要是出於這個原因分開的:你需要知道何時不安全地假設一個對象已經因爲包含它的集合而被重新引用(這對於聚合來說是不安全的,而不是作曲),如果你想摧毀一些東西,只是因爲它的收藏消失了,它可能是一個構圖 - 但如果這不是你使用它的方式,那麼某處可能出錯了。

2

從你的問題的第一部分我會說這不是組成。如果一首曲目可能超過其專輯,那麼按照其定義,其生命週期不受專輯的影響。所以它不是組成。

我甚至會質疑它是否是Aggregation - 但是這取決於您對Aggregation的特定定義,因爲它在UML規範中的定義非常糟糕。

基於你給我最好的信息更可能模式爲直多方面的:許多二進制協會,理由是你試圖捕捉域規則上:

  1. 每張專輯包括一個或多個曲目
  2. 每個曲目可以出現在一個或多個專輯中。

但是有一點你的問題我真的不明白:屬於一個特定的專輯將與冊頁被破壞

但具體曲目...

你能詳細說明嗎?什麼區別與其專輯摧毀的軌道不是?

hth。