图像显示仓库的物流。非常简单。它的概念是什么:有文件:ReceivingWayBill
,DispatchingWaybill
,ReplacementOrder
。
他们与主要类别互动:Warehouse
,Counterparty
,Item
。
Register
班级:ItemRemainsInWarehouse
。事实证明,该文件是对操作,接收,发送等的确认。 Register
只存储有关剩余商品数量的信息。
如果你错过了这个方案的很多问题,例如:缺乏泛化,吸气剂和制定者以及其他所有问题。
谁可以告诉:类之间的关系,到处都有具体的聚合,是否正确放置,还是我们能以某种方式更详细地考虑关联?
答案 0 :(得分:0)
聚合是邪恶的!
阅读有关他们引入的两种变体的UML规范(第110页):
无:表示该属性没有聚合语义。 [听,听!]
shared :表示该属性具有共享聚合语义。共享聚合的精确语义因应用领域和建模者而异。
复合:表示属性是复合聚合的,即复合对象负责组合对象的存在和存储(参见11.2.3中部分的定义)。
复合聚合是一种强大的聚合形式,需要一次将一个零件对象包含在最多一个复合对象中。如果删除了复合对象,则会删除作为对象的所有零件实例。
现在,最后一句清楚地表明了在安全相关的应用程序中应该使用复合(!)聚合的位置。删除数据库中的人员记录时,还需要删除所有相关实体。通常用汽车由电机,轮胎等组成的例子并不适合。当你“删除”汽车时,轮胎不会消失。只是因为你无法删除它。更糟糕的是使用共享复合,因为它没有每个定义的定义(原文如此!)。
那你该怎么办?使用多重性!这就是人们通常想要展示的东西。有0..n
,1
等元素与另一方的班级相关。最后,您可以使用角色将其命名为显式。
如果您考虑DispatchingWaybill
和ReceivingWaybill
,它们看起来就像是关联类。使用正确的多重性(1-* / *-1
),您可以这样做。 (编辑:注意关联结尾的小点,告诉相反的类有一个以角色命名的属性。)
或者用虚线附加到它们当前连接到的类之间的关联。
答案 1 :(得分:0)
用提供的解释纠正整个模型是如此困难(可能是不可能的)。我做了一些改进。
您应该将多重性与您建立关系。它们非常重要。在某种关系中,您有1(ReplacementOrder
,Warehouse
),并且您的一些关系可能是*(Item
,ReceivingWayBill
)
您将聚合放在您的类之间,我们知道聚合是关联类型。你也可以放置关联。您可以找到许多类似的问题和答案,解释关联和聚合(和组合)之间的差异。见Question 1,Question 2和Question 3。但我建议this answer。
我认为聚合与关联之间存在 NOT 显着差异。请参阅this question中的示例。
Robert C. Martin说(见here):
关联表示一个实例向另一个实例发送消息的能力。
聚合是典型的整体/部分关系。这与实例异常的关联完全相同 不能有循环聚合关系(即一部分不能 包含它的全部。)
因此:您的一些关系正是一种聚合。 (Item
与其他类之间的关系)。您的Counterparty
没有良好的API定义。您的其他关系是关于使用Warehouse
类。我认为(只是猜测)其他类只使用Warehouse
类服务(公共方法)。在这种情况下,它们可以是关联。否则,如果他们需要Warehouse
的实例作为其一部分,则它们是聚合。