MVC: Model yang terisi penuh atau Model yang Diisi Sebagian?


10

Yang ini telah menghantuiku begitu lama. Ketika melakukan pemrograman MVC menurut Anda apa praktik pemrograman yang lebih baik? Haruskah seseorang menggunakan model yang terisi penuh atau yang terisi sebagian, terutama ketika saya tahu bahwa untuk tugas khusus ini saya hanya akan membutuhkan 2 bidang dari objek model yang memiliki 5 lainnya?

Kadang-kadang sepertinya kriminal untuk mengisi daftar 20 objek model dengan semua nilai dari basis data ketika Anda tahu bahwa Anda hanya perlu sedikit dari mereka.

Tentu saja model parsial berarti bahwa Anda harus menulis satu metode lagi di DAO Anda selain dari yang mengambil semuanya. Yang berarti lebih banyak kode untuk dipelihara?

Di sisi lain menarik segala sesuatu dari DB dengan model yang penuh berarti satu metode melayani semua tetapi ini jelas akan memberi Anda beberapa overhead kinerja.

Saya dapat melihat ORM (seperti Hibernate atau ActiveRecord of Rails) mendukung tren dalam pemrograman MVC dan basis data seperti model penuh Google BigTable adalah tren yang diterima. Tetapi bagaimana jika Anda masih menggunakan JDBC tua yang baik?

Perangkat keras itu murah, pengembangannya mahal. Apakah itu benar bahkan ketika aplikasi perlu menskalakan hingga beberapa ratus ribu permintaan per jam?


1
"Di sisi lain menarik segala sesuatu dari DB dengan model yang penuh berarti satu metode melayani semua tetapi ini jelas akan memberi Anda beberapa overhead kinerja." Benarkah? Sudahkah Anda mengukur overhead kinerja dari praktik ini?
S.Lott

>> Benarkah? Sudahkah Anda mengukur overhead kinerja dari praktik ini? << - Saya sudah mengharapkan yang ini. Tidak, belum. Tetapi akan menarik untuk mengukur dan dibuktikan salah jika tidak.
Pritam Barhate

Sulit untuk membuktikan bahwa biaya overhead tidak ada. Anda dapat dengan mudah berdalih atas banyak detail dengan mengklaim pengukuran tidak valid untuk beberapa situasi. Akan jauh lebih baik jika Anda menggunakan pengaturan database, bahasa aplikasi, dll. Anda, dan profil konfigurasi yang Anda sukai untuk menunjukkan apa sebenarnya overhead itu sehingga kami tidak perlu berdalih atas berbagai faktor yang kami tinggalkan dari pengukuran kami .
S.Lott

1
Saya menemukan artikel yang sangat bagus yang mencakup pertanyaan tentang mengekspos model domain Anda vs. mengirim DTO di msdn.microsoft.com/en-us/magazine/ee236638.aspx .
Mayo

Jawaban:


3

Anda memiliki dua opsi:

1) Biarkan beberapa bidang dalam model tidak terisi

2) Buat model "lite" tambahan untuk situasi spesifik Anda

Yang mana yang akan dipilih tergantung pada dua hal lagi:

a) Berapa banyak bidang dari model "penuh" yang akan diabaikan

b) Seberapa sering model "lite" ini akan dipakai

Jika hanya ada beberapa atau beberapa bidang yang dapat diisi, tidak apa-apa untuk pergi dengan 1).

Jika b) hanya situasi individu yang luar biasa, mungkin tidak ada gunanya membuat model tambahan hanya untuk satu kasus penggunaan.

Pendekatan lain adalah mendefinisikan model "lite" dan mewarisi model "penuh" darinya.


Terima kasih atas jawabannya. Masuk akal untuk membuat model lite tergantung pada kebutuhan. Tapi kadang-kadang saya bertanya-tanya bukankah strategi seperti itu akan menciptakan terlalu banyak kelas model? Terutama jika saya membuat model khusus untuk tampilan daripada model khusus untuk logika bisnis.
Pritam Barhate

3

Jika tampilan Anda hanya membutuhkan 2 properti dari model, maka Anda (mungkin) memiliki model yang salah untuk use case itu! Saya akan mencari untuk membuat model yang sesuai dengan tampilan, menyimpan pencarian DB ekstra dan hanya mengisi data yang Anda butuhkan. Jika tampilan selanjutnya membutuhkan lebih detail maka Anda harus bertanya, apakah saya mendapatkan data tambahan nanti atau haruskah saya mendapatkan semuanya di muka ...

Sebagai alternatif, Anda bisa melihat semacam evaluasi malas, sehingga nilai-nilai diisi ketika Anda membutuhkannya. Ini bisa bekerja dengan baik tetapi jelas lebih banyak pekerjaan dan mungkin berakhir menyebabkan beberapa perjalanan pulang pergi ke DB yang tidak bagus jika Anda akhirnya sering melakukannya.

Yang mengatakan, jika Anda pada dasarnya memilih beberapa bidang tambahan dari tabel atau tampilan maka biaya untuk mendapatkan data tambahan adalah, untuk semua maksud dan tujuan nol (OK, ada lebih banyak byte pada kabel, tetapi biaya terbesar kemungkinan besar untuk membuat dan menghancurkan koneksi), jadi jika ada kesempatan Anda akan membutuhkan beberapa data tambahan saya mungkin akan mengisi model sepenuhnya setelah Anda senang Anda memiliki model yang tepat .

Perangkat keras itu murah, tetapi tidak ada jumlah perangkat keras yang dapat membuat desain yang buruk bekerja dengan baik.


2
>> Jika tampilan Anda hanya membutuhkan 2 properti dari model, maka Anda memiliki model yang salah! << - Tidak perlu selalu bekerja. Case Khas menunjukkan daftar hasil pencarian dalam aplikasi bisnis. Misalnya dalam CRM - pelanggan - sebagian besar hanya akan menampilkan nama dan satu atau 2 bidang penting dalam daftar pencarian. Tetapi CRM akan memiliki beberapa bidang lain yang terkait dengan pelanggan itu.
Pritam Barhate

1
Pertanyaan mengatakan bahwa dalam hal ini hanya 2 properti yang diperlukan.
Steve

-2

Model ini bukan DAO.

Dan satu hal lagi: jika Anda mengatakan bahwa Anda memiliki 20 model (pelanggan, dari contoh Anda), maka itu bukan model MVC. Model domain tidak memetakan langsung ke satu baris tabel. Sebaliknya itu harus bertanggung jawab atas semua operasi yang dilakukan dengan "pelanggan" Anda.

Dalam contoh Anda, "Pelanggan" bukan model domain, tetapi hanya objek di dalam model.

Adapun interaksi dengan database, tanggung jawab itu harus didelegasikan ke objek data mapper , yang harus tahu cara menyimpan dan mengambil contoh kelas Pelanggan Anda.


PS jika Anda memiliki logika database di dalam model, maka itu akan mendorong logika bisnis domain ke controller.
mefisto

1
Satu kelas yang melakukan semuanya operasi untuk pelanggan adalah ide yang buruk karena akan sulit untuk mempertahankan.
Andy
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.