Arsitektur MVC - Berapa banyak Pengendali yang saya butuhkan?

54

Saya telah mengkode untuk sementara waktu, tetapi kebanyakan skrip dan aplikasi sederhana. Saya telah pindah ke peran baru di mana ini semua tentang mengembangkan Aplikasi Web dan menggunakan arsitektur MVC yang tepat, jadi saya berusaha keras untuk mempelajari semua itu dengan sangat cepat.

Saya harap pertanyaan ini tidak terlalu mirip dengan " Praktik Terbaik untuk Arsitektur MVC " tetapi karena saya akan melalui beberapa tutorial yang berbeda, saya perhatikan bahwa beberapa memiliki beberapa pengontrol untuk hal yang berbeda.

Berapa banyak pengontrol yang dibutuhkan oleh satu aplikasi web?

Saya menyadari ini akan sulit dijawab tanpa contoh jadi saya akan berikan satu:

Aplikasi:

  1. Pengguna login.
  2. Pengguna dapat melakukan satu dari tiga hal:
    a) Mengunggah file (disimpan dalam database mongodb dengan data meta).
    b) Cari file.
    c) Logout.

Pertanyaan saya bersifat umum, tetapi saya memberikan contoh untuk membantu siapa pun yang mencoba menjawab.

Jeff
sumber
8
Pertanyaan yang sangat bagus.
Daniel Hollinrake

Jawaban:

34

Sebagai contoh Anda, saya akan membuat dua kontroler:

  • Pengontrol Sesi untuk Masuk dan Keluar (buat dan hancurkan sesi untuk tata letak seperti REST)
  • File Controller untuk semua yang ada di file (index = search dan create = upload)

Secara umum pendekatan RESTful di mana Anda berpikir tentang segala sesuatu sebagai sumber daya yang dapat ditampilkan, dibuat, diedit dan dihancurkan memberi Anda ide bagus bagaimana menyusun sesuatu. Seperti yang Anda lihat dari contoh saya, saya tidak terlalu dekat dengan setiap kata kerja di REST.

Anda kemungkinan besar akan membutuhkan lebih banyak pengontrol untuk fungsionalitas lebih lanjut. Misalnya Pengontrol Pengguna tempat pengguna dapat membuat akun baru. Selain itu, Anda membutuhkan antarmuka admin tempat Anda dapat mengedit sumber daya dengan hak istimewa yang lebih tinggi. Dalam kasus seperti itu, sangat umum untuk memiliki hampir setiap pengontrol digandakan.

Perkiraan yang sangat kasar untuk mendapatkan ide awal bisa menjadi satu pengontrol untuk setiap tabel di basis data Anda yang dapat diakses pengguna. Tapi ini benar-benar hanya pengukuran yang sangat kasar.

thorsten müller
sumber
3
Mengambil contoh admin Anda: Apakah pengontrol admin memperluas pengguna umum atau akankah Anda mendefinisikan ulang semua metode? Misalnya, mungkin semua pengguna dapat mengunggah dan mencari tetapi hanya admin yang dapat menghapus. Apakah kelas pengontrol admin mewarisi semua metode pengguna umum?
Jeff
4
Ini benar-benar sangat tergantung pada fungsionalitas aktual. Tapi secara umum saya sederhana menulis controller kedua tanpa warisan sama sekali. Mengikuti prinsip 'pengontrol tipis' seharusnya tidak ada banyak kode di pengontrol. Dan pengontrol admin bisa sangat sederhana. Semua fungsi penting masuk ke dalam model. (mis. jika menghapus pengguna berarti semua file-nya juga harus dihapus maka model menangani ini, tidak ada satu baris untuk ini dalam controller)
thorsten müller
6

Itu sangat tergantung pada aplikasi web. Dalam contoh Anda, satu mungkin sudah cukup. Jika Anda menerapkan aplikasi e-niaga penuh dengan pengiriman, pajak, manajemen inventaris, harga berjenjang, dll., Maka Anda mungkin ingin memiliki beberapa lagi.

Jika controller Anda menderita satu atau lebih bau kode (terutama Kelas Besar atau Objek Dewa ) maka Anda tahu Anda mungkin melewati titik di mana hanya satu yang akan dilakukan.

Dan Pichelman
sumber
5

Ini sangat tergantung pada kebutuhan aplikasi dan arsitektur modul bisnis Anda.

Seorang jenderal aturan praktis , jumlah kontroler diperlukan tergantung pada sejumlah modul dan sub-modul dalam aplikasi Web.

