1

私はしばらくの間、この問題についてかなり混乱しています。

たとえば、大学に新入生を登録できるのは管理者だけである OO システムを設計する必要があるとします。今、私は(明らかに)システムの他のユーザーを持っています。ユーザーが管理者である場合にのみ適用されるこれらの権限をどのように制御すればよいですか?

Admin私には 2 つの可能性があります: これらのロールをclass と通信するクラス内の関数として埋め込むStudentか、次のようにプログラム実行で新しい学生の登録を制御するだけです。

if(user_type() == 'a') register_student(); // a type means an admin user

else cout << "Access denied";

...
4

1 に答える 1

3

これを行うには、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。これにより、アプリケーション全体のすべてのセキュリティ制約が 1 つの場所に保持され、メンテナンスが大幅に簡素化されます。

さらに単純化することもできます。

controller->execute( user, action );

次に、execute メソッドは次のようになります。

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ます。

于 2013-01-09T17:17:09.630 に答える