ActiveRecord
| ActiveRecord | |
|---|---|
| Active record | |
| Описан в Design Patterns | Нет |
Active record (AR) — шаблон проектирования приложений, описанный Мартином Фаулером в книге Patterns of Enterprise Application Architecture («Шаблоны архитектуры корпоративных приложений»). AR является популярным способом доступа к данным реляционных баз данных в объектно-ориентированном программировании.
Схема 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.
См. также
Примечания
- ↑ 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.» Дата обращения: 31 июля 2017. Архивировано 29 августа 2017 года.
- ↑ Протько Сергей(fesor). AR по определению его нарушает и создан чтобы его нарушать. // https://habrahabr.ru/.+Архивировано 31 июля 2017 года.
- ↑ Пример использования Active Record во фреймворке Yii Архивная копия от 10 февраля 2010 на Wayback Machine Архивировано 10 февраля 2010 года.
Ссылки
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.