Saya telah mengembangkan untuk beberapa proyek aplikasi web selama 3 tahun terakhir, baik pribadi maupun di tempat kerja, dan sepertinya saya tidak tahu apakah mungkin untuk setidaknya beberapa logika bisnis tidak berakhir di lapisan tampilan aplikasi.
Dalam kebanyakan kasus akan ada masalah seperti "Jika pengguna telah memilih opsi x maka aplikasi harus memungkinkannya untuk memberikan info untuk y, jika tidak maka ia harus menyediakan info z". Atau lakukan beberapa operasi AJAX yang harus menerapkan beberapa perubahan pada model tetapi BUKAN komit sampai pengguna secara eksplisit memintanya. Ini adalah beberapa masalah paling sederhana yang saya temui dan saya tidak tahu bagaimana mungkin untuk menghindari logika kompleks dalam tampilan.
Sebagian besar buku yang saya baca menggambarkan MVC biasanya menampilkan beberapa contoh yang sangat sepele, seperti operasi CRUD yang hanya memperbarui data di server dan menampilkannya, tetapi CRUD tidak demikian pada kebanyakan aplikasi kaya.
Apakah mungkin untuk mencapai memiliki pandangan tanpa logika bisnis sama sekali?
sumber
Jawaban:
Saya menemukan ini pertanyaan yang sulit untuk dijawab. (Pertanyaan yang memancing pikiran!)
Secara teoritis, ya, tergantung pada apa yang kami definisikan sebagai logika bisnis. Dalam praktiknya, pemisahan yang ketat menjadi jauh lebih sulit, dan mungkin bahkan tidak diinginkan.
Pemisahan masalah adalah cara yang bagus untuk berpikir tentang membangun perangkat lunak: ini memberi Anda ide tentang di mana menempatkan kode, dan itu memberi pengelola gagasan yang bagus tentang ke mana harus mencari kode. Saya akan berpendapat bahwa pada dasarnya mustahil bagi manusia untuk membangun perangkat lunak yang berfungsi tanpa pemisahan kekhawatiran. Kami membutuhkan ini.
Tetapi, seperti semua hal lainnya, ada pertukaran. Lokasi konseptual terbaik mungkin bukan lokasi terbaik karena alasan lain. Mungkin ada terlalu banyak beban di server web Anda, jadi Anda menambahkan beberapa javascript ke halaman web Anda untuk menangkap kesalahan input yang mudah sebelum mereka menekan server Anda; sekarang Anda memiliki beberapa logika bisnis dalam pandangan Anda.
Pandangan itu sendiri, dengan sendirinya, tidak memiliki nilai tanpa logika bisnis. Dan agar efektif dalam penggunaan dan tampilan, secara implisit atau eksplisit, pandangan akan memiliki pengetahuan tentang proses bisnis yang terjadi di belakangnya. Kita dapat membatasi jumlah pengetahuan itu, dan kita dapat menutup bagian-bagiannya, tetapi pertimbangan praktis sering kali memaksa kita untuk 'memecah' pemisahan masalah.
sumber
The best conceptual location may not be the best location for other reasons
: Bravo !!Saya biasanya melakukan ini: jika pengguna telah memilih opsi x, lihat panggilan
Kemudian controller mengaktifkan y pada tampilan:
Tampilan memberi tahu pengontrol tentang apa yang terjadi tanpa memutuskan apa pun.
sumber
Saya mempertanyakan apakah contoh yang Anda jelaskan benar-benar logika bisnis. Contoh yang Anda gambarkan adalah operasi yang dapat dilakukan pada sistem. Ini adalah bagaimana Anda memilih untuk menyajikan pilihan kepada pengguna yang mungkin memberi kesan bahwa Anda melakukan logika bisnis dalam tampilan.
Dari sudut pandang "View" hanya menyediakan InfoY atau InfoZ ke sistem. Hanya karena implementasi UI Anda melakukan beberapa pembaruan dinamis berdasarkan pilihan operator (mis. Mengaktifkan InfoY atau InfoZ) tidak membuat logika bisnis fungsionalitas. Ini benar-benar melihat logika implementasi. Anda bisa saja memberikan operator pilihan untuk memasuki InfoY atau InfoZ tanpa seluruh hal yang memungkinkan. Dalam konteks itu, apakah Anda masih menganggapnya sebagai logika bisnis? Jika tidak, maka hal yang sama berlaku untuk bidang info yang mengaktifkan / menonaktifkan secara dinamis.
Sama berlaku untuk contoh komit. Ini adalah 2 operasi terpisah yang diperlukan sistem untuk bekerja dengan baik. Tampilan Anda harus dapat memulai tindakan yang tepat untuk melakukan fungsi yang diinginkan. Apakah mengetahui cara menggunakan sistem Anda berarti bahwa logika bisnis bocor? Saya bisa melihat bagaimana seseorang bisa mengatakan ya tetapi jika Anda percaya seperti itu maka kenyataannya adalah bahwa tidak ada pemisahan logika bisnis dari apa pun. Anda harus tahu apa yang dilakukan sistem / bekerja untuk mencapai apa pun yang bermakna. Kalau tidak, akan sangat mudah untuk membuat View dan Controller generik tunggal yang bekerja dengan setiap aplikasi MVC yang mungkin. Yang kita tahu tidak mungkin.
Intinya, saya pikir definisi Anda tentang logika bisnis tidak sama dengan definisi orang lain.
sumber
Saya bekerja dengan cara ini (Struts2 + Hibernate):
Tindakan Struts saya hanya bertanggung jawab untuk menampilkan informasi di peramban web. Tidak berpikir.
Pengguna -> Tindakan -> Layanan -> Repositori -> Akses Data
Atau:
Saya Ingin Melihat -> Cara melihat -> Apa yang Harus Dilakukan -> Cara Mendapatkan -> Di mana mendapatkan
Jadi, di lapisan pertama (tampilan) saya punya sesuatu seperti:
Seperti yang Anda lihat, "pandangan" saya tidak berpikir. Itu meminta layanan (untuk mengelola kursus) kursus tertentu. Layanan itu dapat melakukan banyak hal lebih banyak, seperti laporan, seraches, dan sebagainya. Hasilnya selalu berupa daftar atau objek tertentu (seperti contoh). Layanan adalah mesin nyata, menerapkan aturan dan mengakses Repositori (untuk mengelola data).
Jadi, jika saya meletakkan Layanan, Gudang, dan DAOS saya di perpustakaan yang berbeda, saya dapat menggunakannya bahkan dalam program berbasis teks, atau sistem desktop berbasis Window dengan tidak mengubah apa pun.
Layanan tahu apa yang harus dilakukan, tetapi tidak tahu bagaimana menunjukkannya. Pandangan tahu bagaimana menunjukkan, tetapi tidak tahu apa yang harus dilakukan. Sama dengan Layanan / Repositori: Layanan mengirim dan meminta data, tetapi tidak tahu di mana data itu dan bagaimana cara membawanya. Repositori "membuat" data mentah untuk membeli objek agar Layanan dapat bekerja dengannya.
Tetapi Repositori tidak tahu apa-apa tentang database. Jenis basis data (MySQL, PostgreSQL, ...) berkaitan dengan DAO.
Anda dapat mengubah DAO jika Anda ingin mengubah database dan itu tidak akan mempengaruhi lapisan atas. Anda dapat mengubah Repositori jika Anda ingin memperbarui manajemen data Anda, tetapi ini tidak boleh memengaruhi DAO dan lapisan atas. Anda dapat mengubah Layanan jika Anda ingin mengubah logika Anda, tetapi ini tidak boleh mengacaukan dengan lapisan di atas atau di bawah.
Dan Anda dapat mengubah apa pun yang terlihat, bahkan teknologi (web, desktop, teks) tetapi ini tidak boleh menyiratkan sentuhan apa pun di bawah.
Logika bisnis adalah Layanan. Tetapi cara berinteraksi dengan ini adalah dengan melihat. Tombol apa yang harus ditunjukkan sekarang? Bisakah pengguna melihat tautan ini? Pikirkan sistem Anda adalah program berbasis konsol: Anda harus menolak jika pengguna yang salah memilih
#> myprogram -CourseService -option=getCourse -idCourse=234
atau menghentikannya untuk menekan tombol untuk menulis perintah ini?Berbicara dalam sistem berbasis web (Struts + JavaEE) Saya memiliki paket pengontrol GUI terpisah. Dalam Action view saya memberikan pengguna yang dicatat dan kelas memberi saya tombol (atau elemen antarmuka yang saya inginkan).
Dan
Ingatlah untuk menghindari hal ini dari layanan. Ini adalah hal-hal LIHAT. Simpan di Struts Actions. Setiap interaksi antarmuka harus sepenuhnya terpisah dari kode bisnis nyata, jadi jika Anda mem-porting sistem Anda, akan mudah memotong apa yang tidak Anda perlukan lagi.
sumber
Itu logika untuk model, bukan tampilan. Ini mungkin "view-model", dibuat khusus untuk mendukung UI, tetapi masih model logika. Urutan kontrol adalah:
inputY.enable(model.yAllowed()); inputZ.enable(model.zAllowed());
UI View Controller Model |.checkbox X checked.> | | | | | .. X selected ...>| | | | |-----> set X ------->| | | | | | |< .............state changed ............| | | | | | |-------------- Get state --------------->| | | | | | |<----------- new state ------------------| | <-- UI updates ------|
Ini adalah pola MVC klasik. Dimungkinkan untuk sepenuhnya menguji logika model yang terpisah dari UI. Kontroler dan tampilan sangat tipis dan mudah diuji.=== Menanggapi Dunk ===
Model dalam pola UI MVC (biasanya) bukan model objek bisnis. Itu hanya model untuk negara UI. Dalam aplikasi desktop, ini dapat menyimpan referensi ke beberapa model bisnis. Dalam aplikasi Web 2.0, ini adalah kelas Javascript yang menampung keadaan UI, dan berkomunikasi melalui AJAX ke server. Sangat penting untuk dapat menulis uji unit hands-off model negara UI, karena di situlah sebagian besar bug UI ditemukan. Tampilan dan pengontrol harus merupakan konektor yang sangat tipis.
sumber
Logika bisnis lebih mirip
If X then return InfoType.Y
, maka UI akan menampilkan bidang berdasarkan hasil yang dikembalikan oleh domain.Jika UI memerlukan logika bisnis, maka delegasikan pilihan ke domain. UI hanya akan bertindak berdasarkan keputusan tersebut.
sumber
Ada input yang memiliki nilai persyaratan berdasarkan persyaratan. Di sebagian besar lingkungan GUI, ada banyak pilihan tentang cara menangani input terutama pengaturan waktu. Opsi yang dipilih (dalam hal ini x) perlu diproses, jadi kirim ke pengontrol. Kirim ketika pengguna meninggalkan kolom input. Tunggu sampai mereka mengklik objek lain atau tekan save. Tidak masalah dengan logika bisnis. Dengan satu atau lain cara, pengontrol akan membuat keputusan dan perlu memberi tahu pandangan, "y diperlukan".
Bagaimana pandangan menginterpretasikan atau mengimplementasikan ini tidak terlalu penting dari sudut pandang logika bisnis. Buat bidang yang wajib diisi ya. Miliki pop-up atau tembak meriam dan beri tahu pengguna untuk memasukkan Anda atau hanya bersikap keras kepala dan jangan biarkan pengguna yang malang itu melakukan apa pun sampai ia mengetahui hal ini.
Dan hanya berpikir, semua ini mungkin terjadi karena controller mencoba untuk menyimpan dan tidak memasukkan nilai untuk bidang yang diperlukan dalam database dan murni menanggapi kesalahan database. Tidak masalah sejauh menyangkut pandangan.
Sesuatu seperti nilai yang diperlukan atau terbatas untuk input dapat ditangani di banyak tempat. Jika Anda "hanya" mengatasinya dalam tampilan, banyak pengembang akan melihat ini sebagai masalah ketika ada beberapa antarmuka pengguna. Inilah sebabnya mengapa logika bisnis dapat dibuat dan diuji tanpa banyak antarmuka pengguna atau bahkan database. Anda bahkan tidak perlu memiliki situs web.
sumber