0

一般的なユーザーのすべてのニーズを満たす基本的な User モデルがあります。ここで、ユーザー用にいくつかの異なるロールを作成する必要があります。それぞれのロールには、他のロールでは使用できない約 10 ~ 20 の異なるメソッドがあります。

ユーザーの役割を決定するために、一般的な User クラスをロードする必要があると仮定します...

非常に多くの異なるロールベースのメソッドを一般的なユーザーモデルにパッケージ化するのは非効率的で重いため (すべてのロールで利用できない場合)、ユーザーがロールベースのメソッドにアクセスできるようにする最善の方法は何ですか?それらが必要ですか?

ここに私が投げかけているいくつかのアイデアがあります:

  1. ロールごとに個別のサービス クラスを用意し、ユーザーのロールに従ってそれらを User クラスに付与します。

  2. ユーザークラスのすべてのメソッドを持ち歩き、ユーザーが適切な役割を持っている場合にのみ、それぞれへのアクセスを許可します。

  3. 完全にリファクタリングし、役割ベースのクラスを User クラスから継承させます。

これらの良いアイデアはありますか、それとももっと良いアイデアはありますか?

4

2 に答える 2

3

役割ベースのクラスをUserオブジェクトに構成するだけではどうでしょうか。

$user = new User(/* pass role as an arg */);

// Internally:
// if ($user->getRole() instanceof AdminRole) or similar...
if ($user->isAdmin()) {
    // AdminRole::doSomethingAdminish()
    $user->getRole()->doSomethingAdminish();
}
于 2011-09-23T19:21:47.980 に答える
2

工場のパターンを見てみましょう。基本的に、オブジェクトをインスタンス化するために必要なデータを渡すと、正しいオブジェクトがすぐに使用できる状態で返されます。

おそらく次のようなもの

class UserFactory
{
   public static function getUser($userId)
   {
      $user = new User($userId);
      switch ($user->getType()) {
         case 'admin' :
            return new AdminUser($user);
         case 'guest' :
            return new GuestUser($user);
         default :
            //handle 
      }
   }
}
于 2011-09-23T19:18:46.723 に答える