Я намагаюся підкреслити свої навички дизайнерського шаблону, і мені цікаво, чим відрізняються ці зразки? Всі вони здаються, що вони однакові - інкапсулюйте логіку бази даних для певного об'єкта, щоб викличний код не знав про базовий рівень стійкості. З мого короткого дослідження, вони, як правило, реалізують ваші стандартні методи CRUD та відволікають деталі, характерні для бази даних.
Крім умовних назв (наприклад, CustomerMapper vs. CustomerDAO проти CustomerGateway проти CustomerRepository), яка різниця, якщо така є? Якщо є різниця, коли б ви вибрали одне над іншим?
Раніше я писав би код, подібний до наступного (спрощено, природно - я зазвичай не використовую загальнодоступні властивості):
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);
}
і мають CustomerGateway
клас, який реалізує певну логіку бази даних для всіх методів. Іноді я б не використовував інтерфейс і робив усі методи на CustomerGateway статичними (я знаю, я знаю, це робить його менш перевіреним), тому я можу назвати це так:
Customer cust = CustomerGateway.GetCustomerByID(42);
Це здається тим самим принципом для шаблонів Map Mapper і Repository; Шаблон DAO (який, це те саме, що і шлюз, я думаю?) також, здається, заохочує шлюзи, характерні для бази даних.
Я щось пропускаю? Мабуть, дивним є 3-4 різних способи зробити одну і ту ж річ.