Próbuję odświeżyć swoje umiejętności projektowania wzorców i jestem ciekawy, jakie są różnice między tymi wzorami? Wszystkie wydają się być tym samym - hermetyzują logikę bazy danych dla określonej jednostki, aby kod wywołujący nie miał wiedzy o podstawowej warstwie trwałości. Z moich krótkich badań wynika, że wszystkie z nich zazwyczaj wdrażają standardowe metody CRUD i usuwają szczegóły specyficzne dla bazy danych.
Oprócz konwencji nazewnictwa (np. CustomerMapper, CustomerDAO, CustomerGateway, CustomerRepository), jaka jest różnica? Jeśli jest różnica, kiedy wybrałbyś jedną z nich?
W przeszłości pisałbym kod podobny do poniższego (oczywiście uproszczony - normalnie nie używałbym właściwości publicznych):
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);
}
i mieć CustomerGateway
klasę, która implementuje określoną logikę bazy danych dla wszystkich metod. Czasami nie używałbym interfejsu i uczyniłbym wszystkie metody na CustomerGateway statycznymi (wiem, wiem, to sprawia, że jest mniej testowalny), więc mogę to nazwać tak:
Customer cust = CustomerGateway.GetCustomerByID(42);
Wydaje się, że jest to ta sama zasada dla wzorców mapowania danych i repozytorium; wzorzec DAO (który jest tym samym co Gateway, jak sądzę?) również wydaje się zachęcać do tworzenia bram specyficznych dla bazy danych.
Czy coś mi brakuje? To wydaje się trochę dziwne, mieć 3-4 różne sposoby robienia dokładnie tego samego.