Class 取决于角色的用户操作图表
Class diagram for user actions depending on roles
我是 UML 初学者,我有一个 PHP 应用程序,其中有一个管理区和用户区。用户可以具有 admin
角色、user
角色或两者兼有。
在用户界面中,我们可以提交 salary_request
预付薪水,然后在管理面板中,我们可以 accept
或 deny
salary_request
s,这将简单地改变status
实际 salary_request
.
数据库如下:
users
table : id, email, password, first_name, last_name
roles
table : id, name
user_role
: user_id, role_id(users
和 roles
之间的关系 table)
salary_requests
: id, amount, date, requested_by, validated_by, status
所以 Class 是:
User
Role
SalaryRequest
- 和
Status
枚举
我不知道如何在 Class 图中添加这些 relations/rules :
User
可以有一个或多个角色
- 如果
User
是普通用户,他只能提交SalaryRequests
- 如果
User
是管理员,他可以接受或拒绝 SalaryRequest
- 如果
User
具有 admin
和 user
这两个角色,他可以添加 SalaryRequests
并接受或拒绝它们。
我能弄清楚的是这张 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。用户 以履行角色 的能力执行这些行为——也就是说,拥有权利的是角色,而不是用户本身。至少那是我的逻辑:-)。
我是 UML 初学者,我有一个 PHP 应用程序,其中有一个管理区和用户区。用户可以具有 admin
角色、user
角色或两者兼有。
在用户界面中,我们可以提交 salary_request
预付薪水,然后在管理面板中,我们可以 accept
或 deny
salary_request
s,这将简单地改变status
实际 salary_request
.
数据库如下:
users
table : id, email, password, first_name, last_nameroles
table : id, nameuser_role
: user_id, role_id(users
和roles
之间的关系 table)salary_requests
: id, amount, date, requested_by, validated_by, status
所以 Class 是:
User
Role
SalaryRequest
- 和
Status
枚举
我不知道如何在 Class 图中添加这些 relations/rules :
User
可以有一个或多个角色- 如果
User
是普通用户,他只能提交SalaryRequests
- 如果
User
是管理员,他可以接受或拒绝SalaryRequest
- 如果
User
具有admin
和user
这两个角色,他可以添加SalaryRequests
并接受或拒绝它们。
我能弄清楚的是这张 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。用户 以履行角色 的能力执行这些行为——也就是说,拥有权利的是角色,而不是用户本身。至少那是我的逻辑:-)。