2012-02-13 5 views
3

私はリポジトリの質問の原則を理解しようとしています。しかし、私は別の質問に遭遇しました。私にとっては、リポジトリパターンがオーバーヘッドの原因になるようです。リポジトリパターンとオーバーヘッド..?

例:

マイEntityクラスは次のようになります。

class newsEntity 
{ 
    private $title; 
    private $content; 
    private dateCreated; 
    private $author; 
    private $category; // just 1 category possible for simplicity 

    # .. Getter and Setter methods ... 
} 

リポジトリは、この(簡体字ofcourseの)

class newsRepository 
{ 
    public function getNewsByYear ($year) 
    { 
     $newsList = array(); 

     // Some ORM code which fills $newsList with newsEntity objects 
    } 
} 

のように見えるクライアントコードは次のようになりますこれは:

$repo = new newsRepository(); 
$news = $repo->getNewsByYear(2011); 

foreach ($news as $item) 
    echo $item->getTitle() . " " . $item->getDateCreated(); 

これは、2011年のタイトルと作成日から見つけることができるすべてのニュースアイテムのリストを単純に示しています。

今私が持っている問題は、私はEntityオブジェクトの$ titleと$ dateCreatedプロパティのみを使用していることです。しかし、他のすべてのプロパティもいっぱいですが、私はそれらを使用することはありません!これは、getNewsByYearが3000レコードを取得した場合、決して使用されないオブジェクトのプロパティの多くを埋め込むことを意味します...それは大きな問題ではありません...?このコースは、その集約がさらに悪化する...

私は確信していないもう一つのことです;私のリポジトリはいつもEntityオブジェクトを返す必要がありますか?または、タイトルや何かを表示する必要があるときに文字列を返すこともできますか????

答えて

1

単純なクエリのためにプリミティブを返すリポジトリやDTOを取り除くのに問題があるとは思わない。リポジトリ内では、ORMを使用して必要なフィールドだけをロードすることができます。オブジェクト全体をプリロードする必要はありません。

class newsOverviewDto 
{ 
    private $title; 
    private $dateCreated; 

    // + Getters/Setters 
} 

class newsRepository 
{ 
    public function getNewsByYearForOverview ($year) 
    { 
     $newsList = array(); 
     // Some ORM code which fills $newsList with 
     // DTOs that contain title and date 
    } 
} 

// Usage: 

$repo = new newsRepository(); 
$newsOverviewDtos = $repo->getNewsByYearForOverview(2011); 

foreach ($newsOverviewDtos as $item) 
    echo $item->getTitle() . " " . $item->getDateCreated(); 
0

DTOData Transfer Object)を使用することができます。これは、クエリに必要なメンバーだけを持つオブジェクトのカットダウンバージョンです。

たとえば、Entityをすべてのメンバーに使用する代わりに、EntitySummaryにはdateCreatedのみを使用します。もちろん、元のオブジェクトの代わりにこのDTOを使用するように、インタフェースとサービスレイヤーを変更する必要があります。

関連する問題