Tasarım kalıbı becerilerimi tazelemeye çalışıyorum ve bu kalıplar arasındaki farkların ne olduğunu merak ediyorum. Hepsi aynı şey gibi görünüyor - belirli bir varlık için veritabanı mantığını kapsülleyin, böylece çağıran kodun temeldeki kalıcılık katmanı hakkında bilgisi olmaz. Kısa araştırmamdan, hepsi tipik olarak standart CRUD yöntemlerinizi uygular ve veritabanına özgü ayrıntıları soyutlar.
Adlandırma kurallarından ayrı olarak (örn. CustomerMapper, CustomerDAO, CustomerGateway, CustomerRepository), eğer varsa, fark nedir? Bir fark varsa, birini diğerine ne zaman seçerdiniz?
Geçmişte aşağıdakine benzer bir kod yazardım (basitleştirilmiş, doğal olarak - normalde genel mülkleri kullanmazdım):
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);
}
ve CustomerGateway
tüm yöntemler için belirli veritabanı mantığını uygulayan bir sınıfa sahip olun. Bazen bir arabirim kullanmaz ve CustomerGateway'deki tüm yöntemleri statik hale getiririm (biliyorum, biliyorum, bu onu daha az test edilebilir kılar), böylece şöyle diyebilirim:
Customer cust = CustomerGateway.GetCustomerByID(42);
Bu, Veri Eşleştiricisi ve Depo modelleri için aynı ilke gibi görünmektedir; DAO kalıbı (ki sanırım Ağ Geçidi ile aynı şey mi?) veritabanına özgü ağ geçitlerini teşvik ediyor gibi görünüyor.
Bir şey mi kaçırıyorum? Aynı şeyi yapmanın 3-4 farklı yoluna sahip olmak biraz garip görünüyor.