ActiveRecord

Active record (AR) — шаблон проектирования приложений, описанный Мартином Фаулером в книге Patterns of Enterprise Application Architecture («Шаблоны архитектуры корпоративных приложений»). AR является популярным способом доступа к данным реляционных баз данных в объектно-ориентированном программировании.

ActiveRecord
Active record
Описан в Design Patterns Нет

Схема Active Record — это подход к доступу к данным в базе данных. Таблица базы данных или представление обёрнуты в классы. Таким образом, объектный экземпляр привязан к единственной строке в таблице. После создания объекта новая строка будет добавляться к таблице на сохранение. Любой загруженный объект получает свою информацию от базы данных. Когда объект обновлён, соответствующая строка в таблице также будет обновлена. Класс обёртки реализует методы средства доступа или свойства для каждого столбца в таблице или представлении.

Этот образец обычно используется объектными инструментами персистентности и в объектно-реляционном отображении (ORM). Как правило, отношения внешнего ключа будут представлены как объектный экземпляр надлежащего типа через свойство.

Реализации данного шаблона часто нарушают принцип единственной ответственности (SRP), совмещая в одном объекте как представление и внутреннюю логику самого объекта, так и механизмы CRUD, поэтому Active Record может считаться антипаттерном[1]. В других случаях это утверждение спорно, так как сам по себе объект, реализующий ActiveRecord, не содержащий никакой бизнес-логики, а предоставляющий таблицу из базы данных, имеет лишь одну причину для изменения (изменение таблицы), что не противоречит определением принципа SRP[2].

Общий принцип работы Active Record

Пусть существует таблица в базе данных. Для данной таблицы создаётся специальный класс AR, являющийся отражением (представлением) таблицы, таким образом, что:

  • каждый экземпляр данного класса соответствует одной записи таблицы;
  • при создании нового экземпляра класса (и заполнении соответствующих полей) в таблицу добавляется новая запись;
  • при чтении полей объекта считываются соответствующие значения записи таблицы баз данных;
  • при изменении (удалении) какого-либо объекта изменяется (удаляется) соответствующая ему запись.

Реализация

Реализация концепции AR существует во многих средах разработки для различных языков программирования. Например, если в базе данных есть таблица parts с полями name (string type) и price (number type), и шаблон Active Record реализован в классе Part, то следующий псевдокод:

part = new Part()
part.name = "Sample part"
part.price = 123.45
part.save()

создаст новую запись в таблице parts с данными значениями, и будет примерно соответствовать SQL команде

INSERT INTO parts (name, price) VALUES ('Sample part', 123.45);

С другой стороны, класс может быть использован для запросов к базе данных:

b = Part.find_first("name", "gearbox")

Этот код создаст новый экземпляр класса Part, основанный на данных первой найденной записи в таблице parts у которой поле name равно «gearbox».

Команда SQL может быть подобна одной из показанных ниже, в зависимости от реализации SQL в конкретной базе данных:

SELECT * FROM parts WHERE name = 'gearbox' LIMIT 1; -- MySQL or PostgreSQL

или

SELECT * FROM parts WHERE name = 'gearbox' and rownum < 2; -- Oracle

или

SELECT TOP 1 * FROM parts WHERE name = 'gearbox'; -- Microsoft SQL Server

Примеры реализации: Yii[3] и Kohana для PHP. Следует отметить фреймворк CodeIgniter, который имеет встроенный класс ActiveRecord, являющийся конструктором запросов к базе данных, но не являющийся примером реализации шаблона Active Record.

См. также

Примечания

  1. Pablo's SOLID Software Development 8. — «A good anti-example is the Active Record pattern. This pattern is in contradiction of SRP. A domain entity handles persistence of its information. (Note: There is nothing wrong with using Active Record; I've recently used it on a quick demo site and it worked perfectly) Normally, you would have a controller method/action pass a "hydrated" entity to a method of a repository instance.».
  2. Протько Сергей(fesor). AR по определению его нарушает и создан чтобы его нарушать. // https://habrahabr.ru/.
  3. Пример использования Active Record во фреймворке Yii Архивная копия от 10 февраля 2010 на Wayback Machine Архивировано 10 февраля 2010 года.

Ссылки

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.