在设计类的时候,你是怎么处理子类型的?

When designing classes, how do you deal with sub-types?

我正在学习面向对象的设计,因为我正在经历我的第一个真实的,尽管是个人的项目。

我正处于构建用户对象的阶段。我有 4 个用户子类型:

  1. root-admin - 网站管理员,网站所有者
  2. group-admin - 具有成员资格和页面的组的领导者(例如乐队经理)
  3. group-member - 可以在页面上查看、post 和作为群组成员发表评论并查看私人内容(例如乐队成员)的用户
  4. 非关联用户 - 可以公开查看和评论的整个站点的成员(例如粉丝)

所有群组管理员都将成为群组成员,所有群组成员也将成为非关联用户。所以基本上它是一个简单的用户权限层次结构。

话虽如此,我该如何根据这些级别设置 class 的架构?有嵌套技术吗?我只是在努力解决这里的脚手架问题。我已经写好了我的用例和叙述。

所以您正在实施 role-based 访问控制。每个用户都具有四种角色之一。所以用户是一个对象,用户的角色是用户对象中的属性之一。

enum roles {
   root_admin,
   group_admin,
   group_member,
   unassociated_user
}

class user {
   string id;
   roles role;
}

接下来,您需要执行允许特定角色的用户执行特定活动的业务规则。

从一个简单的解决方案开始(这总是一个好策略):

enum activities {
   view,
   post,
   add_comment
}

并实现一个函数或 class,其工作是说明给定角色是否允许 activity。

class role_based_access_control {
private:
      permissions perm;
public:
   bool is_permitted(activities a, roles r) {
      return perm[r].contain(a);
   }
}

然后,在代码中实现不同活动的地方,包括对此函数的调用:

void add_comment_to_page(user u, comment c, page p) {
   if (!role_base_access_control.is_permitted(add_comment,u.role))
      throw "access_forbidden";
   ... 
}

重要的是保持基于角色的访问控制规则集中,以便它们可见、易于监控和审计。