Eşleme türleri ve uzantı yöntemlerini C # kullanarak en iyi uygulamalar hakkında bazı sorular sormak istiyorum. Bu konunun son birkaç yılda birçok kez tartışıldığını biliyorum, ancak birçok gönderi okudum ve hala şüphelerim var.
Karşılaştığım sorun "convert" işlevselliği ile sahip olduğum sınıf genişletme oldu. Diyelim ki bazı mantık tarafından kullanılacak bir nesneyi temsil eden "Kişi" sınıfım var. Ayrıca harici API bir yanıtı temsil eden bir sınıf "Müşteri" var (aslında birden fazla API olacak, bu yüzden ortak tip: Person her yanıtın eşlemek gerekir). Her iki sınıfın kaynak koduna erişimim var ve teorik olarak kendi yöntemlerimi uygulayabilirim. Veritabanına kaydedebilmem için Müşteriyi Kişiye dönüştürmem gerekiyor. Proje otomatik haritacı kullanmıyor.
Aklımda 4 olası çözüm var:
Tüketici sınıfında .ToPerson () yöntemi. Bu basit, ancak Tek Sorumluluk modelini kırmak gibi görünüyor, özellikle de Tüketici sınıfı diğer sınıflarla (bazıları başka bir harici API için gerekli) eşlendiğinden, birden fazla eşleme yöntemi içermesi gerekiyor.
Kişi sınıfında Tüketici'yi argüman olarak alan haritalama kurucusu. Ayrıca kolay ve aynı zamanda Tek Sorumluluk modelini kırmak gibi görünüyor. Birden fazla eşleme yapıcısına ihtiyacım olacak (çünkü başka bir API'dan gelen sınıf, Tüketici ile aynı verileri sağlayan ancak biraz farklı bir formatta olacak)
Genişletme yöntemleri ile konvertörler sınıfı. Bu şekilde Tüketici sınıfı için .ToPerson () yöntemi yazabilirim ve kendi NewConsumer sınıfıyla başka bir API tanıtıldığında, sadece başka bir uzantı yöntemi yazabilir ve hepsini aynı dosyada tutabilirim. Uzatma yöntemlerinin genel olarak kötü olduğu ve sadece kesinlikle gerekli olması durumunda kullanılması gerektiğine dair bir görüş duydum, bu yüzden beni geride tutan şey bu. Aksi takdirde bu çözümü beğendim
Dönüştürücü / Eşleyici sınıfı. Dönüşümleri işleyecek ve kaynak sınıf örneğini bağımsız değişken olarak alacak ve hedef sınıf örneği döndürecek yöntemleri uygulayacak ayrı bir sınıf oluşturuyorum.
Özetlemek gerekirse, sorunum soru sayısına indirilebilir (hepsi yukarıda açıkladığım bağlamda):
Dönüştürme yöntemini (POCO?) Nesnesinin (Tüketici sınıfındaki .ToPerson () yöntemi gibi) içine koymak tek sorumluluk kalıbını kırıyor mu?
(DTO benzeri) sınıfta dönüştürücü kurucuları kullanmanın tek sorumluluk modelini kırdığı düşünülüyor mu? Özellikle bu sınıf birden çok kaynak türünden dönüştürülebiliyorsa, çok sayıda dönüştürücü kurucu gerekli olur mu?
Orijinal sınıf kaynak koduna erişirken genişletme yöntemlerini kullanmak kötü bir uygulama mıdır? Böyle bir davranış, mantığı ayırmak için uygulanabilir bir kalıp olarak kullanılabilir mi yoksa bir anti-kalıp mıdır?
Person
sınıf DTO? herhangi bir davranış içeriyor mu?