Class 取决于角色的用户操作图表

Class diagram for user actions depending on roles

我是 UML 初学者,我有一个 PHP 应用程序,其中有一个管理区和用户区。用户可以具有 admin 角色、user 角色或两者兼有。 在用户界面中,我们可以提交 salary_request 预付薪水,然后在管理面板中,我们可以 acceptdeny salary_request s,这将简单地改变status 实际 salary_request.

数据库如下:

所以 Class 是:

我不知道如何在 Class 图中添加这些 relations/rules :

我能弄清楚的是这张 Class 图表,它不完整,到目前为止我不确定它是否正确:

User can have one or multiple roles

多重性可以应用于用户和角色之间的关联以识别这一点。在 UML 中,重数以文本的形式写在关联的每一端,可以是绝对值列表,也可以是 "Lower .. Upper" 形式的范围,其中“*”是通配符,表示 "any"。

例如:

  • 0 .. * 表示零个或多个。
  • 1 .. * 表示一个或多个。
  • 1, 2 表示只有一个或两个。
  • 1 正好是一个。

因此,User 和 Role 之间的关联在 User 端可以有多个“1”(正好是一个),在 Role 端可以有多个“1..*”(一个或多个)。

但是,我怀疑一个角色可以有多个用户来完成它,所以我怀疑这种关系实际上是用户“0..*”到角色“1..*”。 IE。一个用户必须有 1 个或多个角色,一个角色可以有零个或多个用户。

if the User is a simple user, he can only submit SalaryRequests if the User is an admin, he can accept or deny the SalaryRequest if the User has both roles admin & user he can add SalaryRequests and also accept or deny them.

这有点难以解释如何表达,因为答案取决于您要解释的内容和原因。

Class 图表表达了代码的 结构 的各个方面,而不是它的行为,而你在这里试图表达的更多是 行为.

图表中 User 和 SalaryRequest 之间的关联已经足够广泛,足以涵盖您在上面确定的所有规则,因此纯粹从 class 设计的角度来看,您可以保持原样,并且以其他方式解释系统的行为规则(例如,使用用例或 Activity 图来解释它)。

但是,如果您认为规则足够强大,需要在 classes 的 结构 中对它们进行编码,那么您将不得不开始在 classes 中派生出不同的子类型或组合来封装您想要的行为,然后使用它们之间的关联将规则固定在结构中。但是,请注意:我不确定您是否真的想在结构上这样做,因为改变结构的成本通常比改变行为的成本更高且影响更深远。

编辑下面的评论

这是一种您可以尝试捕获 classes 结构中的行为规则的可能方法。这个例子使用接口和操作(即封装行为的结构元素)来做到这一点。您会注意到该行为附加到 Role 而不是 User。用户 以履行角色 的能力执行这些行为——也就是说,拥有权利的是角色,而不是用户本身。至少那是我的逻辑:-)。