OOAD中如何处理多用户不同权限共享实体的属性设计?
核心结论:权限信息必须与View实体解耦,单独管理
绝对不要把权限属性加到View实体里,原因很直接:
- 违反单一职责原则:View的核心职责是封装视图本身的固有属性(名称、显示内容等),权限是用户/角色对视图的访问规则,属于访问控制范畴,和View本身的属性没有紧密耦合。硬塞进去会让View类承担双重职责,后续修改权限规则(比如新增权限类型)都要改动View,维护成本陡增。
- 无法适配多用户多权限场景:一个View被多个用户以不同权限访问时,如果权限存在View里,要么只能存储单一默认权限(满足不了多用户差异),要么冗余存储多组权限数据(导致View数据结构混乱),完全不符合你的业务需求。
具体设计方案
按照你“提取名词为类”的思路,新增用户-视图权限关联类(比如命名为UserViewPermission),专门维护三者的关联关系:
- 属性包含:关联的
User实例、关联的View实例、权限等级(建议用枚举类型,比如READ_ONLY/EDIT/FULL_CONTROL) - 方法可包含:
getPermissionLevel()(获取当前用户对该视图的权限)、updatePermissionLevel()(修改权限)等,所有权限相关操作都归到这个类里
针对OOAD新手的补充建议
在“提取名词为类、动词为方法”的基础上,还要兼顾两个核心设计原则:
- 精准拆分名词:区分“实体类”(比如User、View,代表独立存在的业务对象)和“关联类”(比如UserViewPermission,代表实体间的关系与规则),不要把关联型概念硬塞给单一实体。
- 清晰归属动词:比如“修改视图权限”这个动作,应该放在
UserViewPermission类或者专门的权限管理服务类中,而不是View或User类,确保每个类的职责边界清晰。
如果后续需要支持角色级权限(比如某个角色下的所有用户对视图有相同权限),可以再扩展新增RoleViewPermission类,或者在权限关联类中支持用户/角色两种关联对象,这样扩展性会更好。
内容的提问来源于stack exchange,提问作者rahul vignesh
相关产品推荐
相关产品推荐

