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 editar

Su 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 editar

Debido 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

Enlaces externos editar