Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Active Record вопреки Data Mapper-а для сохранения данных

Anna | 31.05.2014 | нет комментариев

Эти 2 образца проектирования описаны в книге Мартина Фаулера «Образцы корпоративных приложений» и представляют собой методы работы с сохранением данных в объектно-ориентированном программировании.

Пример образца Active Record

 

class Foo
{
    protected $db;
    public $id;
    public $bar;

    public function __construct(PDO $db)
    {
        $this->db = $db;
    }

    public function do_something()
    {
        $this->bar .= uniqid();
    }

    public function save()
    {
        if ($this->id) {
            $sql = "UPDATE foo SET bar = :bar WHERE id = :id";
            $statement = $this->db->prepare($sql);
            $statement->bindParam("bar", $this->bar);
            $statement->bindParam("id", $this->id);
            $statement->execute();
        }
        else {
            $sql = "INSERT INTO foo (bar) VALUES (:bar)";
            $statement = $this->db->prepare($sql);
            $statement->bindParam("bar", $this->bar);
            $statement->execute();
            $this->id = $this->db->lastInsertId();
        }
    }
}

//Insert
$foo = new Foo($db);
$foo->bar = 'baz';
$foo->save();

В этом упрощенном примере, дескриптор базы данных вводится в конструкторе Foo (Применение инъекции зависимостей тут разрешает тестировать объект без применения реальной базы данных), и Foo использует его, Дабы сберегать свои данные. Do_something — легко способ-заглушка, заменяющий бизнес логику.

Превосходства Active Record

 

  • Писать код с Active Record получается стремительно и легко, в том случае, когда свойства объекта прямо соотносятся с колонками в базе данных.
  • Сохранение происходит в одном месте, что разрешает легко исследовать, как это работает.

 

Недочеты Active Record

 

  • Модели Active Record нарушаю тезисы SOLID. В частности, правило цельной ответственности (SRP — «S» в тезисах SOLID). Согласно тезису, доменный объект должен иметь только одну зону ответственности, то есть только свою бизнес-логику. Вызывая его для сохранения данных, вы добавляете ему дополнительную зону ответственности, увеличивая трудность объекта, что усложняет его поддержку и тестирование.
  • Реализации сохранения данных узко связана с бизнес-логикой, а это обозначает, что если вы позднее захотите применять иную абстракцию для сохранения данных (скажем для хранения данных в XML-файле, а не в базе данных), то вам придется делать рефакторинг кода.

 

Пример Data Mapper-а

 

class Foo
{
    public $id;
    public $bar;

    public function do_something()
    {
        $this->bar .= uniqid();
    }
}

class FooMapper
{
    protected $db;

    public function __construct(PDO $db)
    {
        $this->db = $db;
    }
    public function saveFoo(Foo &$foo)
    {
        if ($foo->id) {
            $sql = "UPDATE foo SET bar = :bar WHERE id = :id";
            $statement = $this->db->prepare($sql);
            $statement->bindParam("bar", $foo->bar);
            $statement->bindParam("id", $foo->id);
            $statement->execute();
        }
        else {
            $sql = "INSERT INTO foo (bar) VALUES (:bar)";
            $statement = $this->db->prepare($sql);
            $statement->bindParam("bar", $foo->bar);
            $statement->execute();
            $foo->id = $this->db->lastInsertId();
        }
    }
}

//Insert
$foo = new Foo();
$foo->bar = 'baz';
$mapper = new FooMapper($db);
$mapper->saveFoo($foo);

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

Превосходства Data Mapper-а

 

  • Всякий объект имеет свою зону ответственности, тем самым следую тезисам SOLID и сберегая всякий объект простым и по существу.
  • Бизнес-логика и сохранение данных связаны слабо, и если вы хотите сохра

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB