Active record
En Ingeniería de software, active record es un patrón de arquitectura (actualmente considerado como un antipatrón de diseño)[1][2][3][4] encontrado en aplicaciones que almacenan sus datos en Bases de datos relacionales. Fue llamado así por Martin Fowler en su libro Patterns of Enterprise Application Architecture.[5] La interfaz de un cierto objeto debe incluir funciones como por ejemplo insertar (INSERT), actualizar (UPDATE), eliminar (DELETE) y propiedades que correspondan de cierta manera directamente a las columnas de la base de datos asociada.
Active record es un enfoque para acceso de datos en una base de datos. Una tabla de la base de datos o vista (view) está envuelta en una clase. Por lo tanto, una instancia de un objeto está ligada a un único registro (tupla) en la tabla. Después de crear y grabar un objeto, un nuevo registro es adicionado a la tabla. Cualquier objeto cargado obtiene su información a partir de la base de datos. Cuando un objeto es actualizado, un registro correspondiente en la tabla también es actualizado. Una clase de envoltura implementa los métodos de acceso (setter e getter) o propiedades para cada columna en la tabla o vista.
Este patrón suele ser utilizado por herramientas de persistencia de objetos en el mapeo objeto-relacional. Generalmente las relaciones de llave foránea serán expuestas como una instancia de objeto de tipo apropiado por medio de una propiedad.
Implementación
editarSu implementación puede ser encontrada en varios frameworks para diversos ambientes de programación.
Por ejemplo, si una base de datos
posee una tabla productos
con las columnas nombre
(tipo String) y valor
(tipo Number) y un patrón de proyecto Active Record es implementado en la clase Producto
, el pseudo-código:
producto = new Producto() producto.nombre = "Producto ejemplo" producto.valor = 123.45 producto.guardar()
Creará un nuevo registro en la tabla productos
con los valores proporcionados lo cual vendría siendo equivalente al comando SQL:
INSERT INTO productos (nombre, valor) VALUES ('Producto ejemplo', 123.45);
De la misma forma, una clase puede ser usada para consultar una BD:
b = Producto.find_first("nombre", "televisor")
Este código creará un nuevo objeto de tipo Producto
basado en el primer registro encontrado de la tabla productos
donde la columna nombre
contiene un valor "televisor". El comando SQL equivalente puede ser similar al siguiente (dependiendo de los detalles de la implementación SQL de la base de datos):
SELECT * FROM productos WHERE nombre = 'televisor' LIMIT 1; -- MySQL o PostgreSQL
Pruebas de software
editarDebido al acople entre la base de datos y la lógica de la aplicación cuando se usa el patrón Active Record, las pruebas unitarias sin una base de datos son difíciles de realizar. Los efectos negativos al realizarle pruebas pueden disminuirse usando objetos simulados o frameworks de inyección de dependencias para sustituir los datos reales con los simulados.
Referencias
editar- ↑ Antipattern: The Model Is an Active Record
- ↑ ORM anti-patterns - Part 1: Active Record
- ↑ The problem with Active Record
- ↑ Does the ActiveRecord pattern follow/encourage the SOLID design principles?
- ↑ Fowler, Martin (2003). Patterns of enterprise application architecture. Addison-Wesley. ISBN 978-0-321-12742-6.
Enlaces externos
editar- Implementación en Java (en inglés)
- Implementación en .NET (en inglés)
- Implementación en Ruby (en inglés)
- Página del Proyecto AIR Active Record (en inglés)