1

Displayスクリプトの HTML 出力を処理するオブジェクトがあります。mode出力の生成方法の多くの側面を定義するプロパティがあります。いくつかのモードがあり、後でさらに追加する予定です。各モードは、独自のパラメーターを意味します。たとえば、authorモードはauthorID. searchモードはSearch、クエリ情報を含むオブジェクトをパラメーターとして意味します。モードは、およびパラメーターcommentを意味します。postIDcommentID

したがって、 aには、 に応じてmodenameといくつかの があります。parametersname

とのDisplay_Mode2 つのプロパティを持つオブジェクトを作成することにしました。しかし、どのように割り当てますか? 私がモードを持っている場合、それは必然的にパラメーターがあることを意味しますか?nameparametersparametersnamescommentpostIDcommentID

私の現在の解決策はこれです:

class display_mode{
    public $name;
    public $params;

    public function __construct($name)
        {
        $this->name = $name;
        switch ($this->name){
            case 'comment':
                $this->params = array('postID', `commentID`);
                break;
            case 'author':
                $this->params = array('authorID');
            }
            //etc..
        }
    }

これは少し厄介なようです。より良い方法はありますか?

UPD:与えられた回答により、設計全体に関する別の質問をするようになりました。これは、この質問のコンテキストも提供します。

4

3 に答える 3

4

クラスの共通機能をDisplay_Mode抽象基本クラスまたはインターフェイスに抽象化し、個々のモードを基本クラスから継承する (またはインターフェイスを実装する) クラスとして定義することをお勧めします。

これらの特殊化されたモード クラスは、コンストラクタやメソッドで必要なパラメータを明示的に定義し、各「モード」が必要とする出力の生成を担当します。

Display_Modeただし、クラスが何をすべきかを正確に知らずに、これよりも具体的なアドバイスをすることは困難です。


ここでの考え方は、OOP ですべてを行うクラスを避けるべきであり、それぞれが単一の目的を持つ小さな自己完結型のクラスを好むということです。各モードに、そのコンテンツを個別にレンダリングできる独自のクラスを与えることで、表示モードの動作方法を変更したり、新しいモードを追加したりすることが簡単になります。新しいクラスを追加するだけです。

これは、疎結合と呼ばれます。

于 2012-12-18T21:18:47.133 に答える
1

説明はややこしいですが、 の可能な「パラメータ」ごとにアダプタを作成しますDisplay。このアダプターは、表示するリソースとは関係なく、単一のインターフェースを提供できます。

$parameter = new UnknownPrameter;

$adapterFactory = new AdapterFactory;
$parameter = $adapterFactory->build( $parameter );

$display->present( $parameter );

AdapterFactory::build()指定した特定のタイプのパラメーターのラッパーを作成する場所。返されるインスタンスは、そのパラメーターのコンテナーです。

このアプローチでは、計算がコンストラクターに蓄積されなくなり、コードのテスト/展開が難しくなります。

于 2012-12-18T21:25:44.617 に答える
0

@Will Vousdenはすでに答えを出しています。これは、問題にアプローチする方法の簡単な例です。

abstract class DisplayMode {
    protected $_params = array();

    public function __construct(array $params) {
        $this->_params = $params;
    }

    public function hasParameter($key) {
        if (array_key_exists($key, $this->_params)) {
            return true;
        }
        return false;
    }

    public function setParameters(array $params) {
        $this->_params = $params;
        return $this;
    }

    public function getParameters() {
        return $this->_params;
    }
}

class CommentMode extends DisplayMode {
    public function getCommentId() {
        if ($this->hasParameter('comment_id')) {
            return $this->_params['comment_id'];
        }    
        return null;
    }

    public function getPostId() {
        if ($this->hasParameter('post_id')) {
            return $this->_params['post_id'];
        }    
        return null;
    }
}

class AuthorMode extends DisplayMode {
    public function getAuthorId() {
        if ($this->hasParameter('author_id')) {
            return $this->_params['author_id'];
        }    
        return null;
    }
}

$comment = new CommentMode(array('post_id' => 4, 'comment_id' => 2));
$author = new AuthorMode(array('author_id' => 3));

// example

print $comment->getCommentId() . ' -  ' . $comment->getPostId() . '  - ' . $author->getAuthorId();
于 2012-12-18T21:50:03.537 に答える