0

前文:基本クラスが派生型を認識して相互作用を行うのは悪い設計ですか?私はそうではないと思いますが、次の場合、どのようなアプローチを検討する必要がありますか?


言語はPHPですが、この質問はデザインパターンのより広い主題に関係していると思います

ノードとして機能するクラスのセットをモデル化しようとすると、ジレンマが発生します。私は自分のデザインの決定を2番目に推測し続けます、そしてそれは永続的な欲求不満につながります。

このパラメータのセットが与えられた場合:

  • ノードには親参照があります(一方向トラバーサル
  • Nodeから派生したオブジェクトタイプは、Nodeから派生した他のオブジェクトタイプの親(または子)になる可能性があります。

だから私は持っています:

abstract class AbstractNode{

    protected $_parent;

    public function __construct(self $parent = null){
        $this->_parent = $parent;
    }

    public function get_parent(){
        return $this->_parent;
    }

}

class NodeOne extends AbstractNode{ }

class NodeTwo extends AbstractNode{ }

// more derivatives

ここで、私の設計のジレンマが発生します。トラバーサル中にNodeOne、インスタンス自体と、派生したタイプの他のインスタンスを見つける必要がある場合がありますAbstractNodeこの機能はインスタンスに限定されないことに注意してください。ただしNodeOne、これは単なる例です) 。

これにより、タイプ固有のトラバーサルで、たとえば、ツリーの上位にある特定のタイプのオブジェクトからのデータを集約できます。私はこの目的を果たすための方法を専門にすると思いました:

public function get_node_one_ancestor(){
    if($this->_parent instanceof NodeOne){
        return $this->_parent;
    }
    if(null !== $this->_parent){
        return $this->_parent->get_node_one_ancestor();
    }
    return null;
}

派生型はインスタンスをトラバースする必要がある可能性があるためNodeOne、このメソッドを基本クラスに配置することは理にかなっていますがAbstractNode、私の基本クラスでは派生型を認識する必要があります。

これは悪臭があると思いますが、この方法が他にどこに行けばいいのかわかりません。考えられる解決策の構造設計パターンについて読んでいます。


頭に浮かぶアナロジーはDOMであり、特定のタイプの祖先トラバーサルを実行します。

<root>
    <foo id="1">
        <bar id="2"></bar>
        <bar id="3">
            <foo id="4">
                <bar id="5">
                    <foo id="6">
                        <bar id="7"></bar>
                    </foo>
                </bar>
                <bar id="8"></bar>
            </foo>
        </bar>
    </foo>
</root>
  • すべての祖先値bar[@id='8']の集計から: 結果fooid
    4 1

  • すべての祖先値bar[@id='7']の集計から: 結果fooid
    6 4 1

4

1 に答える 1

1

それを一般化できるはずです:

public function get_ancestor($type){
    if($this->_parent instanceof $type){
        return $this->_parent;
    }
    if(null !== $this->_parent){
        return $this->_parent->get_ancestor($type);
    }
    return null;
}

私には、これは外部の反復子オブジェクトに存在する可能性のあるもののように思えますが、この投稿を作成する前によく考えたとは言えません...

于 2011-12-12T21:07:01.843 に答える