领域模型定义关系
Domain model defining relationships
假设每个人都有权进行CRUD操作(每个人都是管理员类型的用户)。我已经在域图中显示了用户可以执行的 CRUD 操作,但是它变得非常混乱。我很好奇是否可以接受下图中所示的替代方法,因为乘法关系对于每个操作(创建、编辑、删除)
保持不变
分离的 CRUD
替代方法? (创建、编辑、删除)
简而言之
如果它变得凌乱,它可能缺乏关注点分离,或者代表并不真正需要的关联。
更多解释
需要关联吗?
User
和 Xxx
之间的关联意味着两个 class 之间的 semantic relationship。这意味着 classes 的实例是 linked 而不仅仅是在操作时。所以 x
将能够找到更新它的 User
(s),并且 u
会知道它更新的 Xxx
个实例。如果你想要一些审计线索,这种关联是有意义的,但这似乎不是你的目的。
换句话说,User
可能会执行一些 Xxx
的 CRUD 实例的操作这一事实不足以证明关联的合理性。
如果需要,是否代表你的想法?
现在看来您的关联是 can ...
,即某种授权方案。您的图表表明每个用户都需要提前知道它可以更新的所有 Xxx
。这是一个沉重的负担。这也意味着用户需要知道它可以创建的所有 Xxx
;在它们被创建之前?这看起来有点不一致。
建模授权方案
如果您想设计一个授权系统,您可能不会 link 用户直接访问该对象,而是使用一些中介机制:
- 为了表示用户可以创建新项目,您可能需要一些授权对象来说明可以创建的项目的特征。
- 为了表示用户可以编辑、更新、删除项目,您可以像您设想的那样直接关联,如果某些管理员会维护此类授权。
- 但您可能会有一些授权对象来告诉用户可以做什么(例如,用户“角色”/“配置文件”)以及项目的类别。
- 同样可能存在一些管理 CRUD 授权的规则(例如,具有“编辑”角色的用户可以编辑分配给 he/she 的项目,但不能编辑其他项目)。使用此类规则而不是明确设计(冗余)授权可以为您节省大量不必要的额外关联(以及使授权与规则保持一致的额外约束)。
关注点分离
为了让事情继续变得混乱,你应该考虑:
- 在您的模型中有一个单独的授权概念图
- 使用一些通用的 CRUD 界面:然后用户将与 CRUD 界面相关联,而不必为每个可能的 class.
复制所有内容
您的两个 class 模型的主要问题是 type/instance 级别之间的混淆。您的“可以 create/edit/delete”授权关系在特定用户和特定 对象(Company
、Project
或 Ticket
),而是在特定用户和特定 对象类型 (Company
、Project
或 Ticket
)之间,因此它不是两个普通对象类型之间的普通关联。
如果你想 describe/define 这种与 class 模型的授权关系,你需要定义一个像 ObjectType
这样的元 class 并表达你的对象类型(Company
、Project
或 Ticket
)是它的实例。
假设每个人都有权进行CRUD操作(每个人都是管理员类型的用户)。我已经在域图中显示了用户可以执行的 CRUD 操作,但是它变得非常混乱。我很好奇是否可以接受下图中所示的替代方法,因为乘法关系对于每个操作(创建、编辑、删除)
保持不变分离的 CRUD
替代方法? (创建、编辑、删除)
简而言之
如果它变得凌乱,它可能缺乏关注点分离,或者代表并不真正需要的关联。
更多解释
需要关联吗?
User
和 Xxx
之间的关联意味着两个 class 之间的 semantic relationship。这意味着 classes 的实例是 linked 而不仅仅是在操作时。所以 x
将能够找到更新它的 User
(s),并且 u
会知道它更新的 Xxx
个实例。如果你想要一些审计线索,这种关联是有意义的,但这似乎不是你的目的。
换句话说,User
可能会执行一些 Xxx
的 CRUD 实例的操作这一事实不足以证明关联的合理性。
如果需要,是否代表你的想法?
现在看来您的关联是 can ...
,即某种授权方案。您的图表表明每个用户都需要提前知道它可以更新的所有 Xxx
。这是一个沉重的负担。这也意味着用户需要知道它可以创建的所有 Xxx
;在它们被创建之前?这看起来有点不一致。
建模授权方案
如果您想设计一个授权系统,您可能不会 link 用户直接访问该对象,而是使用一些中介机制:
- 为了表示用户可以创建新项目,您可能需要一些授权对象来说明可以创建的项目的特征。
- 为了表示用户可以编辑、更新、删除项目,您可以像您设想的那样直接关联,如果某些管理员会维护此类授权。
- 但您可能会有一些授权对象来告诉用户可以做什么(例如,用户“角色”/“配置文件”)以及项目的类别。
- 同样可能存在一些管理 CRUD 授权的规则(例如,具有“编辑”角色的用户可以编辑分配给 he/she 的项目,但不能编辑其他项目)。使用此类规则而不是明确设计(冗余)授权可以为您节省大量不必要的额外关联(以及使授权与规则保持一致的额外约束)。
关注点分离
为了让事情继续变得混乱,你应该考虑:
- 在您的模型中有一个单独的授权概念图
- 使用一些通用的 CRUD 界面:然后用户将与 CRUD 界面相关联,而不必为每个可能的 class. 复制所有内容
您的两个 class 模型的主要问题是 type/instance 级别之间的混淆。您的“可以 create/edit/delete”授权关系在特定用户和特定 对象(Company
、Project
或 Ticket
),而是在特定用户和特定 对象类型 (Company
、Project
或 Ticket
)之间,因此它不是两个普通对象类型之间的普通关联。
如果你想 describe/define 这种与 class 模型的授权关系,你需要定义一个像 ObjectType
这样的元 class 并表达你的对象类型(Company
、Project
或 Ticket
)是它的实例。