2

オブジェクト タイプに基づいてさまざまな子クラスをインスタンス化するか、子クラスのメソッドを使用して Base クラスを拡張するアーキテクチャ ソリューションを探しています。

例を挙げると、基本クラスUserといくつかの子クラスPartnerClientModeratorがあり、これらには固有のメソッドと独自のコンストラクターがあります。私が電話しているとき

$user = new User($userid);

ユーザークラスが欲しい

class User
{
  public function __construct($userid) {
    self::initDB(); 

    if ($this->isPartner()) {
        //extend this class with the methods of "Partner" child class and run "Partner" class constructor
    }

    if ($this->isClient()) {
        //extend this class with the methods of "Client" child class and run "Client" class constructor
    }

    if ($this->isModerator()) {
        //extend this class with the methods of "Moderator" child class and run "Moderator" class constructor
    }
  }
}

ユーザーが持っている役割に応じて、すべてのメソッドを含むオブジェクトを返します。

私の論理がどこかで壊れており、提供した例が間違っていることはわかっています。しかし、私が今見ている唯一の解決策は、すべてのロールのすべてのメソッドを持つ 1 つの巨大なクラスを構築することです。これは混乱しているように見えます。

4

2 に答える 2

4

まず第一に、データベース ロジックはドメイン オブジェクト (ユーザーなど) から完全に分離する必要があります。そうしないと、単一責任の原則 (SRP) に違反しています。

次のようなクラスを設定します (基本クラスの User と複数のサブクラス)。

class User 
{
  private $id;
  // getters and setters go here
}

class Moderator extends User {}
class Partner extends User {}
// etc

UserManager次に、次のようなインターフェイスを実装するある種のクラスを作成します。

interface UserManagerInterface {
  function loadUserById($id);
}

そのメソッドの実装では、渡されたユーザー ID の情報をデータベースからロードし、そのタイプ (パートナー、モデレーターなど) を調べてから、適切なクラスをインスタンス化し、適切な情報をハイドレートする必要があります。

于 2013-01-15T00:47:33.860 に答える
2

問題は、オブジェクトnew User以外のものを呼び出して取得できないことです。User

これは、ファクトリ パターンの完璧な使用例のように思えます。

これの最も単純な形式では、静的メソッドを使用して正しいコンストラクターを呼び出します。

したがって、次のようなコードを作成できます。

class User {
    public static function create($userid) {
        // get user from the database

        // set $isPartner to true or false
        // set $isClient to true or false
        // set $isModerator to true or false

        if ($isPartner) {
            return new Partner($userid);
        } elseif ($isClient) {
            return new Client($userid);
        } elseif ($isModerator) {
            return new Moderator($userid);
        } else {
            return new User($userid);
        }
    }
}

User::create($userid)その後、適切なオブジェクトを取得するために呼び出すことができます。

コードが適切に構造化されている場合、Lusitanian の回答 (肉付けされた) の行に沿って、より優れた、より柔軟な仕事をするコードを作成できる可能性があります。

于 2013-01-15T00:47:11.117 に答える