2012-02-13 3 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 ... 
} 

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

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

클라이언트 코드가 같은 형태 this :

$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

임시 DTO (Data Transfer Object)을 사용할 수 있습니다. 이것은 쿼리에 필요한 멤버 만있는 객체의 축소 버전입니다.

예를 들어, Entity을 모든 구성원과 함께 사용하는 대신 EntitySummary에만 dateCreated을 사용합니다. 물론 원래의 객체 대신이 DTO를 사용하려면 인터페이스와 서비스 계층을 변경해야합니다.