Sebagai pelengkap, akan sangat membantu untuk mengatur pengontrol ke dalam Area . Konsep Area dibangun ke dalam kerangka ASP.NET MVC dan menyederhanakan organisasi pengontrol yang melayani satu modul.

Ada sejumlah diskusi terkait:

EL Yusubov
sumber
1
Referensi yang bagus! Saya pasti akan memeriksanya!
Jeff
Tentu tidak masalah.
EL Yusubov
4

Saya suka cara Apple melakukannya.

Setiap tampilan dikendalikan oleh hanya satu pengendali tampilan. ~ Lihat Panduan Pemrograman Pengontrol untuk iOS

Idenya adalah Anda harus dapat dengan mudah menukar Tampilan. IMO, dengan hanya memiliki 1 Controllerper Viewitu membuatnya lebih mudah untuk mencapai ini. Tapi saya yakin Anda bisa memiliki Pengendali dengan banyak Tampilan dan masih mendesainnya sehingga Anda dapat mengganti Tampilan tanpa mengubah logika program.

Korey Hinton
sumber
Itu poin yang bagus, tetapi apakah Anda perlu memiliki pengontrol untuk setiap tampilan plus yang tambahan untuk menangani hal-hal seperti pengguna? Saya juga menebak jika proyek saya lebih besar akan lebih masuk akal untuk memiliki lebih banyak pengontrol.
Jeff
Model harus melacak pengguna. Jadi beberapa pengontrol semua bisa menggunakan objek model yang sama jika perlu.
Korey Hinton
2
Jadi pengontrol memiliki objek Model dan objek tampilan. Pengontrol meminta objek Model untuk informasi (seperti Informasi Pengguna) dan kemudian mengatur Tampilan yang sesuai. Model harus memiliki sebagian besar logika program sementara Pengontrol hanya memiliki logika untuk dapat berkomunikasi bolak-balik antara Tampilan dan Model.
Korey Hinton
2
Satu pengontrol per tampilan adalah desain yang sangat terbatas, karena pengontrol Anda tidak akan dapat menampilkan model tampilan yang berbeda, untuk kondisi Model yang berbeda.
EL Yusubov
1
@ ElYusubov Saya bisa melihat di mana itu bisa membingungkan. Di iOS setiap tampilan hanya memiliki satu pengontrol tampilan dan setiap pengontrol tampilan hanya memiliki 1 tampilan aktif (dan tampilan tersebut dapat memiliki sub-tampilan) tetapi pengontrol tampilan tersebut juga dapat berisi referensi ke sejumlah tampilan.
Korey Hinton
2

Salah satu contoh yang saya suka adalah memikirkan termostat. Thermostat adalah visual yang bagus untuk melihat pola MVC.


Pada termostat analog yang lebih lama, Anda dapat menggambarkan hal-hal seperti ini:

Lihat - Pembaca suhu, yang menampilkan suhu saat ini.

Pengontrol - Tombol putar, tempat Anda mengubah suhu

Model - Bagian dalam yang dipanggil oleh pengontrol yang menyebabkan suhu berubah.


Anda harus selalu mematuhi desain yang memungkinkan kopling longgar dan model batas dan pengontrol terkait untuk satu tugas , dan Anda harus menggunakan sebanyak mungkin modul / pengontrol yang Anda butuhkan . Tergantung pada ukuran aplikasi Anda, Anda mungkin memiliki pandangan yang jauh lebih sedikit daripada yang Anda lakukan model dan pengendali. Ini diharapkan dengan aplikasi ukuran besar. Pemrograman Berorientasi Objek Bagus ditandai dengan kopling longgar, enkapsulasi, pewarisan, dan polimorfisme. Tidak semua bahasa mendukung polimorfisme dengan tingkat yang sama (fungsi, metode, overloading / overriding operator).

Jika Anda ingin memiliki pemahaman yang lebih baik dalam menggunakan arsitektur MVC dengan benar, bacalah perangkat lunak "Pola Desain: Elemen yang Dapat Digunakan Kembali ..." yang menggunakan C ++ dan SmallTalk sebagai contoh kode. Buku ini bukan alfa dan omega, tapi ini pasti awal!

Semoga berhasil!

Charles Addis
sumber
1

Saya berasumsi bahwa contoh Anda akan berkembang menjadi sistem yang kompleks.

Aplikasi:

Pengguna log in:

  • LoginController

Tanggung jawabnya adalah menangani login, mengarahkan kembali, atau memberi tahu pengguna tentang hasilnya.

