【问题标题】:Class diagram for user actions depending on roles取决于角色的用户操作的类图
【发布时间】:2020-05-10 14:59:27
【问题描述】:

我是 UML 的初学者,我有一个 PHP 应用程序,其中有一个管理员区域和用户区域。用户可以拥有admin 角色、user 角色或两者兼有。 在用户界面中,我们可以提交salary_request 以预支薪水,然后在管理面板中,我们可以将denysalary_requests 更改为实际@ 987654330@.

数据库如下:

  • users 表:ID、电子邮件、密码、名字、姓氏
  • roles 表:id,名称
  • user_role:user_id、role_id(usersroles之间的关系表)
  • salary_requests: id、金额、日期、request_by、validated_by、状态

所以类是:

  • User
  • Role
  • SalaryRequest
  • Status枚举

我不知道如何在类图中添加这些关系/规则:

  • User 可以有一个或多个角色
  • 如果User是普通用户,只能提交SalaryRequests
  • 如果User 是管理员,他可以接受或拒绝SalaryRequest
  • 如果User 拥有adminuser 这两个角色,他可以添加SalaryRequests 并接受或拒绝它们。

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

【问题讨论】:

  • 据我所知,这里没有问题。那么你的呢?

标签: uml class-diagram


【解决方案1】:

用户可以拥有一个或多个角色

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

例如:

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

因此,用户和角色之间的关联在用户端可能有多个“1”(正好是一个),在角色端可能有多个“1..*”(一个或多个)。

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

如果用户是一个简单的用户,他只能提交 SalaryRequests,如果 用户是管理员,他可以接受或拒绝 SalaryRequest 如果用户 同时拥有管理员和用户角色,他可以添加 SalaryRequests 并接受 或否认他们。

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

类图表达代码的结构的各个方面,而不是其行为,而您在此处试图表达的更多的是行为

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

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

编辑以下评论

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

【讨论】:

  • 谢谢,这很有帮助。所以对于第二点,您是说在类图中我可以创建一个名为AbstractUser 的超类,以及两个名为UserAdmin 的子类,那么每个子类都会有一个特定的关联用SalaryRequest类来描述更多?而且在我的实际代码中没有必要具有相同的结构,所以我将在代码中留下一个User 类以使其简单?
  • 是的,这是一种方式,但即使如此,也很难解释你想要的规则。关联必须对它们应用约束来表达有点笨拙的规则。相反,您可以使用接口,例如“RequestApprover”和“RequestMaker”,用户或角色(或您在评论中描述的其中一个子类型)通过这些接口与 SalaryRequest 交互。这样,Approve/Reject 和 Make 的业务逻辑就可以在类的结构中表达出来。我将编辑答案以提供此示例。
  • 哦,我明白了!谢谢你的详细回答,我很感激。
猜你喜欢
  • 1970-01-01
  • 2012-12-04
  • 2017-09-16
  • 2015-02-22
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 2015-12-09
  • 2019-11-23
相关资源
最近更新 更多