Saya selalu berpikir bahwa logika bisnis harus ada di controller dan controller itu, karena itu adalah bagian 'tengah', tetap statis dan bahwa model / tampilan harus capsuled melalui antarmuka. Dengan begitu Anda dapat mengubah logika bisnis tanpa memengaruhi yang lain, program beberapa Model (satu untuk setiap basis data / jenis penyimpanan) dan puluhan tampilan (untuk platform yang berbeda misalnya).
Sekarang saya membaca dalam pertanyaan ini bahwa Anda harus selalu memasukkan logika bisnis ke dalam model dan bahwa pengontrol sangat terhubung dengan tampilan.
Bagi saya, itu tidak masuk akal dan menyiratkan bahwa setiap kali saya ingin memiliki sarana untuk mendukung database / jenis penyimpanan lain, saya harus menulis ulang seluruh model saya termasuk logika bisnis.
Dan jika saya ingin tampilan lain, saya harus menulis ulang tampilan dan pengontrolnya.
Dapatkah seseorang menjelaskan mengapa itu terjadi atau jika saya salah?
sumber
Anda dan sebagian besar dunia pemrograman tampaknya salah memahami apa peran bagian-bagian MVC. Singkatnya, mereka adalah:
Model = logika domain
Lihat = logika output
Kontroler = logika input
Ini berarti bahwa model tersebut bertanggung jawab atas seluruh logika bisnis: segala sesuatu yang terkait dengan menggambar widget di layar, mengendarai printer, mengeluarkan data sebagai HTML, mem-parsing permintaan HTTP, dll. Tidak termasuk dalam model.
Namun, banyak kerangka kerja modern yang disebut "MVC" tidak benar-benar melakukan MVC sama sekali, atau mereka salah memberi label bagian mereka. Cukup sering, apa yang disebut "model" adalah lapisan ketekunan dari model, sementara logika bisnis berada dalam apa yang mereka sebut "pengontrol"; pengontrol yang sebenarnya biasanya hanya merupakan titik masuk pusat dengan tabel routing dan sedikit kode dalam "pengontrol" individu untuk mengirimkan input yang mereka terima ke proses bisnis yang benar. Apa yang oleh kerangka kerja ini disebut "tampilan" sebenarnya sedikit dari segalanya: beberapa logika presentasi (Lihat), sedikit penanganan input dan validasi (Pengontrol), dan beberapa logika bisnis lainnya (Model). Bagian terbesar dari tampilan aktual biasanya disebut "templat".
Anda mungkin juga ingin membaca tentang Arsitektur Multi-Tier; di mana MVC adalah jenis satu arah (aliran adalah Controller -> Model -> View), Multi-Tier adalah hal dua arah (Presentasi -> Logika -> Data -> Logika -> Presentasi), dan beberapa kerangka kerja yang berpura-pura melakukan MVC sebenarnya melakukan Three-Tier, menandai kembali Presentation to View, Logic to Controller, dan Data to Model.
sumber
Untuk benar-benar mengisolasi logika bisnis dan membuatnya terpisah dari infrastruktur lapisan presentasi, harus dienkapsulasi oleh layanan aplikasi. Arsitektur MVC adalah cara untuk mengimplementasikan lapisan presentasi dan harus tetap pada lingkup itu, mendelegasikan semua logika bisnis ke layanan aplikasi ini. Pikirkan model tampilan sebagai adaptor antara tampilan dan data yang perlu ditampilkan dan dibaca. Pengontrol memediasi interaksi antara model tampilan, tampilan dan layanan aplikasi yang menampung logika bisnis.
Layanan aplikasi menerapkan kasus penggunaan bisnis dan dipisahkan dari lapisan presentasi, apakah itu MVC atau yang lainnya. Pada gilirannya, layanan aplikasi dapat meng-host skrip transaksi atau desain berbasis domain .
Untuk penyimpanan, layanan aplikasi dapat merujuk repositori atau abstraksi dari mekanisme persistensi. Implementasi yang berbeda dapat didukung dengan mengabstraksi akses data ke dalam antarmuka. Biasanya, abstraksi ini bocor dan hanya sebagian portabel di seluruh implementasi dan seringkali merupakan upaya yang sia-sia untuk mencapai portabilitas penuh.
MEMPERBARUI
Saran saya didasarkan pada arsitektur Hexagonal . Dalam arsitektur heksagonal, model domain Anda (logika bisnis) adalah intinya. Inti ini dirangkum oleh layanan aplikasi yang bertindak sebagai fasad . Layanan aplikasi adalah kelas sederhana yang memiliki metode yang sesuai dengan kasus penggunaan di domain Anda. Untuk diskusi mendalam tentang layanan aplikasi, lihat Layanan di Desain Berbasis Domain . Sampel kode berisi
PurchaseOrderService
yang merupakan layanan aplikasi untuk domain pembelian. (Perhatikan bahwa layanan aplikasi tidak menyiratkan penggunaan desain berbasis domain.)Dalam arsitektur heksagonal, lapisan presentasi MVC adalah adaptor antara model domain Anda (logika bisnis) dan GUI. Model domain tidak mengetahui lapisan presentasi, tetapi lapisan presentasi mengetahui model domain.
Solusi ini tentu saja memiliki bagian yang bergerak daripada solusi yang menempatkan logika bisnis di controller dan Anda harus mempertimbangkan kelemahan dan manfaatnya. Alasan saya menyarankan itu adalah karena saya lebih suka menjaga logika bisnis dipisahkan dari lapisan presentasi untuk memerangi kompleksitas. Ini menjadi lebih penting ketika aplikasi tumbuh.
sumber
Tergantung pada apa yang Anda maksud dengan logika bisnis. Setiap "logika" yang memberi makna pada isi model harus dalam model. Dalam pertanyaan yang ditautkan, jawaban dengan suara tertinggi tampaknya mendefinisikan "logika bisnis" sebagai sesuatu yang berkaitan dengan data; ini masuk akal dari sudut pandang bahwa data bisnis adalah bisnisnya!
Saya pernah melihat contoh oleh pencipta Rails (saya pikir) yang sedang melakukan persis ini - tidak memasukkan "logika bisnis" dalam model. Contohnya adalah kelas pengontrol dan metode untuk pendaftaran dan masuk aplikasi - kata sandi yang disediakan dalam plaintext dienkripsi sebelum dimasukkan ke dalam atau ditanyai terhadap model (database.)
Saya tidak bisa memikirkan contoh yang lebih baik dari sesuatu yang bukan logika pengontrol dan yang termasuk langsung dalam model.
Model ini bisa menjadi antarmuka untuk berbagai penyimpanan data, mengurangi masalah portabilitas. Di sinilah orang dapat menemukan kebingungan tentang apakah atau tidak antarmuka model sebenarnya adalah "controller."
Secara umum, controller menghubungkan model dan tampilan (yang merupakan daging-dan-kentang dari aplikasi.) Dalam pengembangan Kakao dapat menjadi sederhana ke titik di mana controller ditangani melalui GUI XCode (objek controller dan binding.)
Bagian "Pola Desain" GoF di MVC, dikutip secara longgar:
MVC adalah tentang UI. Fokusnya adalah pada model dan tampilan - mendefinisikan dan menampilkan data. Perhatikan "berlangganan / beri tahu protokol" - ini adalah tempat controller Anda masuk. Anda dapat membangun semua tampilan yang Anda inginkan; selama mereka mematuhi protokol Anda tidak akan pernah harus menyentuh model atau pengontrol.
Jika Anda berbicara pengembangan web secara khusus, IMHO banyak kerangka kerja web populer cepat dan longgar dengan istilah MVC dan definisi komponennya.
sumber
Mengapa Anda tidak memperkenalkan lapisan layanan?
Maka controller Anda akan 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 lebih baik dan tidak ada dampak pada model dan repositori.
sumber