[英]Limiting Child Objects in Class Diagram
我想要 model 一個使用 Class 圖的簡單系統:
Company
、 Employee
、 Manager
。Company
必須有 20 名Employees
(合計?)。Company
必須有 1 Manager
(聚合?)。Manager
是雇員(概括?)。Employee
只能在 1 個Company
中。 換句話說,我想限制這個系統有 20 個Employees
,其中 1 個必須是Manager
。 但是只有 1 個可以是Manager
。 這將使它始終有 19 個Employees
和 1 個Manager
對象。
我已經在腦海中設置了我希望該系統如何工作的設置,但我無法完全正確地獲得 model。 這就是我得到的:
我覺得我非常親密,但我的問題是,雖然Company
與Manager
的 1 對 1 關系似乎是正確的,但與Employee
的 1 對 19 關系似乎不對。 由於Manager
是Employee
,我無法限制這 19 名Employees
中有多少人是Managers
。 我試圖在不將Employees
分成Non-Manager
和Manager
類的情況下做到這一點。
我在正確的軌道上嗎? 有什么我想念的嗎? 或者是否足夠清楚 19 必須是 Employee 對象而 1 必須是 Manager object?
您的 model 有一個弱點:一家公司的Manager
可能是另一家公司的Employee
,因為您的 model 中沒有任何內容表示兩個班級與Company
的雇佣關系相同。
為什么? 如果應用 UML 泛化語義:
Employee
與Company
有關聯,Manager
是Employee
的特化,因此繼承了它的所有屬性、操作和關聯,包括與Company
的關聯。Manager
與Company
有自己的聯系。 所以它有兩個不同的關聯:繼承的關聯和它自己的關聯。這將有助於 label 協會的兩端,例如employer
/ employee
和company
/ manager
:
最簡單的解決方案可能是刪除Manager
和Company
之間的關聯,因為它是繼承的。 但是沒有簡單的方法可以判斷employees
中必須有一個Manager
。 而且,要找到一家Company
的Manager
,也不是一件容易的事。 所以這個解決方案顯得不合適。
另一種解決方案是添加一個約束,指定對於Manager
, manager.company
與employee.employer
相同。 由於一名Manager
管理一家且僅一家company
,因此employees
中不可能存在其他經理。 但這聽起來有些做作。
因此,我認為最好的解決方案是保留這兩個關聯,但使用 UML smeantics 來解釋company {subsets employer}
和manager {subsets employee}
請注意,此解決方案需要 20 名員工,因為它清楚地表明經理是20.
如果您有興趣了解更多關於子集化的信息,我建議您閱讀這篇關於關聯的重新定義、專業化和子集化的文章,它也可以激發您其他變體的靈感。
聚合很好。 然而,聚合是一種 建模安慰劑,因為 UML 規范清楚地說明了第 110 頁:
共享聚合的精確語義因應用領域和建模者而異。
因此,我建議盡可能避免使用它們。 因此,您也可以使用普通的 UML 關聯。 特別是對於只有一個的經理。
qwerty_so在評論中的另一個評論是+
應該在+has
中刪除: +
是關於公眾可見性的。 不是協會本身是公共的還是私人的,而是 協會的末端(例如我提議中的employer
和employee
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.