Son zamanlarda insanların veri aktarım nesnelerinin (DTO'lar) bir anti-model olduğunu söylediklerine kulak misafiri oldum .
Neden? Alternatifler neler?
Son zamanlarda insanların veri aktarım nesnelerinin (DTO'lar) bir anti-model olduğunu söylediklerine kulak misafiri oldum .
Neden? Alternatifler neler?
Yanıtlar:
Bazı projelerde tüm veriler iki kez bulunur . Biri etki alanı nesneleri olarak ve bir kez de veri aktarım nesneleri olarak.
Bu çoğaltmanın çok büyük bir maliyeti var , bu yüzden mimarinin buna değer olması için bu ayrımdan büyük bir fayda sağlaması gerekiyor.
DTO'lar bir anti-model değildir. Kablodan bazı verileri gönderirken (örneğin, bir Ajax çağrısındaki bir web sayfasına), yalnızca hedefin kullanacağı verileri göndererek bant genişliğini koruduğunuzdan emin olmak istersiniz. Ayrıca, sunum katmanının verileri yerel bir iş nesnesinden biraz farklı bir formatta olması genellikle uygundur.
Bunun Java odaklı bir soru olduğunu biliyorum, ancak .NET dillerinde anonim türler, serileştirme ve LINQ, DTO'ların anında oluşturulmasına olanak tanıyor ve bu da onları kullanmanın kurulumunu ve ek yükünü azaltıyor.
EJB 3.0'daki bir AntiPattern DTO diyor ki:
EJB 3.0'dan önceki EJB spesifikasyonlarındaki Varlık Fasulyelerinin ağır yapısı, Veri Aktarım Nesneleri (DTO) gibi tasarım modellerinin kullanılmasıyla sonuçlandı. DTO'lar, verileri katmanlar arasında göndermek için kullanılan hafif nesneler (ilk etapta varlığın kendilerini çekmesi gerekirdi) haline geldi ... şimdi EJB 3.0 özelliği, Varlık çekirdek modelini Düz eski Java nesnesi (POJO) ile aynı yapıyor. Bu yeni POJO modeliyle, artık her varlık veya bir dizi varlık için bir DTO oluşturmanız gerekmeyecek ... EJB 3.0 varlıklarını katman boyunca göndermek istiyorsanız, onları yalnızca java.io'yu uygulayın.
DTO'ların kendiliğinden bir anti-model olduğunu düşünmüyorum, ancak DTO'ların kullanımıyla ilişkili anti-modeller var. Bill Dudney, DTO patlamasından örnek olarak:
http://www.softwaresummit.com/2003/speakers/DudneyJ2EEAntiPatterns.pdf
Ayrıca burada bahsedilen bir dizi DTO suistimali vardır:
http://anirudhvyas.com/root/2008/04/19/abuses-of-dto-pattern-in-java-world/
Katmanlar arasında veri aktarımı için bir araç olarak üç katmanlı sistem (tipik olarak teknoloji olarak EJB'yi kullanır) nedeniyle ortaya çıktılar. Spring gibi çerçevelere dayalı modern zamanların çoğu Java sistemi, POJO'ları tek bir katmanda etki alanı nesneleri olarak (genellikle JPA vb. İle açıklanır) kullanarak alternatif basitleştirilmiş bir görünüm alır ... Burada DTO'ların kullanılması gereksizdir.
OO sadeliği, DTO'nun anti-model olduğunu söyler çünkü nesneler gerçek etki alanı nesneleri yerine veri tablosu temsilleri haline gelir.
Bazıları, olası suistimalleri nedeniyle DTO'ları bir anti-model olarak görüyor. Genellikle gerekmemesi / gerekmemesi gerektiğinde kullanılırlar.
Bu makale bazı kötüye kullanımları belirsiz bir şekilde açıklamaktadır.
Dağıtılmış bir sistem kuruyorsanız, DTO'lar kesinlikle bir anti model değildir. Herkes bu anlamda gelişmeyecektir, ancak (örneğin) bir Open Social uygulamanız varsa, tümü JavaScript ile çalışıyor.
API'nize bir sürü veri gönderecektir. Bu daha sonra bir tür nesneye, tipik olarak bir DTO / Request nesnesine dönüştürülür. Bu, daha sonra bir model nesnesine dönüştürülmeden önce girilen verilerin doğru olduğundan emin olmak için doğrulanabilir.
Bana göre, yanlış kullanıldığı için bir anti-model olarak görülüyor. Dağıtılmış bir sistem kurmuyorsanız, büyük olasılıkla bunlara ihtiyacınız yoktur.
Bir Veri Aktarım Nesnesinin amacı, farklı kaynaklardan gelen verileri depolamak ve ardından bunları aynı anda bir veritabanına (veya Uzak Cephe ) aktarmaktır .
Bununla birlikte, DTO modeli sadece verileri depolamakla kalmayıp aynı zamanda veri tabanından / cepheye veya veritabanına / cepheye aktardığından , Tek Sorumluluk İlkesini ihlal eder .
Veri nesnelerini iş nesnelerinden ayırma ihtiyacı bir anti-model değildir, çünkü muhtemelen veritabanı katmanını yine de ayırmak gerekir .
DTO'lar yerine, nesnelerin koleksiyonunu ( Agrega ) ve veri transferini ( Depo ) ayıran Agrega ve Depo Modellerini kullanmalısınız .
Bir nesne grubunu aktarmak için , bir dizi Depo ve bir işlem bağlamını tutan İş Birimi modelini kullanabilirsiniz ; işlem içinde toplamdaki her nesneyi ayrı ayrı aktarmak için.
Tüm etki alanı nesneleriniz ilişkili nesneleri EAGERly yüklediğinizde DTO bir zorunluluk haline gelir ve bir ANTI-DESEN değil.
DTO'lar yapmazsanız, iş katmanınızdan istemci / web katmanınıza gereksiz nesneler aktarmış olursunuz.
Bu durumda ek yükü sınırlamak için DTO'ları transfer edin.
Soru "neden" değil, " ne zaman " olmalıdır " olmalıdır.
Kesin olarak, yalnızca kullanmanın sonucu daha yüksek maliyet olduğunda anti-modeldir çalışma zamanı veya bakım -. Veritabanı varlık sınıflarıyla özdeş yüzlerce DTO'ya sahip projeler üzerinde çalıştım. DTO'ya, varlığa, DTO'dan etki alanı sınıflarına veya varlıklarına dönüştürmeye, tersine dönüştürme gibi dört kez kimlik eklemek için reklam yaptığınız tek bir alanı her eklemek istediğinizde ... Bazı yerleri ve verileri unuttunuz tutarsız.
Bu var gerçekten etki sınıflarının farklı temsilini gerektiğinde anti-desen değil - daha düz, daha zengin, daha dar, ...
Şahsen ben alan sınıfıyla başlıyorum ve doğru yerlerde uygun şekilde kontrol ederek bunu başkasına veriyorum. Eşleme yapmak için, veritabanına, JSON veya XML gibi serileştirme formatlarına bazı "yardımcı" sınıflar ekleyebilir ve / veya ekleyebilirim ... Gerekirse bir sınıfı ikiye bölebilirim.
Bu sizin bakış açınızla ilgili - Bir etki alanı nesnesine, birbirinden oluşturulan birden çok nesne yerine, çeşitli roller oynayan tek bir nesne olarak bakmayı tercih ederim. Bir nesnenin sahip olduğu tek rol veri taşımaksa, o zaman DTO'dur.
Bence insanlar, tüm uzak nesneleri DTO'lar olarak uygularsanız bunun bir anti-model olabileceğini kastediyor. Bir DTO yalnızca bir nitelikler kümesidir ve büyük nesneleriniz varsa, ihtiyacınız olmasa veya kullanmasanız bile her zaman tüm özellikleri aktarırsınız. İkinci durumda, bir Proxy kalıbı kullanmayı tercih edin.