Saya baru-baru ini mendengar orang mengatakan bahwa objek transfer data (DTO) adalah anti-pola .
Mengapa? Apa saja alternatifnya?
Saya baru-baru ini mendengar orang mengatakan bahwa objek transfer data (DTO) adalah anti-pola .
Mengapa? Apa saja alternatifnya?
Jawaban:
Beberapa proyek memiliki semua data dua kali . Sekali sebagai objek domain, dan sekali sebagai objek transfer data.
Duplikasi ini memiliki biaya besar , sehingga arsitektur perlu mendapatkan manfaat besar dari pemisahan ini agar sepadan.
DTO bukan merupakan anti-pola. Saat Anda mengirim beberapa data melalui kabel (katakanlah, ke halaman web dalam panggilan Ajax), Anda ingin memastikan bahwa Anda menghemat bandwidth dengan hanya mengirim data yang tujuan akan gunakan. Juga, sering kali nyaman bagi lapisan presentasi untuk memiliki data dalam format yang sedikit berbeda dari objek bisnis asli.
Saya tahu ini adalah pertanyaan berorientasi Java, tetapi dalam bahasa .NET jenis anonim, serialisasi, dan LINQ memungkinkan DTO dibuat secara langsung, yang mengurangi pengaturan dan overhead penggunaannya.
DTO an AntiPattern di EJB 3.0 mengatakan:
Sifat berat Entity Beans dalam spesifikasi EJB sebelum EJB 3.0, menghasilkan penggunaan pola desain seperti Data Transfer Objects (DTO). DTO menjadi objek ringan (yang seharusnya menjadi entitas entitas sendiri di tempat pertama), yang digunakan untuk mengirim data melintasi tingkatan ... sekarang spesifikasi EJB 3.0 membuat model kacang Entitas sama dengan objek Java kuno (POJO). Dengan model POJO baru ini, Anda tidak perlu lagi membuat DTO untuk setiap entitas atau untuk sekumpulan entitas ... Jika Anda ingin mengirim entitas EJB 3.0 di tier, buat mereka hanya mengimplementasikan java.io.Serialiazable
Saya tidak berpikir DTO adalah anti-pola per se, tetapi ada antipattern yang terkait dengan penggunaan DTO. Bill Dudney menyebut ledakan DTO sebagai contoh:
http://www.softwaresummit.com/2003/speakers/DudneyJ2EEAntiPatterns.pdf
Ada juga sejumlah penyalahgunaan DTO yang disebutkan di sini:
http://anirudhvyas.com/root/2008/04/19/abuses-of-dto-pattern-in-java-world/
Mereka berasal karena tiga sistem tingkat (biasanya menggunakan EJB sebagai teknologi) sebagai sarana untuk mengirimkan data antar tingkatan. Sebagian besar sistem Java modern berdasarkan kerangka kerja seperti Spring mengambil tampilan alternatif yang disederhanakan menggunakan POJO sebagai objek domain (sering dijelaskan dengan JPA dll ...) dalam satu tingkat ... Penggunaan DTO di sini tidak perlu.
OO purists akan mengatakan bahwa DTO adalah anti-pola karena objek menjadi representasi tabel data, bukan objek domain nyata.
Beberapa menganggap DTO sebagai anti-pola karena kemungkinan penyalahgunaannya. Mereka sering digunakan ketika mereka seharusnya / tidak perlu.
Artikel ini secara samar-samar menjelaskan beberapa pelanggaran.
Jika Anda sedang membangun sistem terdistribusi, maka DTO tentu bukan pola anti. Tidak semua orang akan berkembang dalam pengertian itu, tetapi jika Anda memiliki (misalnya) aplikasi Sosial Buka semua yang menjalankan JavaScript.
Ini akan mengirim banyak data ke API Anda. Ini kemudian dideserialisasikan ke dalam beberapa bentuk objek, biasanya objek DTO / Permintaan. Ini kemudian dapat divalidasi untuk memastikan data yang dimasukkan benar sebelum dikonversi menjadi objek model.
Menurut pendapat saya, ini dianggap sebagai anti-pola karena salah digunakan. Jika Anda tidak membangun sistem terdistribusi, kemungkinan Anda tidak membutuhkannya.
Tujuan dari Obyek Transfer Data adalah untuk menyimpan data dari sumber yang berbeda dan kemudian mentransfernya ke dalam basis data (atau Remote Facade ) sekaligus.
Namun, pola DTO melanggar Prinsip Tanggung Jawab Tunggal , karena DTO tidak hanya menyimpan data, tetapi juga mentransfernya dari atau ke basis data / fasad.
Kebutuhan untuk memisahkan objek data dari objek bisnis bukan antipattern, karena mungkin diperlukan untuk memisahkan lapisan database .
Alih-alih DTO Anda harus menggunakan Pola Agregat dan Repositori, yang memisahkan kumpulan objek ( Agregat ) dan transfer data ( Repositori ).
Untuk mentransfer sekelompok objek, Anda dapat menggunakan pola Unit Kerja , yang menampung satu set Repositori dan konteks transaksi; untuk mentransfer setiap objek dalam agregat secara terpisah dalam transaksi.
DTO menjadi suatu keharusan dan bukan POLA ANTI ketika Anda memiliki semua objek domain Anda memuat objek yang terkait dengan EAGERly.
Jika Anda tidak membuat DTO, Anda akan memiliki objek yang ditransfer tidak perlu dari lapisan bisnis Anda ke klien / lapisan web Anda.
Untuk membatasi overhead untuk kasus ini, alih-alih transfer DTO.
Pertanyaannya seharusnya bukan "mengapa", tetapi " kapan ".
Jelas itu anti-pola ketika hanya hasil menggunakannya lebih mahal - run-time atau pemeliharaan. Saya bekerja pada proyek yang memiliki ratusan DTO identik dengan kelas entitas basis data. Setiap kali Anda ingin menambahkan satu bidang yang Anda iklan tambahkan id seperti empat kali - ke DTO, ke entitas, ke konversi dari DTO ke kelas domain atau entitas, konversi terbalik, ... Anda lupa beberapa tempat dan data yang didapat tidak konsisten.
Ini bukan anti-pola ketika Anda benar-benar membutuhkan representasi kelas domain yang berbeda - lebih datar, lebih kaya, lebih sempit, ...
Secara pribadi saya mulai dengan kelas domain dan menyebarkannya, dengan pemeriksaan yang tepat di tempat yang tepat. Saya dapat membuat anotasi dan / atau menambahkan beberapa kelas "pembantu" untuk membuat pemetaan, ke database, ke format serialisasi seperti JSON atau XML ... Saya selalu dapat membagi kelas menjadi dua jika saya merasa perlu.
Ini tentang sudut pandang Anda - Saya lebih suka melihat objek domain sebagai objek tunggal yang memainkan berbagai peran, daripada beberapa objek yang dibuat dari satu sama lain. Jika satu-satunya peran objek adalah mengangkut data, maka itu DTO.
Saya pikir orang-orang berarti itu bisa menjadi anti-pola jika Anda menerapkan semua objek jarak jauh sebagai DTO. DTO hanyalah sekedar sekumpulan atribut dan jika Anda memiliki objek besar, Anda akan selalu mentransfer semua atribut bahkan jika Anda tidak membutuhkan atau menggunakannya. Dalam kasus terakhir lebih suka menggunakan pola Proxy.