Saya sedang membangun aplikasi web menggunakan pola MVC. Mengikuti jenis arsitektur ini kita dapat melihat bahwa semua metode yang digunakan untuk berinteraksi dengan basis data diimplementasikan dalam model .
Tetapi apa yang terjadi jika saya harus memanggil layanan yang diekspos oleh orang lain di web? Misalnya, saya ingin mengakses API Facebook untuk mendapatkan semua pengikut halaman saya, jadi, di mana saya meletakkan metode ini?
Jelas tampilan bukan ide yang baik karena modul ini didedikasikan untuk presentasi, controller tidak boleh digunakan untuk mengambil data tetapi model ini biasanya hanya didedikasikan untuk interaksi dengan database.
Jadi, bisakah Anda memberi saya beberapa petunjuk tentang itu? Dan tolong, bisakah Anda memberi tahu saya jika saya membuat beberapa kesalahan tentang arsitektur MVC?
Jawaban:
Model tidak terbatas pada interaksi dengan database, model bertanggung jawab untuk mendapatkan dan memanipulasi data.
Jadi, untuk tampilan dan pengontrol Anda, seharusnya tidak ada bedanya, jika data berasal dari database atau dari layanan web atau bahkan benar-benar acak, oleh karena itu Anda harus melakukannya dalam model.
MVC adalah pola presentasi, yang hanya memisahkan lapisan representasi yang berbeda.
Itu tidak berarti, bahwa model harus berantakan seragam kode spaghetti. Model Anda sendiri dapat berlapis juga, tetapi controller tidak harus tahu, dari mana data berasal.
Metode publik dalam model Anda dapat disusun seperti ini (Pseudo-code), yang dapat dipanggil oleh controller Anda:
WebService
danORM
mungkin harus berupa instance dari antarmuka yang dapat diganti dengan mengejek melalui injeksi dependensi, tetapi pengontrol dan tampilan Anda tidak harus berubah untuk tujuan pengujian.sumber
Ada kesalahpahaman (disengaja?) Yang umum tentang apa itu M, V, dan C. Bukan tentang peran mereka ambil, tapi apa yang mereka.
Dalam definisi GUI desktop asli dari MVC, mereka adalah modul . Biasanya suatu aplikasi memiliki beberapa dari mereka, kadang-kadang bekerja dalam kembar tiga, kadang-kadang memiliki beragam pandangan dan model yang dapat dicampurkan dan disesuaikan oleh beberapa pengontrol.
Dalam kerangka kerja web, OTOH, mereka cenderung dilihat sebagai lapisan , di mana mereka hanya satu dari masing-masing dan sebagian besar berurusan pada mencakup beberapa tingkat abstraksi sub-pusat: "lapisan model mengabstraksi database", "lapisan tampilan mengimplementasikan presentasi", "controller melihat layer memproses input pengguna ".
Jadi, saya akan mengatakan bahwa Anda sudah memiliki sebuah model yang didedikasikan untuk interaksi dengan database, dan sekarang hanya perlu membuat lagi model untuk menangani sumber API Anda. Jika Anda membuat mereka semirip mungkin, maka sebagian besar controller dan kode tampilan dapat bekerja dengan baik dengan kedua model.
sumber
Bagian dari kesulitan dengan setiap diskusi tentang MVC adalah bahwa kelompok-kelompok yang berbeda telah mengkooptasi untuk memiliki arti yang berbeda. Implementasi MVC yang digunakan dalam, katakanlah, aplikasi Rails, akan hampir tidak dapat dikenali oleh seseorang yang menulis aplikasi Swing. Sejauh MVC masih merupakan hal yang terdefinisi dengan baik, ini lebih merupakan seperangkat prinsip panduan (pisahkan aplikasi inti dari representasi visualnya, berikan mekanisme yang fleksibel untuk memungkinkan keduanya untuk disatukan), yang dapat diimplementasikan dalam berbagai cara.
Memang, ada kecenderungan memberikan berbagai desain turunan MVC nama yang berbeda (lihat artikel ini oleh Martin Fowler untuk beberapa diskusi tentang ini), atau bahkan menyerah pada penamaan yang tepat - misalnya, AngularJS menggambarkan dirinya sebagai Model-View-Apapun kerangka.
Jadi, sulit untuk menjawab tanpa mengetahui versi "MVC" yang Anda gunakan. Namun, permintaan API biasanya akan menjadi bagian dari aplikasi inti (bagian yang tidak boleh berubah jika Anda memutuskan untuk menggunakan representasi visual yang berbeda), yang dalam banyak implementasi akan terkandung sepenuhnya dalam model.
sumber
Di sini , model digambarkan seperti ini:
Saya akan mengatakan bahwa controller baik termasuk logika memanggil layanan atau memanggil
Service
objek terpisah . Jika layanan terpisah, Anda dapat lebih mudah membuat tes, katakanlah, jika tidak ada koneksi ke layanan melalui jaringan, beberapaTestService
dapat memberikan tanggapan dariService
lokal.Periksa juga jawaban ini yang menyarankan Pengontrol memanggil layanan.
sumber
Model Anda tidak boleh mengandung kode aktual, dan harus dilihat sebagai lebih dari pesan atau struct yang digunakan untuk mengelola konten yang dimanipulasi oleh pengontrol dan ditampilkan oleh tampilan.
Pengontrol Anda harus bertanggung jawab untuk menghubungi API, basis data, layanan, dll ... yang meminta perubahan dan mengelola setiap pembaruan yang diperlukan untuk model.
Seluruh kekuatan pola MVC adalah bahwa ia memisahkan logika (pengontrol) dari tampilan dan keadaan (model). Dengan melakukan itu, Anda sekarang dijamin bahwa hanya kode dalam pengontrol yang dapat membuat efek samping karena tampilan dan model tidak diizinkan untuk melakukan perubahan.
Ini juga memungkinkan penggunaan kembali kode yang lebih baik karena model dapat dibagi antara berbagai pengontrol dan tampilan.
sumber
Mungkin jauh di sini, tapi ini yang saya rasakan tentang WebApps dan bekerja dengan API kompleks [kompleks] dalam banyak kasus:
Saya akan menjadikannya kelas (yaitu, perpustakaan metode mitigasi data) alih-alih model (yaitu, tumpukan fungsi mitigasi data). Sepertinya itu akan bertindak lebih transparan, lebih logika / skema agnostik, dan Anda bisa menggunakannya di mana saja tanpa memuat-> memanggil model / controller itu sendiri setiap kali Anda ingin menggunakannya. Logikanya masih terpisah, datapoint masih fleksibel, dan tampaknya lebih terbuka untuk interoperabilitas dalam kasus-kasus aneh seperti menumpuk clientAJAX-> appJSON-> appLIB-> remoteAPI-> remoteJSON dll untuk polling titik akhir secara tidak langsung.
sumber