Что, в частности, делает DataMapper более гибким, чем ActiveRecord? - PullRequest
6 голосов
/ 17 февраля 2011

Я сравниваю Doctrine 2 и Propel 1.5 / 1.6 , и я смотрю на некоторые из моделей, которые они используют.Doctrine использует шаблон DataMapper, а Propel использует шаблон ActiveRecord.Хотя я вижу, что DataMapper значительно более сложен, я бы предположил, что некоторая гибкость дизайна обусловлена ​​этим усложнением.Пока что единственная законная причина, по которой я нашел использование DataMapper вместо ActiveRecord, заключается в том, что DataMapper лучше с точки зрения принципа единой ответственности - потому что строки базы данных - это не фактические сохраняемые объекты, а с Propel, который неВ любом случае, меня это беспокоит.

Так что же делает DataMapper более гибким?

Ответы [ 2 ]

4 голосов
/ 17 февраля 2011

Я работал как с новым Propel, так и с Doctrine2.Что делает DataMapper (и я имею в виду Doctrine2) восхитительным, так это то, что ваши доменные объекты чисты и просты, они не расширяют нерелевантные классы, которые добавляют много нерелевантных методов в ваши классы (как вы сказали, нарушая SRP).Это просто простые сущности с несколькими свойствами и несколькими методами, которые являются частью вашего бизнес-уровня.И это, конечно, позволяет вам писать модульные тесты для них и использовать их в будущем.

Я бы не сказал, что DataMapper значительно сложнее.Это сложно, если вы пишете свою собственную реализацию DataMapper, но Doctrine2 гораздо проще в использовании, чем propel (возможно, за исключением его настройки, мы делаем это только один раз).У него есть менеджер сущностей, который управляет любыми сущностями.У вас могут быть хранилища объектов для сложных запросов.И это все.

А сущность так же проста, как:

/**
 * Question
 *
 * @Entity
 */
class Question
{
    /**
     * @Column(type="string")
     */
    private $title;

    public function getTitle() { return $this->title; }
    public function setTitle($title) { $this->title = $title; }

}

В Propel у нас будет 6 классов для этой сущности, которые будут содержать много сгенерированного и часто неиспользуемого кода.

Что делает DataMapper более гибким?Простота, которую это обеспечивает.

2 голосов
/ 13 января 2015

ActiveRecord заставляет тип данных выполнять две вещи: собственную ответственность за сохранение данных в базе данных и собственную ответственность за хранение данных для общих расчетов. Это означает, что если вы хотите изменить хранилище данных, в котором данные будут сохранены в будущем, то к изменению подвергается код, который обычно не должен заботиться о поведении базы данных.

DataMapper полностью отделяет данную реализацию базы данных от набора рабочих объектов в памяти, что означает, что один и тот же внутренний рабочий тип данных может сохраняться в нескольких базах данных, без изменения кода, который в противном случае использует рабочий тип.

Например, с помощью шаблонов DataMapper, если завтра вы захотите добавить экспорт XML для своих данных, вы реализуете один новый преобразователь данных, «MyDataToXmlDataMapper» или аналогичный, который добавляет новый формат постоянства, и никакой другой код не должен изменяться. , При добавлении ActiveRecord такая функциональность требует изменения интерфейса рабочего типа данных.

...