이 있습니다 Student
클래스, 아니면 그냥 같은 프로그램 실행에 새로운 학생들의 등록을 제어와 통신 Admin
클래스 내부의 함수로 이러한 역할을 내장 OO 인이 작업을 수행하는 몇 가지 방법은 다음과 같습니다.
if(user->has_permission(REGISTER_STUDENT)) {
register_student();
}
학생 인스턴스를 등록 할 권한이 있는지 묻는 중입니다. 다른 방법 :
if(user->in_role(ROLE_ADMIN)) {
register_student();
}
코드와 관련된 문제점은 관리자 역할이 결정되는 방법에 대한 내부 세부 정보를 제공한다는 것입니다. 편지 a
는 결국 새로운 유지 자에 대한 상황에 대해 상황을 잃어 버리고 무의미 해집니다. 반면에 상수 인 ROLE_ADMIN
/REGISTER_STUDENT
은 추가 의견없이 코드의 의도를 분명히합니다.
등록을 수행하는 것은 실제로 User
클래스 또는 Admin
클래스의 책임이 아닙니다. 그것은 Student
에 대한 감각이 자신을 등록 할 수 있도록 않습니다
if(user->in_role(ROLE_ADMIN)) {
student->register();
}
나는 Controller
클래스에서 보여야하는데이 코드를. Controller
클래스를 결정하기 위해 사용자 인터페이스 객체를 검토 할 수있을 것입니다 :
에 어떤 역할 인터페이스
에서 선택한 항목 옵션
는 C 동안
if(user->is_admin()) {
student->register();
}
:
다음을 구현할 수 ODE는 다음과 같은 가능성을 열어두고 할 수 있습니다 덜 유연 매우 분명하다
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
를 대체 할 수 있습니다.