шаблон хранилища и накладные расходы ..? - PullRequest
3 голосов
/ 13 февраля 2012

Я пытаюсь понять принципы вопроса о хранилище. Но я наткнулся на другой вопрос. Мне кажется, что шаблон хранилища вызывает много накладных расходов.

Пример:

Мой класс сущностей выглядит так:

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
    }
}

Код клиента выглядит примерно так:

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

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

Это просто показывает список всех новостных элементов, которые он может найти с 2011 года, с названием и датой создания.

Теперь у меня проблема в том, что я использую только свойства $ title и $ dateCreated объекта Entity. Но все остальные свойства заполнены, но я никогда не использую их! Это означает, что если getNewsByYear извлекает 3000 записей, он также заполняет множество свойств объекта, который никогда не используется ... Разве это не должно быть большой проблемой ...? Этот курс становится еще хуже, когда его совокупность ...

Другая вещь, в которой я не уверен, это; Должен ли мой репозиторий ВСЕГДА возвращать объект Entity? Или он также может возвращать только строку, когда мне просто нужно отобразить заголовок или что-то в этом роде .. ???

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

Я не думаю, что есть проблема с вашим репозиторием, возвращающим только примитивы или урезанные 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 голосов
/ 13 февраля 2012

Вы можете использовать временную DTO ( Объект передачи данных ). Это урезанная версия вашего объекта, в которой есть только те элементы, которые необходимы для вашего запроса (запросов).

Например, вместо Entity со всеми его членами, вы используете EntitySummary, который имеет только и dateCreated. Конечно, это означает, что вам придется изменить свои интерфейсы и уровень обслуживания, чтобы использовать этот DTO вместо исходного объекта.

...