V počítačové vědě je Active Record architektonický návrhový vzor pro práci s datovými zdroji, který v roce 2002 publikoval Martin Fowler ve své knize Patterns of Enterprise Application Architecture: „Objekt, který obsahuje řádek v databázové tabulce nebo pohledu, zapouzdřuje přístup k databázi, a přidává doménovou logiku.“
Implementace tohoto vzoru je obvykle objekt, který nese jak chování, tak data, přičemž mnoho těchto dat má perzistentní podobu a potřebuje být uloženo v databázi. Většinou je to třída odvozená od bázové třídy, která implementuje potřebné rozhraní pro persistenci objektu – typicky CRUD metody (vytvoření, čtení, aktualizace a odstranění). Relační data jsou obstojně reprezentována jako objektově-orientovaný kód, kde databázové tabulky odpovídají třídám, řádky tabulek objektům (instancím tříd) a nakonec jednotlivá pole řádků atributům objektu.
Základem návrhového vzoru Active Record je doménový model, kde třídy odpovídají tabulkám v databázi. Každý objekt Active Record je pak zodpovědný za ukládání dat do a načítání dat z databáze, stejně jako za dodržování doménové logiky aplikované na samotná data.
Třída implementující vzor Active Record typicky umožňuje:
- vytvoření objektu podle vráceného výsledku volání SQL dotazu
- vytvoření nového objektu pro pozdější vložení dat do tabulky
- statické metody zahrnující často používané SQL dotazy, které vracejí objekty Active Record
- vložení a aktualizaci dat z objektu do databáze
- získání a nastavení jednotlivých polí
- implementaci některých částí aplikační logiky
Active Record se využívá v případech, kdy doménová logika není příliš složitá, tedy obvykle pro základní CRUD operace. Odvozování a validace založené na jediném záznamu také fungují dobře. Jeho silná stránka je jednoduchost a snadné pochopení - kód je do jisté míry sebevysvětlující. Uvažujme například databázovou tabulku Persons
se sloupci name
(řetězec), surname
(řetězec) a age
(číslo) a třídu Person
, která implementuje návrhový vzor Active Record.
person = new Person();
person.name = 'John';
person.surname = 'Doe';
person.age = 37;
person.save();
Uvedený pseudokód, převedením na příkaz jazyka SQL, vloží do tabulky nový záznam.
Třída Person
může sloužit také k dotazování databáze:
john = Person.find('surname', 'Doe');
Slabou stránkou je, že pracuje dobře, pokud třídy Active Record přímo korespondují s databázovými tabulkami. Vlastnosti jako dědičnost se velmi obtížně mapují do objektů Active Record. V takovém případě je na místě zvážit využití jiného vzoru, například Data Mapper.
Další nevýhodou je fakt, že návrh objektů Active Record je velmi úzce spřažen s návrhem databáze. To znesnadňuje změnu jednoho i druhého schématu, nebo vyvolá nutné změny na obou stranách.[1]
Navíc porušuje některá pravidla dobrého objektového návrhu jako je zapouzdření (třídy Active Record vystavují kromě metod i své atributy), princip jediné odpovědnosti (implementuje doménovou logiku i logiku perzistence).[2]
Implementace
S implementací návrhového vzoru Active Record se můžeme setkat u mnoha programovacích jazyků.
Patrně nejznámější je knihovna Active Record pro jazyk Ruby, kterou nalezneme ve frameworku Rails (Ruby on Rails). Ta není založena čistě na objektovém modelu, ale na principu obalování databázových záznamů. Knihovna spoléhá na koncept „konvence před konfigurací“, proto se předpokládá, že názvy databázových tabulek jsou v množném čísle dle angličtiny (např. people) a doménové třídy poté v jednotném čísle (např. Person). Doménové třídy odvozené od třídy ActiveRecord::Base
. Výchozím bodem je tedy relační schéma, na jehož základě je automaticky, za pomoci reflexe a metaprogramování, vytvořena struktura odvozených tříd. Oproti základnímu vzoru přidává knihovna další funkcionalitu, jako je dědičnost, podpora validace a ošetření konzistence dat nebo podpora asociací mezi objekty tak, že každý objekt obsahuje také reference na ostatní spřízněné objekty, a další.
Implementace pro jazyk .NET se nazývá Castle ActiveRecord. Je postavena nad ORM frameworkem NHibernate, jehož chování zcela neodstiňuje, v mnoha ohledech práci s NHibernate však zjednodušuje.
Pro jazyk PHP existuje několik knihoven založených na návrhovém vzoru Active Record. Ty lze nalézt jako standardní součást PHP frameworků (například Yii, Zend Framework), nebo jako samostatnou knihovnu, integrovatelnou do jiné PHP aplikace.
Reference
Externí odkazy
Související články