有几种 OO 方法可以做到这一点:
if( user->has_permission( REGISTER_STUDENT ) ) {
  register_student();
}
这是询问用户实例是否有权注册学生。其他方式:
 if( user->in_role( ROLE_ADMIN ) ) {
   register_student();
 }
我对代码的问题是它公开了有关如何确定管理员角色的内部细节。这封信a最终将失去上下文,对于新维护者的地位变得毫无意义;然而,常量ROLE_ADMIN/REGISTER_STUDENT阐明了代码的意图,而不需要额外的注释。
执行注册并不是User类或类的真正责任。a注册自己Admin确实有意义:Student
 if( user->in_role( ROLE_ADMIN ) ) {
   student->register();
 }
我希望在Controller课堂上看到这段代码。该类Controller将能够检查用户界面对象以确定:
- 当前选择了哪个学生
 
- 用户从界面中选择了什么选项
 
- 用户是什么角色
 
您可以实现以下内容:
if( user->is_admin() ) {
  student->register();
}
虽然代码非常清晰,但灵活性较低,因为您可能希望保留以下可能性:
if( controller->can_execute( user, action ) ) {
  action->execute();
}
else {
  controller->execute_error( user, action );
}
这提供了一个更加灵活的系统,可以将角色动态分配给操作。例如,您可以将方法映射student->register()到ROLE_ADMIN. 这将整个应用程序中的所有安全约束保持在一个位置,从而大大简化了维护。
还可以进一步简化:
controller->execute( user, action );
然后执行方法将类似于:
void execute( User user, Action action ) {
  if( can_execute( user, action ) ) {
    action->execute();
  }
  else {
    error( user, action );
  }
}
bool can_execute( User user, Action action ) {
  return user->is_in_role( action->get_role() );
}
cout现在抽象了如何显示权限错误(对话框与 )的实现细节。此外,错误消息可以更全面,例如:
"User registration is restricted to the administrator role."
编码为以下字符串:
"%s is restricted to the %s role."
控制器类可以自动替换%s。