0

2 つの異なるソースから結果を取得し、それらを結合するために使用している検索クラスがあります。Search クラスは親であり、Search を拡張する 2 つの子 A と B があります。

Search クラスには、2 つの子オブジェクトをインスタンス化して結果を取得する fetch() というメソッドがあります。次のようになります。

public function fetch(){
  $a = new A($this);
  $a_results = $a->fetch();

  $b = new B($this);
  $b_results = $b->fetch();

  // code to combine the results here
}

クラス A と B のコンストラクタは次のようになります。

class A extends Search
{
    public function __construct(Search $search){
      parent::__construct($search->category, $search->offset, $search->keywords...);
    }

親オブジェクトを子に渡し、まったく同じデータで別の親オブジェクトを作成しているという点で、何か間違っているように感じます。これを設定するより良い方法はありますか?

このように設定したのは、アプリケーションの一部が、親の Search クラスではなく、クラス A と B に直接アクセスする必要があるためです。

4

1 に答える 1

2

コンポジションを使用します。たとえば、Search クラスにソースの配列を持たせます。各ソースは、ソースに共通するものを定義し、A および B ソースごとにパラメーターを渡す Source クラスのインスタンスです。

明確でない場合に備えて、ここでの考え方は、Source クラスがソースからデータを返し、Search クラスに検索を実行させることです。これがどれほど実用的または効率的かは、実際の情報源と検索方法によって異なります

class Search {
    private $sources = array();

    public Search($p1,$p2,$p3,$p4) {
        //Use proper parameters to define the sources
        $sources[] = new Source("A",$p1,$p2,$p3,$p4);
        $sources[] = new Source("B",$p1,$p2,$p3,$p4);
    }
    public function fetch() {
        foreach ($source in $sources) {
             $results[] = $source->fetch();
        }
        combine($results);
    }
}


class Source {
    //Whatever you need to define the source
    public function fetch() {
        //Fetch from the proper source
    }
    public Source($name,$p1,$p2,$p3,$p4) {
         //Store the parameters to be able to operate
    }
}
于 2009-08-19T23:26:00.743 に答える