Automapper adalah "object-object mapper" untuk .Net, yang berarti menyalin objek dari kelas ke kelas lain yang mewakili hal yang sama.
Mengapa ini bermanfaat? Apakah duplikasi kelas bermanfaat / desain bagus?
Automapper adalah "object-object mapper" untuk .Net, yang berarti menyalin objek dari kelas ke kelas lain yang mewakili hal yang sama.
Mengapa ini bermanfaat? Apakah duplikasi kelas bermanfaat / desain bagus?
Jawaban:
Pencarian google cepat mengungkapkan contoh ini:
http://www.codeproject.com/Articles/61629/AutoMapper
menunjukkan penggunaan AutoMapper yang benar-benar valid yang jelas bukan contoh untuk desain yang buruk. Dalam aplikasi berlapis, Anda mungkin memiliki objek di data atau lapisan bisnis Anda, dan kadang-kadang Anda hanya perlu subset dari atribut objek data itu, atau semacam tampilan di lapisan UI Anda. Jadi Anda membuat model tampilan yang berisi objek dengan atribut yang tepat Anda butuhkan di UI Anda, tidak lebih, dan menggunakan AutoMapper untuk memberikan konten objek dengan kode boilerplate lebih sedikit.
Dalam situasi seperti itu "objek tampilan" Anda bukan duplikat dari kelas asli. Mereka memiliki metode yang berbeda dan mungkin beberapa atribut duplikat. Tapi itu tidak masalah selama Anda menggunakan objek tampilan itu hanya untuk tujuan tampilan UI dan jangan mulai menyalahgunakannya untuk manipulasi data atau operasi bisnis.
Topik lain yang mungkin Anda baca untuk mendapatkan pemahaman yang lebih baik tentang hal ini adalah pola Pemisahan Tanggung Jawab Kueri Perintah Fowlers , berbeda dengan CRUD. Ini menunjukkan kepada Anda situasi di mana model objek yang berbeda untuk meminta data dan memperbarui mereka dalam database masuk akal. Di sini, pemetaan dari satu model objek ke yang lain juga dapat dilakukan oleh alat seperti AutoMapper.
Apakah duplikasi kelas bermanfaat / desain bagus?
Praktik yang baik untuk memiliki kelas model tampilan terpisah untuk digunakan di lapisan UI daripada menggunakan kelas yang sama yang digunakan di lapisan data. Halaman UI / web Anda mungkin perlu menampilkan bit informasi lain yang tidak terkait erat dengan entitas data. Dengan membuat kelas tambahan ini, Anda memberi diri Anda kebebasan untuk mengubah UI Anda dengan mudah karena persyaratan berubah seiring waktu.
Sejauh menggunakan AutoMapper, saya pribadi menghindarinya karena 3 alasan:
Kegagalan diam lebih sering terjadi
Karena AutoMapper memetakan antara properti secara otomatis, mengubah nama properti di satu kelas dan bukan yang lain akan menyebabkan pemetaan properti dilewati. Kompiler tidak akan tahu. Automapper tidak akan peduli.
Kurangnya analisis statis
Jadi Anda telah diberi basis kode yang besar untuk dihadapi. Ada sejuta kelas dengan sejuta properti. Banyak yang terlihat seperti tidak digunakan, atau merupakan duplikat. Alat "Temukan semua referensi" di Visual Studio akan membantu Anda melihat di mana properti digunakan dan membantu membangun peta di kepala Anda tentang bagaimana seluruh aplikasi saling terkait. Tapi tunggu, tidak ada referensi eksplisit untuk setengah properti karena Automapper sedang digunakan. Pekerjaan saya sekarang jauh lebih sulit.
Persyaratan terlambat yang meningkatkan kompleksitas
Automapper baik-baik saja dan keren ketika semua yang ingin Anda lakukan adalah menyalin nilai dari satu kelas ke kelas lain (seperti yang sering terjadi pada MULAI pengembangan), tetapi ingat persyaratan yang berubah dari waktu ke waktu? Bagaimana jika sekarang Anda perlu mendapatkan nilai dari bagian lain aplikasi Anda, mungkin khusus untuk pengguna yang masuk atau keadaan kontekstual lainnya?
Pola AutoMapper untuk membuat pemetaan kelas satu-ke-satu pada awal aplikasi tidak cocok dengan perubahan-perubahan spesifik konteks semacam ini. Ya, mungkin ada cara untuk membuatnya bekerja, tetapi saya biasanya merasa lebih bersih, lebih sederhana dan lebih ekspresif untuk menulis logikanya sendiri.
Singkatnya, sebelum meraih Automapper untuk menghemat 30 detik pemetaan satu kelas secara manual, pikirkan hal ini.
Pemrograman adalah seni memberi tahu manusia lain apa yang diinginkan komputer. - Donald Knuth
Dengan mengingat hal ini, tanyakan pada diri Anda "apakah AutoMapper bermanfaat hari ini dan apakah akan besok?"
Dalam pengalaman saya, ketika seseorang mengeluh tentang 'terlalu banyak boilerplate' dan ingin menggunakan AutoMapper, itu salah satu dari yang berikut:
Namun:
Jika Anda memilih bahasa yang diketik secara statis, maka manfaatkan bahasa tersebut. Jika Anda mencoba untuk mengelak dari kontrol dalam bahasa yang membantu mencegah kesalahan karena terlalu sering menggunakan refleksi dan API ajaib seperti AutoMapper, itu artinya Anda memilih bahasa yang tidak memuaskan untuk kebutuhan Anda.
Juga, hanya karena Microsoft menambahkan fitur ke C # tidak berarti mereka adalah permainan yang adil dalam setiap situasi atau mereka mendukung praktik terbaik. Refleksi dan kata kunci 'dinamis', misalnya, harus digunakan dalam kasus di mana Anda tidak dapat mencapai apa yang Anda butuhkan tanpa kata kunci tersebut. AutoMapper bukanlah solusi untuk setiap use case yang belum dapat dipecahkan tanpanya.
Jadi, apakah duplikasi kelas desain yang buruk? Belum tentu.
Apakah AutoMapper adalah ide yang buruk? Ya, tentu saja.
Penggunaan AutoMapper menunjukkan kekurangan sistemik dalam proyek. Jika Anda merasa membutuhkannya, berhentilah dan pikirkan desain Anda. Anda akan selalu menemukan desain yang lebih baik, lebih mudah dibaca, lebih dapat dirawat, dan lebih bebas bug.
Ada masalah yang lebih dalam di sini: fakta bahwa C # dan Java bersikeras sebagian besar / semua jenis harus dapat dibedakan berdasarkan nama daripada struktur: misalnya class MyPoint2D
dan class YourPoint2D
merupakan jenis yang terpisah bahkan jika mereka memiliki definisi yang sama persis. Ketika jenis yang Anda inginkan adalah "beberapa hal anonim dengan x
bidang dan y
bidang" (yaitu catatan ), Anda kurang beruntung. Jadi, ketika Anda ingin mengubah a YourPoint2D
menjadi MyPoint2D
, Anda memiliki tiga opsi:
this.x = that.x; this.y = that.y
Pilihan 1 cukup mudah dalam dosis kecil tetapi dengan cepat menjadi tugas ketika jumlah jenis yang Anda butuhkan untuk memetakan besar.
Pilihan 2 kurang diinginkan karena sekarang Anda harus menambahkan langkah ekstra ke proses pembuatan untuk menghasilkan kode, dan pastikan seluruh tim mendapatkan memo itu. Dalam kasus terburuk Anda harus memutar generator kode atau sistem template Anda sendiri juga.
Itu membuat Anda berpikir. Anda bisa melakukannya sendiri, atau Anda bisa menggunakan AutoMapper.
Automapper adalah salah satu perpustakaan / alat di mana kaisar benar-benar berlarian telanjang. Ketika Anda melewati logo mewah, Anda menyadari itu tidak melakukan apa pun yang tidak dapat Anda lakukan secara manual dengan hasil yang jauh lebih baik.
Sementara saya tidak sepenuhnya yakin bagaimana ini mengisyaratkan anggota pemetaan otomatis, kemungkinan besar melibatkan logika runtime tambahan dan kemungkinan refleksi. Ini mungkin penalti kinerja yang signifikan dengan imbalan penghematan waktu. Pemetaan manual, di sisi lain, petunjuk dijalankan sebelum waktu kompilasi.
Dalam kasus di mana AutoMapper tidak memiliki petunjuk, Anda harus mengkonfigurasi pemetaan dengan kode dan mengatur flag. Jika Anda akan repot melakukan semua pengaturan dan kerja kode, Anda harus mempertanyakan berapa banyak penghematannya dibandingkan pemetaan manual.