Saya mencoba untuk memperbaiki aplikasi saya ke MVC, tapi saya terjebak di bagian M.
Dalam aplikasi yang didukung database, model diimplementasikan dalam kode aplikasi, kan?
Tapi kemudian, apa yang ada di database - bukankah itu modelnya?
(Saya tidak menggunakan database sebagai penyimpan objek sederhana - data dalam DB adalah aset perusahaan).
I'm not using the database as a simple object store
. Saya menduga itu berarti beberapa logika bisnis dalam database, dalam bentuk prosedur yang tersimpan. Secara teori itu bertentangan dengan MVC, tetapi dalam praktiknya itu tidak masalah.I want the data in the DB to have a life and meaning beyond the application.
Apa?Jawaban:
Ya, baik model dalam kode dan basis data adalah "Model".
Model ini ada hubungannya dengan apa aplikasi Anda "IS", dan controller adalah apa yang "tidak". Setiap kode yang berhubungan dengan kegigihan langsung ke basis data dianggap sebagai Model.
Catatan: MVC adalah sebuah pola , jadi jangan terlalu memikirkannya. Sangat mudah untuk membuat semua super melakukan MVC dengan cara yang benar, tetapi pada akhirnya, itu hanya pola pikir! Ini berarti jauhkan logika bisnis Anda dari database dan UI - hanya itu. Sebelum MVC, orang-orang akan meletakkan semua logika bisnis di halaman web mereka ketika seharusnya berada di server, atau mereka akan memiliki banyak skrip yang diaktifkan dalam database yang melakukan business logic bersama dengan kode persistensi. MVC dibuat untuk membuat orang mulai berpikir dengan cara yang membantu membuat kode mereka dapat digunakan kembali, jadi jangan terjebak dalam detail terlalu banyak.
sumber
Trygve Reenskaug menulis makalah awal yang menggambarkan pola MVC pada tahun 1978. Model dalam uraiannya adalah model objek yang mewakili objek, fenomena, dan konsep dunia nyata. Dalam skenario aplikasi yang didukung database, model adalah proyeksi data Anda. Sederhananya, model adalah kelas dan hubungan mereka yang berkaitan dengan aplikasi Anda.
Dalam praktiknya, biasanya ada dua model yang digunakan dalam MVC, Model Domain (apa pemetaan ke database Anda) dan Model Aplikasi (juga disebut Model Tampilan dalam terminologi hari ini). Model Aplikasi adalah proyeksi Model Domain yang juga berisi tampilan data spesifik untuk menampilkan tampilan. Pendekatan ini disebut MMVC . Pengontrol langsung berinteraksi dengan model domain dan menyajikan model aplikasi ke tampilan. Dalam pola MVVM, Model Aplikasi dan Pengendali digabungkan.
sumber
The model is a projection of your data.
Basis data dirancang untuk menyimpan data dengan cara yang paling efisien untuk mengakses dan mengindeks. Model tersebut harus dirancang di sekitar domain bisnis.the Domain Model (what's mapping to your database)
. Jawaban bagus!Anda tidak memerlukan database untuk MVC. Jika model Anda kebetulan berbicara dengan basis data, maka hebat. Itu juga bisa bertahan sendiri ke file datar, atau tidak bertahan sama sekali.
Model adalah tempat data disimpan dalam memori di aplikasi Anda. Anda juga akan ingin menggunakan model untuk melakukan perhitungan dan validasi pada datanya. Misalnya, Anda memiliki model FinancePayment, dengan properti seperti suku bunga, jangka waktu, dan prinsip. Anda dapat menambahkan metode getMonthlyPayment () ke model Anda untuk menghitung pembayaran bulanan. Anda tidak ingin melakukan itu di controller atau view.
Tampilan harus cukup bodoh, baik tidak memiliki logika sama sekali, atau hanya menggunakan pengikatan data sederhana (lihat pola Tampilan Pasif dan Pengawasan di situs Martin Fowler ). Tampilan memunculkan peristiwa ketika pengguna melakukan hal-hal, seperti mengklik tombol.
Pengontrol bertanggung jawab untuk menangani peristiwa (menjalankan beberapa kode ketika pengguna mengklik tombol simpan), dan untuk mengatur properti model, dan memberi tahu model untuk memuat dan menyimpan sendiri (jika menggunakan kegigihan). Pengontrol seharusnya tidak melakukan perhitungan pada data model. Namun, dalam pengontrol, Anda dapat melakukan beberapa perhitungan atas nama tampilan, seperti "if model.profit () <0 maka widget.colour = 'red'"
Anda harus dapat beralih ke versi baris perintah dari aplikasi Anda tanpa mengubah model, dan tanpa kehilangan fungsionalitas model.
Sebuah. Anda mungkin harus dapat beralih ke versi seluler aplikasi Anda (bukan versi desktop) dengan hanya mengalihkan tampilan (dan bukan pengontrol atau model). Anda harus dapat menguji unit model dan pengontrol Anda tanpa kerangka kerja pengujian GUI.
sumber
Model adalah kode yang memiliki koneksi ke V dan C di frontend, dan ke penyimpanan persisten (bisa berupa apa saja dari file ke database SQL / NoSQL) di backend. Bukan hanya kode yang memuat dari db dan menyimpan ke db (yang merupakan salah satu kesalahpahaman dari model), itu adalah kode yang benar-benar melakukan semua pekerjaan "domain" - memilih, memfilter, mengubah, menghitung, memutuskan atas data. Termasuk semua logika non-UI aplikasi.
sumber
Mengambil pandangan yang sangat sederhana dan idealistis.
Model ini umumnya dilihat sebagai model domain (kira-kira, bisnis), bukan sebagai model data. Ini mungkin terlihat serupa, tetapi mereka tidak sepenuhnya terikat satu sama lain.
Tampilan harus menjadi model ujung depan aplikasi dan Pengontrol harus menjadi model aliran dari satu tampilan ke tampilan lainnya.
Logika bisnis harus sepenuhnya dirangkum dalam Model, apakah itu dalam database atau kode. Meskipun beberapa logika bisnis dapat diulang dalam View atau Controller, karena berbagai alasan, harus dimungkinkan (dan aman) untuk menghapus dua komponen sepenuhnya dan meletakkan front-end yang berbeda di tempatnya.
sumber
Menurut pemahaman saya, MVC hanyalah deskripsi dari pola arsitektur aplikasi klien Anda. Gambar di sini di Wikipedia hanya menunjukkan ini:
http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
Tentu saja, ketika Anda memiliki bagian dari aplikasi Anda diimplementasikan dalam "prosedur tersimpan", maka kode basis data tersebut juga dapat menjadi bagian dari model, atau bahkan dari pengontrol (tergantung apa yang dikerjakan kodenya). Tetapi jika itu tidak terjadi, maka database jelas "di luar MVC", seperti yang Anda nyatakan.
sumber
Tidak, bukan itu. " Model mengelola perilaku dan data domain aplikasi". Seringkali, Model terhubung ke dalam database ya, tetapi tidak mungkin itu merupakan persyaratan. Model adalah lapisan baru antara aplikasi Anda dan basis data. Backend bisa berupa serangkaian objek Mock, XML, atau apa pun yang mendukung kegigihan data.
Dengan memisahkan lapisan yang Anda berikan pada diri Anda fleksibilitas yang jauh lebih besar untuk menggunakan praktik pengujian unit yang lebih baik, membuat kode lebih mudah dikelola (EG SQL digantikan oleh Oracle) di antara manfaat lainnya.
Hal yang sama berlaku dengan controller. MVC mendefinisikan controller sebagai perantara di antara dua lapisan. Tidak ada "lapisan bisnis" yang didefinisikan dalam MVC. Sebaliknya, Anda menambahkan milik Anda sendiri. MVC tidak merangkum semua lapisan yang diperlukan untuk membangun sebagian besar aplikasi. Itu hanya panduan umum untuk struktur dasar.
Pemisahan ini adalah kunci untuk memungkinkan inversi kontrol berfungsi.
sumber
Basis data adalah detail implementasi model. Model tersebut harus berupa Model Domain lengkap dan harus menggabungkan data dan proses. Pemisahan harus antara keprihatinan perbedaan dan bukan antara suatu proses dan data yang terkait dengan proses itu.
Lihat juga: http://martinfowler.com/bliki/AnemicDomainModel.html
sumber
Sebenarnya sangat sederhana, "Model" mewakili abstraksi untuk antarmuka data. Itulah mengapa:
Dan — jika saya benar — itulah sebabnya ketika seseorang merujuk pada model di luar konteks MVC, seseorang itu kemungkinan besar merujuk pada struktur data (yaitu skema ).
sumber
Saya pikir M berisi beberapa logika dan menyimpan data ke dalam DB. Kontroler memanggil modul mana yang akan dieksekusi dan modul ini akan mengeksekusi logika dan menyimpan data dalam DB (Mungkin memiliki lapisan persent) dan kemudian modul ini mengembalikan nilai ke V.
sumber
M (odel) dalam MVC harus menangkap model bisnis / domain di satu tempat.
Itu idealnya termasuk aturan bisnis dari domain serta struktur itu.
C (controller) sholuld idealnya hanya menyangkut dirinya sendiri dengan memediasi informasi model bisnis ke presentasi (misalnya View) dan menangkap input pengguna dari V (iew) untuk memulai perubahan dalam keadaan model.
Lapisan basis data hanya berurusan (atau lebih tepatnya hanya berurusan) dengan kegigihan keadaan model pada titik waktu tertentu.
Karena itu bukanlah sesuatu yang dimiliki baik Model atau Pengendali bagian dari pola MVC, melainkan merupakan masalah benar-benar terpisah yang dapat diimplementasikan secara implisit dengan transparan bertahan setiap perubahan model (sebagai fungsi dari fasad, memberikan interaksi dengan Model Anda ke Pengendali) atau seperti yang dilakukan lebih sering daripada tidak, dipanggil secara eksplisit oleh Pengendali setelah selesai membuat mutasi ke model.
sumber
Model di dunia yang ideal hanya boleh berisi logika bisnis, ia memodelkan beberapa objek nyata seperti Rumah. Namun dalam hampir semua keadaan model perlu untuk mempertahankan data ke beberapa penyimpanan.
Interaksi antara model dan data yang disimpan dapat terjadi pada lapisan data yang terpisah atau langsung dalam model, yang merupakan kasus ketika menggunakan ORM (Object Relational Mapper). Dengan kata lain baik model terhubung langsung ke database atau meneruskan data ke beberapa objek "akses data" lain yang terhubung ke database.
ORM (Object Relation Mapper) memetakan bidang dalam tabel database ke atribut objek model Anda, menyediakan getter dan setter. Dalam hal ini tidak ada lapisan data terpisah dan model bertanggung jawab langsung untuk mempertahankan datanya.
Berikut ini adalah contoh Ruby menggunakan
ActiveRecord
ORM populer:Price
adalah bidang dalamhouses
tabel yang secara otomatis terdeteksi denganActiveRecord
menambahkan pengambil dan penyetel ke objek. Kapansave
disebut nilai atribut harga tetap ke database.Dari sudut pandang saya, pro memiliki lapisan data adalah bahwa Anda mendapatkan titik di mana Anda dapat memanipulasi data sebelum sampai ke model, model memiliki lebih sedikit khawatir tentangnya, ia memiliki lebih sedikit tanggung jawab. Misalnya Anda mungkin perlu menggabungkan data dari beberapa sumber data yang tidak kompatibel, ini adalah sesuatu yang tidak mudah ditangani ORM.
Yang utama adalah lapisan abstraksi lain untuk dikelola, jika Anda tidak membutuhkannya, jangan repot-repot, tetap sederhana. Semakin sedikit bagian yang bergerak, semakin sedikit kesalahannya.
sumber
Ya kamu benar.
(Pengendali Tampilan Model)
Arsitektur untuk membangun aplikasi yang memisahkan data (model) dari antarmuka pengguna (tampilan) dan pemrosesan (pengontrol).
Dalam praktiknya, pandangan dan pengontrol MVC sering digabungkan menjadi satu objek karena mereka terkait erat. Menurut MSDN
Periksa diagram ini:
Misalnya, kode pengontrol memvalidasi permintaan data dan menyebabkannya dikembalikan dalam tampilan. Obyek view-controller terikat hanya dengan satu model; namun,
a model can have many view-controller objects associated with it.
sumber
In practice, MVC views and controllers are often combined into a single object because they are closely related.
Jika Anda melakukan itu, Anda salah melakukannya ...