Saya sedang mengerjakan aplikasi RCP, saya baru di aplikasi ini.
Spring bean digunakan untuk menulis logika bisnis untuk menyelamatkan / mengambil entitas.
Namun, alih-alih mengirim entitas langsung ke klien, kami mengonversi ke DTO dan menambah klien. Saat menyimpan, kami kembali mengonversi DTO ke entitas dan menyimpan.
Apa manfaat dari konversi ini? Bisakah seseorang menjelaskan?
What's the benefit of these conversions?
decoupling model data ketekunan dari model data (representasi) yang ditawarkan kepada konsumen. Manfaat decoupling telah banyak dibahas dalam SE Namun, tujuan di bawah DTO adalah untuk mengumpulkan dalam satu tanggapan sebanyak info yang dianggap perlu bagi klien untuk menyimpan panggilan ke server. Apa yang membuat komunikasi client-server lebih lancar.Jawaban:
Setiap kali pengembang bertanya "apa gunanya melakukan ini?", Apa yang sebenarnya mereka maksudkan adalah "Saya tidak melihat kasus penggunaan di mana melakukan ini memberikan manfaat". Untuk itu, izinkan saya menunjukkan kepada Anda beberapa contoh.
Semua contoh akan didasarkan pada model data sederhana ini:
Dan Anda dapat mengasumsikan bahwa aplikasi menggunakan data ini dalam berbagai cara (laporan, formulir, munculan, ...).
Seluruh aplikasi sudah ada. Semua yang saya sebutkan adalah perubahan basis kode yang ada. Ini penting untuk diingat.
Contoh 1 - Mengubah struktur data yang mendasarinya - Tanpa DTO
Persyaratan telah berubah. Usia orang tersebut perlu diambil secara dinamis dari database pemerintah (mari kita asumsikan berdasarkan nama depan dan belakang mereka).
Karena Anda tidak perlu menyimpan
Age
nilai secara lokal lagi, oleh karena itu perlu dihapus dariPerson
entitas. Penting di sini untuk menyadari bahwa entitas mewakili data database , dan tidak lebih. Jika tidak ada dalam database, itu tidak ada dalam entitas.Ketika Anda mengambil usia dari layanan web pemerintah, itu akan disimpan di objek (atau int) yang berbeda.
Tapi frontend Anda masih menampilkan usia. Semua tampilan telah diatur untuk menggunakan
Person.Age
properti, yang sekarang tidak ada lagi. Masalah muncul dengan sendirinya: Semua pandangan yang merujuk padaAge
seseorang perlu diperbaiki .Contoh 2 - Mengubah struktur data yang mendasarinya - Dengan DTO
Dalam sistem lama, ada juga
PersonDTO
entitas dengan lima sifat yang sama:Id, FirstName, LastName, Age, CityId
. Setelah mengambil aPerson
, lapisan layanan mengubahnya menjadiPersonDTO
dan kemudian mengembalikannya.Tapi sekarang, persyaratannya sudah berubah. Usia orang tersebut perlu diambil secara dinamis dari database pemerintah (mari kita asumsikan berdasarkan nama depan dan belakang mereka).
Karena Anda tidak perlu menyimpan
Age
nilai secara lokal lagi, oleh karena itu perlu dihapus dariPerson
entitas. Penting di sini untuk menyadari bahwa entitas mewakili data database , dan tidak lebih. Jika tidak ada dalam database, itu tidak ada dalam entitas.Namun, karena Anda memiliki perantara
PersonDTO
, penting untuk melihat bahwa kelas ini dapat menjaga denganAge
properti. Lapisan layanan akan mengambilPerson
, mengonversinya menjadiPersonDTO
, kemudian akan mengambil usia orang itu dari layanan web pemerintah, akan menyimpan nilai ituPersonDTO.Age
, dan melewati objek itu.Bagian penting di sini adalah bahwa siapa pun yang menggunakan lapisan layanan tidak melihat perbedaan antara sistem lama dan baru . Ini termasuk frontend Anda. Dalam sistem yang lama, ia menerima
PersonDTO
objek penuh . Dan dalam sistem baru, masih menerimaPersonDTO
objek penuh . Tampilan tidak perlu diperbarui .Inilah yang kami maksudkan ketika kami menggunakan pemisahan frase kekhawatiran : Ada dua keprihatinan yang berbeda (menyimpan data dalam database, menyajikan data ke frontend) dan mereka masing-masing memerlukan tipe data yang berbeda. Bahkan jika kedua tipe data tersebut mengandung data yang sama sekarang, itu mungkin berubah di masa depan.
Dalam contoh yang diberikan,
Age
ada perbedaan antara dua tipe data:Person
(entitas basis data) tidak memerlukanAge
, tetapiPersonDTO
(tipe data frontend) memang membutuhkannya.Dengan memisahkan masalah (= membuat tipe data terpisah) dari awal, basis kode jauh lebih tangguh terhadap perubahan yang dilakukan pada model data.
Saya bisa memberi Anda lebih banyak contoh tetapi prinsipnya akan selalu sama.
Untuk meringkas
Person
)Name
. Tetapi hanya karena mereka semua memilikiName
properti, tidak berarti bahwa kita harus membuat mereka mewarisi dariEntityWithName
kelas dasar bersama . Properti yang berbedaName
tidak memiliki hubungan yang berarti.Name
diganti namanya menjadiTitle
, atau seseorang mendapatFirstName
andLastName
), mereka harus mengeluarkan lebih banyak upaya untuk membatalkan warisan yang bahkan tidak Anda perlukan .Sebagai aturan praktis untuk mempertimbangkan memisahkan masalah, pikirkan seperti ini:
Misalkan setiap masalah (UI, database, logika) ditangani oleh orang yang berbeda di lokasi yang berbeda. Mereka hanya dapat berkomunikasi melalui email.
Dalam basis kode yang terpisah, perubahan ke masalah tertentu hanya perlu ditangani oleh satu orang:
Jika semua pengembang ini menggunakan
Person
entitas yang sama , dan perubahan kecil dilakukan pada entitas, semua orang harus terlibat dalam proses.Tetapi dengan menggunakan kelas data terpisah untuk setiap lapisan, masalah itu tidak lazim:
PersonDTO
objek yang valid , dev bisnis dan UI tidak peduli bahwa ia mengubah cara data disimpan / diambil.Ungkapan kunci di sini adalah karena itu tidak mempengaruhi mereka . Menerapkan pemisahan keprihatinan yang baik berupaya meminimalkan pengaruh (dan karena itu harus melibatkan) pihak lain.
Tentu saja, beberapa perubahan besar tidak dapat dihindari termasuk lebih dari satu orang, misalnya ketika entitas yang sama sekali baru ditambahkan ke database. Tetapi jangan meremehkan jumlah perubahan kecil yang harus Anda lakukan selama masa aplikasi. Perubahan besar adalah minoritas numerik.
sumber