所以我的主要问题是Members和Roles都有一个名为团队的字段。
我在想也许可以将团队和角色相互关联,然后将成员与角色关联起来。但这看起来也很混乱和非正统。
我见过有人说你可以使用聚合,但这仍然会导致循环依赖(据我所知)
我还应该提到,每个团队都有可以创建和编辑的自定义角色,而不是预定义的角色集(例如:某些配置文件中的 [ADMIN、STAFF、USER、CUSTOMER])
这可能是关联类的典型示例:
Member
和 Team
Role
中 Member
的 Team
。您的案例面临的挑战是,角色是按团队定义的,但似乎独立于履行该角色的人员。有几种可能的解决方案可以解决此问题,例如:
Membership
,并将该关联类与 Role
关联,其本身又与 Team
关联。 Member
、Role
和Team
之间的三元关联。角色仍然可以与团队相关联。请注意,三元关联更难处理。Role
完全依赖于Team
(即角色仅存在于团队上下文中,不能跨团队使用,例如团队1的管理员可能与管理员拥有不同的权限)团队 2),您可以简化并将 Member
与 Role
关联,将 Role
与 Team
关联,并推断出(在协会名称前加上前缀 /
)该成员与从角色开始团队。在前两种情况下,您需要添加一些约束以确保团队成员身份和角色之间的一致性(以避免团队成员使用团队中不存在的角色)。
在最后一种情况下,您可以考虑
Team
和 Role
之间的复合聚合(团队方面的黑色菱形,表示角色的生命周期取决于团队)。
在任何情况下都不应该考虑共享聚合(白色菱形):虽然它仍然很流行,但 UML 没有为它定义任何特殊语义,这使得它与简单关联没有什么不同,并且简单性应该始终占上风)。
建议:由于您有角色中团队的名称,我强烈建议考虑解决方案 3,并将此属性设为派生属性(/team : String),或者最好放弃它。
循环依赖:如果您的类是关联的并且您需要双向 关联,一个常见的实现是让每个类互相引用。如果这对您来说是个问题,您也可以有一个代表关联的第三个类:这个第三个类将依赖于其他两个类。但是,如果一个对象想要导航到另一个对象,则它需要了解第三个类,并且您将再次陷入(另一个)循环依赖关系。这仅仅与两个建模概念的相互依赖性有关。