2009-08-19 8 views
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に直接アクセスする必要があるため、この方法で設定しました。

+1

Do AとBの両方でfetchメソッドが実装されていますか?そうでなければ、無限ループになります。 Searchを拡張するのはあなたが探しているものではないようですが、AとBのクラスは単にSearchオブジェクトをその__constructパラメータとして取って、Searchオブジェクトのプロパティを使用するだけです。 – localshred

+0

はい、AとBには異なるロジックを持つfetch()メソッドがあります。おそらく、AとBはSearchを拡張する必要はありませんが、オブジェクトを構築するのに必要なメンバーと同じメソッドを使用するので、Searchに拡張するのは当然です。 –

+0

あなたはそうです、この方法でSearchクラスを拡張するのは無意味です。検索オブジェクトを渡してプロパティにアクセスするだけです。これを回答に入れると、それを受け入れられた解決策としてマークすることができます。 –

答えて

2

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

ここでのアイデアは、明らかでない場合は、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 
    } 
}