Unggah file

  • UploadController

Saya berasumsi di sini bahwa Anda ingin mengunggah semua jenis file. Jika nanti Anda memutuskan untuk mengunggah MP3 dan PDF, maka saya akan memiliki basis UploadController, MP3UploadController, dan PDFUploadController.

Cari file.

  • SearchFileController

Ini sudah cukup untuk persyaratan dasar. Anda dapat memiliki beberapa pengontrol pencarian di kemudian hari tergantung pada seberapa rumitnya logika pencarian. Hal terakhir yang ingin Anda miliki adalah SearchController tunggal dengan 20 metode tindakan melakukan pencarian yang berbeda.

Keluar.

-LogoutController .

Orang mungkin menganggap ini sebagai pembunuhan berlebihan, tapi saya rasa itu tidak berlebihan. Saya pikir itu bersih dan dipisahkan dengan baik.

Jika saya melihat struktur proyek ini, saya akan langsung tahu apa fungsinya dan bagaimana strukturnya. Untuk mengambil langkah lebih jauh, saya akan menempatkan LoginControllerdan LogoutControllerke area yang terpisah.

Saya telah mengembangkan sesuatu seperti ini sebelumnya dan bekerja dengan sangat baik.

CodeART
sumber
Terima kasih atas masukannya! Punya kode kerja? terjebak pada beberapa hal.
Jeff
Masalah apa yang kamu alami?
CodeART
Saya dapat mengunggah subjek dan tanggal (dalam format string) tetapi tidak dapat mengunggah file itu sendiri (lihat stackoverflow.com/questions/18344614/… ).
Jeff
Saya seorang pengembang NET. Maaf saya tidak bisa membantu Anda.
CodeART
1

Sebagian besar kode Anda akan terjadi di lapisan bisnis, bukan? Jika itu yang terjadi maka semua yang Anda lakukan di controller Anda adalah mengembalikan data ke tampilan.

Tidak begitu yakin apakah saya penggemar memisahkan pengontrol menjadi subtipe. Sementara Anda harus mempertahankan pemisahan kekhawatiran, saya pikir subtipe akan berjalan terlalu jauh. Anda juga perlu berhati-hati dalam kasus di mana benda berat diinisialisasi dalam konstruktor atau pengontrol. Sebagai contoh: dalam contoh Anda, Anda ingin benda berat, hanya digunakan untuk mencari / mengunggah file yang akan dirilis ketika pengguna ada di halaman login.

Lebih baik memiliki pengontrol per unit logika, misalnya AccountController (login, registrasi, logout), FileController (pencarian, unggah) dan sebagainya.

harsha
sumber
0

Secara umum Anda dapat mengatakan bahwa setiap MODEL memiliki CONTROLLER dan VIEW khusus. Dengan mengatakan jendral saya maksudkan bahwa ini adalah praktik terbaik.

Aspek aplikasi (seperti manajemen pengguna) harus diterjemahkan ke layanan aplikasi dan perlu dipanggil oleh controller itu sendiri, atau untuk membungkus controller Anda (menggunakan atribut yang membuat fungsi controller "terlihat" sesuai dengan permintaan peran pengguna, misalnya).

Ingat bahwa semua pengontrol pada dasarnya harus menangani operasi CRUD atas model dan menggunakan tampilan berbeda untuk filter yang berbeda.

Menurut pendapat saya salah satu keuntungan utama MVC sebagai polanya adalah memberikan cara terbaik untuk mengikat model dan pandangan.

Tentang contoh yang Anda tambahkan: Saya akan membuat 2 pengontrol: satu untuk semua operasi login pengguna (daftar, masuk, keluar dll) dan yang kedua untuk operasi file (Unggah dan cari). perhatikan bahwa yang pertama juga harus didukung dengan beberapa Aspek terkait dengan fungsi Login dan yang kedua adalah pengontrol biasa

Saturn Technologies
sumber
tanpa penjelasan, jawaban ini dapat menjadi sia-sia jika ada orang yang memposting pendapat yang berbeda. Misalnya, jika seseorang memposting klaim seperti "Mengelola peran pengguna dan otorisasi tidak boleh di atas pengontrol" , bagaimana jawaban ini membantu pembaca untuk memilih dua pendapat yang berlawanan? Pertimbangkan untuk mengeditnya menjadi bentuk yang lebih baik
agust
1
@gnat Saya menerima komentar Anda, lihat jawaban yang diedit
Saturn Technologies