Bienvenidos sean a este post, hoy veremos brevemente uno de los patrones mencionados en el post anterior.
Martin Fowler describe al patron repositorio de la siguiente manera:
Este media entre el dominio y la capa de mapeo de datos usando una interface similar a una coleccion para acceder a los objetos de dominio.
Martin Fowler
Este patron proporciona metodos sencillos para manipular los datos sin la necesidad de trabajar con el driver de la base de datos directamente. Las acciones de actualizar, agregar, remover o seleccionar datos encajan naturalmente con el dominio de la aplicacion. Un enfoque sugerido es crear una clase de repositorio generico, encargada de proveer las funciones necesarias. Una interface simple puede ser como la siguiente:
class Entidad;
template <typename T, typename = std::enable_if_t<std::is_base_of_v<Entidad, T>>>
class Repositorio
{
public:
T get_por_id(int);
void insertar(const T&);
void modificar(const T&);
void remover(const T&);
std::vector<T> get_todo(std::function<bool(T)> condicion);
};
Primero declaramos una nueva clase base llamada Entidad. La clase generica sera llamada Repositorio y este trabaja solo con entidades de la clase anterior. Para ello, usaremos dos metodos como enable_if y is_base_of_v para verificar que efectivamente el dato pasado sea de tipo Entidad. Veamos una implementacion simple de la clase Entidad:
class Entidad
{
public:
int get_id() const;
void set_id(int);
private:
int id_;
};
Tenemos una propiedad privada donde almacenaremos el id de identificacion del usuario. En la parte publica tenemos los metodos getter y setter para el id. Veamos como debemos implemetarla:
class Usuario : public Entidad
{
// codigo omitido por brevedad
};
Para ello simplemente debemos hacer a las clases que sean herederas de esta nueva clase base. Como pueden ver en el codigo anterior para la clase Usuario y el resto del codigo sigue siendo el mismo. Con nuestras clases herederas de esta nueva clase base, veamos como las aplicamos al patron de repositorio:
Repositorio<Usuario> repo_usr;
User usr_obtenido = repo_usr.get_por_id(111);
Observen como pasamos la clase Usuario a Repositorio, este al ser heredero de Entidad cumplira las condiciones que necesitamos para poder utilizarla y luego tenemos acceso al metodo get_por_id para poder trabajar con este. Esto es una implementacion basica que se puede mejorar pero nos servira como introduccion al concepto. Sin embargo, esto puede ser mucho mas poderoso y util porque permite reensamblar al patron de fachada. El punto de usar al patron de fachada es no acceder a la base de datos porque este envuelve a una clase compleja o clases, proveyendo al cliente con una simple interface predefinida para trabajar con la funcionalidad subyacente.
En resumen, hoy hemos visto al patron de repositorio, que es, para que sirve, como lo podemos implementar y que facilidades nos habilita. Espero les haya resultado de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
