Jawaban:
Aturan bisnis masuk dalam model.
Katakanlah Anda sedang menampilkan email untuk milis. Pengguna mengklik tombol "hapus" di sebelah salah satu email, pengontrol memberi tahu model untuk menghapus entri N, lalu memberi tahu tampilan model yang telah diubah.
Mungkin email admin tidak boleh dihapus dari daftar. Itu aturan bisnis, bahwa pengetahuan termasuk dalam model. Pandangan akhirnya dapat mewakili aturan ini entah bagaimana - mungkin model memperlihatkan properti "IsDeletable" yang merupakan fungsi dari aturan bisnis, sehingga tombol hapus pada tampilan dinonaktifkan untuk entri tertentu - tetapi aturan itu sendiri tidak terkandung dalam tampilan.
Model ini akhirnya menjadi penjaga pintu untuk data Anda. Anda harus dapat menguji logika bisnis Anda tanpa menyentuh UI sama sekali.
Fist semua:
Saya percaya bahwa Anda mencampur pola MVC dan prinsip-prinsip desain berbasis n-tier.
Menggunakan pendekatan MVC tidak berarti Anda tidak boleh melapisi aplikasi Anda.
Mungkin membantu jika Anda melihat MVC lebih seperti ekstensi dari lapisan presentasi.
Jika Anda memasukkan kode non-presentasi di dalam pola MVC Anda mungkin segera berakhir dengan desain yang rumit.
Karena itu saya menyarankan agar Anda meletakkan logika bisnis Anda ke dalam lapisan bisnis yang terpisah.
Lihat saja ini: artikel Wikipedia tentang arsitektur multitier
:
Hari ini, MVC dan model-view-presenter (MVP) serupa adalah pola desain Pemisahan Kekhawatiran yang berlaku secara eksklusif untuk lapisan presentasi sistem yang lebih besar.
Lagi pula ... ketika berbicara tentang aplikasi web perusahaan , panggilan dari UI ke lapisan logika bisnis harus ditempatkan di dalam pengontrol (presentasi).
Itu karena pengontrol benar-benar menangani panggilan ke sumber daya tertentu, meminta data dengan membuat panggilan ke logika bisnis dan menautkan data (model) ke tampilan yang sesuai.
Mud memberi tahu Anda bahwa aturan bisnis masuk ke dalam model.
Itu juga benar, tetapi ia mencampuradukkan model (presentasi) ('M' dalam MVC) dan model lapisan data dari desain aplikasi berbasis tier.
Jadi, valid untuk menempatkan basis data Anda terkait aturan bisnis dalam model (lapisan data) aplikasi Anda.
Tetapi Anda tidak harus menempatkan mereka dalam model lapisan presentasi terstruktur MVC Anda karena ini hanya berlaku untuk UI tertentu.
Teknik ini tidak tergantung apakah Anda menggunakan desain yang digerakkan domain atau pendekatan berbasis skrip transaksi.
Biarkan saya memvisualisasikannya untuk Anda:
Lapisan presentasi: Model - View - Controller
Lapisan bisnis: Logika domain - Logika aplikasi
Lapisan data: Repositori data - Lapisan akses data
Model yang Anda lihat di atas berarti bahwa Anda memiliki aplikasi yang menggunakan MVC, DDD, dan lapisan data yang tidak bergantung pada basis data.
Ini adalah pendekatan umum untuk merancang aplikasi web perusahaan yang lebih besar.
Tetapi Anda juga dapat mengecilkannya untuk menggunakan lapisan bisnis non-DDD sederhana (lapisan bisnis tanpa logika domain) dan lapisan data sederhana yang menulis langsung ke database tertentu.
Anda bahkan dapat menjatuhkan seluruh lapisan data dan mengakses database langsung dari lapisan bisnis, meskipun saya tidak merekomendasikannya.
Triknya ... Saya harap ini membantu ...
[Catatan:] Anda juga harus menyadari fakta bahwa saat ini ada lebih dari satu "model" dalam suatu aplikasi. Umumnya, setiap lapisan aplikasi memiliki modelnya sendiri. Model lapisan presentasi adalah tampilan spesifik tetapi sering independen dari kontrol yang digunakan. Lapisan bisnis juga dapat memiliki model, yang disebut "domain-model". Ini biasanya terjadi ketika Anda memutuskan untuk mengambil pendekatan berbasis domain. "Model domain" ini berisi data dan juga logika bisnis (logika utama program Anda) dan biasanya tidak tergantung pada lapisan presentasi. Lapisan presentasi biasanya memanggil lapisan bisnis pada "peristiwa" tertentu (tombol ditekan dll.) Untuk membaca data dari atau menulis data ke lapisan data. Lapisan data mungkin juga memiliki modelnya sendiri, yang biasanya terkait dengan basis data.
Pertanyaannya adalah: bagaimana hal ini sesuai dengan konsep MVC?
Jawab -> Tidak!
Ya - memang agak, tapi tidak sepenuhnya.
Ini karena MVC adalah pendekatan yang dikembangkan pada akhir 1970-an untuk bahasa pemrograman Smalltalk-80. Pada saat itu GUI dan komputer pribadi sangat tidak umum dan web di seluruh dunia bahkan tidak ditemukan! Sebagian besar bahasa pemrograman dan IDE saat ini dikembangkan pada 1990-an. Pada waktu itu komputer dan antarmuka pengguna sama sekali berbeda dari yang ada di tahun 1970-an.
Anda harus mengingatnya saat berbicara tentang MVC.
Martin Fowler telah menulis artikel yang sangat bagus tentang MVC, MVP dan GUI hari ini.
Logika bisnis jangka menurut saya bukan definisi yang tepat. Evans berbicara dalam bukunya, Domain Driven Design, tentang dua jenis logika bisnis:
Pemisahan ini menurut saya jauh lebih jelas. Dan dengan kesadaran bahwa ada berbagai jenis aturan bisnis juga muncul kesadaran bahwa mereka tidak semua harus pergi ke tempat yang sama.
Logika domain adalah logika yang sesuai dengan domain aktual. Jadi jika Anda membuat aplikasi akuntansi, maka aturan domain akan menjadi aturan mengenai akun, posting, perpajakan, dll. Dalam alat perencanaan perangkat lunak tangkas, aturannya akan seperti menghitung tanggal rilis berdasarkan kecepatan dan poin cerita di backlog, dll.
Untuk kedua jenis aplikasi ini, impor / ekspor CSV mungkin relevan, tetapi aturan impor / ekspor CSV tidak ada hubungannya dengan domain sebenarnya. Jenis logika ini adalah logika aplikasi.
Logika domain pasti masuk ke lapisan model. Model ini juga sesuai dengan lapisan domain di DDD.
Namun aplikasi logika tidak harus ditempatkan di lapisan model. Itu bisa ditempatkan di pengontrol secara langsung, atau Anda bisa membuat lapisan aplikasi terpisah dengan aturan itu. Apa yang paling logis dalam hal ini akan tergantung pada aplikasi yang sebenarnya.
A1 : Logika Bisnis masuk ke Model
bagian dalam MVC
. Peranannya Model
adalah memuat data dan logika bisnis. Controller
di sisi lain bertanggung jawab untuk menerima input pengguna dan memutuskan apa yang harus dilakukan.
A2 : A Business Rule
adalah bagian dari Business Logic
. Mereka memiliki has a
hubungan. Business Logic
telah Business Rules
.
Lihatlah Wikipedia entry for MVC
. Pergi ke Ikhtisar di mana ia menyebutkan aliranMVC
pola.
Lihat juga Wikipedia entry for Business Logic
. Disebutkan bahwa Business Logic
itu terdiri dari Business Rules
dan Workflow
.
Seperti yang ditunjukkan oleh beberapa jawaban, saya percaya ada beberapa kesalahpahaman arsitektur multi tier vs MVC.
Arsitektur multi tier melibatkan memecah aplikasi Anda menjadi tingkatan / lapisan (mis. Presentasi, logika bisnis, akses data)
MVC adalah gaya arsitektur untuk lapisan presentasi aplikasi. Untuk aplikasi yang tidak sepele, logika bisnis / aturan bisnis / akses data tidak boleh ditempatkan langsung ke dalam Model, Tampilan, atau Pengontrol. Untuk melakukannya akan menempatkan logika bisnis di lapisan presentasi Anda dan dengan demikian mengurangi penggunaan kembali dan pemeliharaan kode Anda.
Model adalah pilihan pilihan yang sangat masuk akal untuk menempatkan logika bisnis, tetapi pendekatan yang lebih baik / lebih dapat dipertahankan adalah memisahkan lapisan presentasi Anda dari lapisan logika bisnis Anda dan membuat lapisan logika bisnis dan cukup memanggil lapisan logika bisnis dari model Anda bila diperlukan. Lapisan logika bisnis pada gilirannya akan memanggil ke lapisan akses data.
Saya ingin menunjukkan bahwa tidak jarang menemukan kode yang menggabungkan logika bisnis dan akses data di salah satu komponen MVC, terutama jika aplikasi tidak dirancang menggunakan beberapa tingkatan. Namun, di sebagian besar aplikasi perusahaan, Anda biasanya akan menemukan arsitektur multi-tier dengan arsitektur MVC di dalam lapisan presentasi.
Ini adalah pertanyaan yang dijawab, tetapi saya akan memberikan "satu sen" saya:
Aturan bisnis termasuk dalam model. "Model" selalu terdiri dari (dipisahkan secara logis atau fisik):
Aturan bisnis hidup dalam model domain, diekspos dalam bentuk presentasi-cocok untuk model "presentasi" dan kadang-kadang digandakan (atau juga ditegakkan) di "lapisan data".
Tidak masuk akal untuk menempatkan lapisan bisnis Anda di Model untuk proyek MVC.
Katakan bahwa bos Anda memutuskan untuk mengubah lapisan presentasi ke hal lain, Anda akan kacau! Lapisan bisnis harus merupakan perakitan terpisah. Model berisi data yang berasal dari lapisan bisnis yang lolos ke tampilan untuk ditampilkan. Kemudian pada postingan misalnya, model mengikat kelas Person yang berada di lapisan bisnis dan memanggil PersonBusiness.SavePerson (p); di mana p adalah kelas Person. Inilah yang saya lakukan (kelas BusinessError hilang tetapi akan masuk ke BusinessLayer juga):
Q1:
Logika bisnis dapat dipertimbangkan dalam dua kategori:
Logika domain menyukai kontrol pada alamat email (keunikan, kendala, dll.), Memperoleh harga suatu produk untuk faktur, atau, menghitung harga total shoppingCart berdasarkan objek produknya.
Alur kerja yang lebih luas dan rumit yang disebut proses bisnis, seperti mengendalikan proses pendaftaran untuk siswa (yang biasanya mencakup beberapa langkah dan memerlukan pemeriksaan yang berbeda dan memiliki kendala yang lebih rumit).
The pertama kategori masuk ke Model dan kedua satu milik kontroler . Ini karena kasus-kasus dalam kategori kedua adalah logika aplikasi luas dan menempatkannya dalam model dapat mencampur abstraksi model (misalnya, tidak jelas apakah kita perlu menempatkan keputusan itu dalam satu kelas model atau yang lain, karena mereka terkait untuk keduanya!).
Lihat jawaban ini untuk perbedaan khusus antara model dan pengontrol, tautan ini untuk definisi yang sangat tepat dan juga tautan ini untuk contoh Android yang bagus.
Intinya adalah bahwa catatan yang disebutkan oleh "Mud" dan "Frank" di atas keduanya bisa benar dan juga "Pete" (logika bisnis dapat dimasukkan ke dalam model, atau controller, sesuai dengan jenis logika bisnis).
Akhirnya, perhatikan bahwa MVC berbeda dari konteks ke konteks. Misalnya, dalam aplikasi Android, beberapa definisi alternatif disarankan yang berbeda dari yang berbasis web (lihat posting ini misalnya).
Q2:
Logika bisnis lebih umum dan (seperti "decyclone" yang disebutkan di atas) kami memiliki hubungan berikut di antaranya:
aturan bisnis ⊂ logika bisnis
Mengapa Anda tidak memperkenalkan lapisan layanan. maka controller Anda akan menjadi ramping dan lebih mudah dibaca, maka semua fungsi controller Anda akan menjadi tindakan murni. Anda dapat menguraikan logika bisnis sebanyak yang Anda butuhkan di dalam lapisan layanan. penggunaan kembali kode tinggi. tidak berdampak pada model dan repositori.
Model = kode untuk operasi basis data CRUD.
Pengendali = merespons tindakan pengguna, dan meneruskan permintaan pengguna untuk pengambilan data atau menghapus / memperbarui model, tunduk pada aturan bisnis khusus untuk suatu organisasi. Aturan bisnis ini dapat diimplementasikan dalam kelas pembantu, atau jika tidak terlalu rumit, langsung saja dalam tindakan pengontrol. Pengontrol akhirnya meminta pandangan untuk memperbarui dirinya sendiri sehingga dapat memberikan umpan balik kepada pengguna dalam bentuk tampilan baru, atau pesan seperti 'diperbarui, terima kasih', dll.,
View = UI yang dihasilkan berdasarkan kueri pada model.
Tidak ada aturan yang keras dan cepat mengenai ke mana aturan bisnis harus pergi. Dalam beberapa desain mereka masuk ke model, sedangkan yang lain mereka disertakan dengan controller. Tapi saya pikir lebih baik menyimpannya dengan controller. Biarkan model hanya khawatir tentang konektivitas basis data.