簡體   English   中英

限制 Class 圖中的子對象

[英]Limiting Child Objects in Class Diagram

我想要 model 一個使用 Class 圖的簡單系統:

  • 我有 3 個可能的類: CompanyEmployeeManager
  • Company必須有 20 名Employees (合計?)。
  • Company必須有 1 Manager (聚合?)。
  • Manager是雇員(概括?)。
  • 每個Employee只能在 1 個Company中。

換句話說,我想限制這個系統有 20 個Employees ,其中 1 個必須是Manager 但是只有 1 個可以是Manager 這將使它始終有 19 個Employees和 1 個Manager對象。

我已經在腦海中設置了我希望該系統如何工作的設置,但我無法完全正確地獲得 model。 這就是我得到的:

在此處輸入圖像描述

我覺得我非常親密,但我的問題是,雖然CompanyManager的 1 對 1 關系似乎是正確的,但與Employee的 1 對 19 關系似乎不對。 由於ManagerEmployee ,我無法限制這 19 名Employees中有多少人是Managers 我試圖在不將Employees分成Non-ManagerManager類的情況下做到這一點。

我在正確的軌道上嗎? 有什么我想念的嗎? 或者是否足夠清楚 19 必須是 Employee 對象而 1 必須是 Manager object?

問題

您的 model 有一個弱點:一家公司的Manager可能是另一家公司的Employee ,因為您的 model 中沒有任何內容表示兩個班級與Company的雇佣關系相同。

為什么? 如果應用 UML 泛化語義:

  • EmployeeCompany有關聯,
  • ManagerEmployee的特化,因此繼承了它的所有屬性、操作和關聯,包括與Company的關聯。
  • 此外, ManagerCompany有自己的聯系。 所以它有兩個不同的關聯:繼承的關聯和它自己的關聯。

潛在的解決方案

這將有助於 label 協會的兩端,例如employer / employeecompany / manager

  • 最簡單的解決方案可能是刪除ManagerCompany之間的關聯,因為它是繼承的。 但是沒有簡單的方法可以判斷employees中必須有一個Manager 而且,要找到一家CompanyManager ,也不是一件容易的事。 所以這個解決方案顯得不合適。

  • 另一種解決方案是添加一個約束,指定對於Managermanager.companyemployee.employer相同。 由於一名Manager管理一家且僅一家company ,因此employees中不可能存在其他經理。 但這聽起來有些做作。

  • 因此,我認為最好的解決方案是保留這兩個關聯,但使用 UML smeantics 來解釋company {subsets employer}manager {subsets employee}請注意,此解決方案需要 20 名員工,因為它清楚地表明經理是20.

如果您有興趣了解更多關於子集化的信息,我建議您閱讀這篇關於關聯的重新定義、專業化和子集化的文章,它也可以激發您其他變體的靈感。

次要備注

聚合很好。 然而,聚合是一種 建模安慰劑,因為 UML 規范清楚地說明了第 110 頁:

共享聚合的精確語義因應用領域和建模者而異。

因此,我建議盡可能避免使用它們。 因此,您也可以使用普通的 UML 關聯。 特別是對於只有一個的經理。

qwerty_so在評論中的另一個評論是+應該在+has中刪除: +是關於公眾可見性的。 不是協會本身是公共的還是私人的,而是 協會的末端(例如我提議中的employeremployee )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM