Berapa banyak logika bisnis yang harus diizinkan ada di lapisan pengontrol?

39

Terkadang kami memiliki beberapa logika bisnis yang diwakili dalam kode pengontrol aplikasi kami. Biasanya ini adalah logika yang membedakan metode apa untuk memanggil dari model dan / atau argumen apa yang dilewati.

Contoh lain dari ini adalah seperangkat fungsi utilitas yang ada di controller yang dapat bekerja untuk memformat atau membersihkan data yang dikembalikan dari model, sesuai dengan seperangkat aturan bisnis.

Ini bekerja, tetapi saya bertanya-tanya apakah ini menggoda dengan bencana. Jika ada logika bisnis yang dibagi antara pengontrol dan model, dua lapisan tidak lagi dapat dipisahkan, dan seseorang yang mewarisi kode mungkin bingung oleh ketidakseimbangan ini di lokasi kode terkait logika bisnis.

Pertanyaan saya adalah berapa banyak logika bisnis yang harus diizinkan di controller dan dalam keadaan apa, jika ada?

ubur-ubur
sumber
1
Pertanyaan bagus Saya berharap dapat melihat opini orang.
Nathan Taylor

Jawaban:

20

Idealnya tidak ada

Tapi itu tidak selalu mungkin. Saya tidak bisa memberikan angka keras seperti 20% atau 10 baris, yang subjektif sampai tidak bisa dijawab. Saya bisa menggambarkan bagaimana saya menggunakan pola dan keadaan desain yang mengharuskan saya sedikit menekuknya.

Dalam pikiran saya sepenuhnya tergantung pada tujuan aplikasi. Membangun api REST sederhana untuk dikirim? Lupakan pemisahan bersih atau bahkan sebuah pola. Anda dapat membuat versi yang berfungsi dalam waktu kurang dari satu jam. Membangun sesuatu yang lebih besar? Mungkin yang terbaik untuk mengerjakannya.

Membangun sistem yang terkandung secara individual adalah tujuannya. Jika Anda mulai menulis logika bisnis yang spesifik tentang bagaimana dua sistem berinteraksi itu adalah masalah. Tanpa melihat lebih jauh ke dalamnya saya tidak bisa memberikan pendapat.

Pola desain adalah cetakan, beberapa suka benar-benar mematuhinya berdasarkan kode prinsip dan ditulis dengan baik. Mematuhi pola secara ketat mungkin tidak akan memberi Anda kode yang buruk , tetapi itu bisa memakan waktu lebih lama dan menyebabkan Anda menulis lebih banyak kode.

Pola desain fleksibel, sesuaikan dengan kebutuhan Anda . Tekuk mereka terlalu banyak dan mereka patah. Ketahui apa yang Anda butuhkan dan pilih pola desain yang paling dekat dengan itu.

Josh K.
sumber
10

Sesedikit mungkin. Lebih disukai tidak ada.

Pengontrol harus peduli dengan menerima permintaan, meminta layanan domain yang benar untuk memproses permintaan, dan memberikan tanggapan ke tampilan yang benar.

Dalam proses itu, semua "logika bisnis" harus ada di layanan domain.

Jika Anda memiliki fungsionalitas yang mengambil objek domain dan membuat viewmodels dari mereka, maka itu bisa hidup berdampingan dengan controller. Tapi itu harus kode yang ada hanya demi tampilan yang sesuai. Jika ada aturan tingkat bisnis tentang sanitasi data, itu harus ada di tingkat domain / layanan Anda (dengan tes unit yang sesuai).

Eric King
sumber
10

Istilah "logika bisnis" adalah istilah yang sering membingungkan karena orang memiliki pendapat berbeda tentang apa artinya ini. Dalam pandangan saya, istilah "logika bisnis" mencakup dua bidang

  • Logika Domain
  • Logika Aplikasi

Logika Domain adalah logika yang terkait dengan bidang inti yang terkait dengan bisnis Anda, jadi jika menulis aplikasi untuk akuntan, maka aturan pajak, aturan pembukuan, dll. Adalah bagian dari logika domain.

Logika aplikasi adalah logika yang terkait dengan fakta bahwa Anda menjalankan program komputer. Ini bisa berupa barang-barang seperti ekspor impor CSV, penyihir, dll. Bisa juga berisi hal-hal seperti membuat email kata sandi yang terlupakan.

Jenis "logika bisnis" yang dapat Anda tempatkan di lapisan pengontrol adalah Logika aplikasi. Mungkin tidak semua logika aplikasi harus masuk ke sana. Tetapi Anda tidak boleh menempatkan logika domain di lapisan pengontrol. Itu jelas harus di lapisan domain.

Anda berbicara tentang logika untuk memformat atau membersihkan data. Pemformatan pasti merupakan logika aplikasi. Sanitasi di sisi lain bisa menjadi domain logika, jika membersihkan data didasarkan pada aturan domain. Itu tergantung pada konteksnya.

Pete
sumber
4

Pengontrol harus sangat ringan pada logika domain.

Pengontrol harus mendelegasikan tugas-tugas seperti mengambil catatan dari penyimpanan data dengan cara lapisan layanan / repositori yang diabstraksikan dan meneruskan data kembali ke penyimpanan data dengan layanan yang sama (atau terkait). Adapun mekanisme dan kerja yang lebih baik antara operasi-operasi itu, biasanya mereka berada di tempat lain selain controller.

Saya sering menemukan diri saya menambahkan metode sanitasi data kecil ke pengontrol saya yang menyimpan data kembali ke toko dan meskipun ini adalah solusi yang efektif, itu tidak cocok dengan peran pengontrol yang dimaksud. Idealnya, apa pun yang akan memodifikasi, memvalidasi, atau menguraikan model Anda harus terjadi sangat dekat dengan - jika tidak di dalam - model itu sendiri. Misalnya, jika Anda perlu 'membersihkan' objek model sebelum Anda menyimpannya, pertimbangkan untuk menggunakan metode SanitizeInputs () pada model atau sebagai bagian dari layanan yang menangani penyimpanan model.

Nathan Taylor
sumber
3

Dari sudut pandang pragmatis saya telah menemukan bahwa Anda berakhir dengan logika di controller Anda atau perilaku controller dalam model Anda ketika Anda mencoba untuk melakukan sesuatu yang tidak ada pendekatan pola-compliant yang baik untuk. Ragu jadi jika Anda menulis aplikasi yang tidak memiliki infrastruktur besar di belakangnya.

Anda dapat memilih salah satu cara, tetapi saya biasanya mencoba untuk berpikir jika bit aneh cenderung muncul di lebih dari satu aksi pengontrol, jika demikian dalam model. Jika itu tidak jelas, saya mencoba berpikir apakah itu lebih "pas" di satu tempat daripada yang lain. Gagal yang biasanya saya masukkan ke dalam model hanya agar tidak keluar dari pengontrol (preferensi pribadi untuk pengontrol yang lebih kecil dan objek data yang lebih kuat, YMMV)

Pilihan ketiga adalah merujuk item utilitas sebagai kelas utilitas terpisah, tetapi itu agak bertentangan dengan pola juga menurut banyak orang.

Juga, hanya karena Anda tidak benar-benar mengikuti pola Anda tidak perlu menggoda dengan bencana. Kecuali Anda benar-benar mengharapkan sejumlah besar kode digunakan kembali dari proyek ini, saya akan jauh lebih khawatir tentang proyek yang konsisten dengan dirinya sendiri (yaitu: jangan flip-flop di mana Anda meletakkan bit ini setelah Anda memilih lokasi) daripada menulis ulang bahwa untuk beberapa alasan ingin menyelamatkan bagian dari proyek. Dokumen / komentar di mana & mengapa Anda menyimpang dari pola umum dan menentukan pola yang diharapkan untuk aplikasi ini.

MVC adalah penyimpangan dari pola yang telah mapan itu sendiri pada satu titik.

Tagihan
sumber
3

Seperti banyak konsep menarik lainnya dalam pemrograman, MVC adalah paradigma yang kuat untuk membawa struktur dan fokus pada keluarga yang dekat atau strategi serupa untuk mengimplementasikan skenario tertentu.

Seperti banyak konsep pemrograman lainnya, MVC menyederhanakan kenyataan, membuang detail kecil dan menyediakan model rangka gambar kasar untuk diikuti. Seperti banyak penyederhanaan lain dari realitas, ia bekerja dengan membawa struktur ke dalam kekacauan seperti yang terlihat oleh pikiran manusia.

Namun, seperti banyak konsep pemrograman lainnya, MVS hanyalah penyederhanaan kenyataan. Itu tidak sempurna dan tidak menyeluruh. Itulah sebabnya mengapa tidak mungkin untuk memasukkan skenario dunia nyata ke dalam model yang disederhanakan. Maka timbul banyak pertanyaan yang mirip dengan yang satu ini.

  • Berapa banyak logika yang harus masuk ke controller?

  • Apakah pandangan harus mengandung logika kondisional?

  • Apakah suatu model harus mengandung data tambahan yang tidak ditemukan secara langsung dalam entitas bisnis?

Ini semua adalah pertanyaan yang lahir dalam upaya untuk menyesuaikan kode agar sesuai dengan ide konseptual MVC secara tepat dan lengkap.

Jawaban saya kepada Anda adalah jangan mencoba. MVC menyediakan struktur. Bangun aplikasi Anda di sekitar yayasan ini tetapi jangan berharap itu cocok dengan sempurna. Akan ada penyimpangan, itu normal. Perhatikan saja agar mereka tetap terkendali.


sumber