Estoy tratando de repasar mis habilidades de diseño de patrones, y tengo curiosidad por saber cuáles son las diferencias entre estos patrones. Parece que todos son lo mismo: encapsulan la lógica de la base de datos para una entidad específica, de modo que el código de llamada no tiene conocimiento de la capa de persistencia subyacente. De mi breve investigación, todos ellos implementan típicamente sus métodos CRUD estándar y abstraen los detalles específicos de la base de datos.
Además de las convenciones de nomenclatura (por ejemplo, CustomerMapper vs. CustomerDAO vs. CustomerGateway vs. CustomerRepository), ¿cuál es la diferencia, si la hay? Si hay una diferencia, ¿cuándo elegirías una sobre la otra?
En el pasado, escribiría un código similar al siguiente (simplificado, naturalmente, normalmente no usaría propiedades públicas):
public class Customer
{
public long ID;
public string FirstName;
public string LastName;
public string CompanyName;
}
public interface ICustomerGateway
{
IList<Customer> GetAll();
Customer GetCustomerByID(long id);
bool AddNewCustomer(Customer customer);
bool UpdateCustomer(Customer customer);
bool DeleteCustomer(long id);
}
y tener una CustomerGateway
clase que implemente la lógica de base de datos específica para todos los métodos. A veces no usaría una interfaz y haría que todos los métodos en CustomerGateway fueran estáticos (lo sé, lo sé, eso lo hace menos verificable) para poder llamarlo así:
Customer cust = CustomerGateway.GetCustomerByID(42);
Este parece ser el mismo principio para los patrones de Data Mapper y Repository; El patrón DAO (que es lo mismo que Gateway, creo) también parece alentar las puertas de enlace específicas de la base de datos.
¿Me estoy perdiendo de algo? Parece un poco extraño tener 3-4 formas diferentes de hacer exactamente lo mismo.