Untuk aplikasi perusahaan besar, semua orang tahu bahwa dapat menyesuaikan diri dengan perubahan adalah salah satu aspek terpenting dari desain. Saya menggunakan pendekatan berbasis aturan banyak waktu untuk berurusan dengan perubahan logika bisnis, dengan setiap aturan disimpan dalam DB. Hal ini memungkinkan perubahan mudah dilakukan tanpa masuk ke detail yang tidak menyenangkan. Sekarang karena C # tidak dapat Eval ("foo (bar);") ini dapat diselesaikan dengan menggunakan string yang diformat yang disimpan dalam baris yang kemudian diproses dalam JavaScript saat runtime. Ini berfungsi dengan baik, bagaimanapun, itu kurang elegan, dan tidak akan menjadi yang paling menyenangkan bagi orang lain untuk mengambil setelah menjadi warisan.
Apakah ada solusi yang lebih elegan untuk ini? Ketika Anda masuk ke ribuan peraturan yang sering berubah, itu menjadi beban nyata, tetapi ini bukan masalah yang tidak biasa sehingga seseorang tidak memikirkan cara yang lebih baik untuk melakukan ini. Ada saran? Apakah metode saat ini dapat dipertahankan? Apa alternatifnya?
Sunting: Hanya untuk memperjelas, ini adalah aplikasi perusahaan besar, jadi apa pun solusinya bekerja, akan ada banyak orang yang terus-menerus mempertahankan aturan dan datanya (sekitar 10). Juga, perubahan data cukup sering untuk mengatakan bahwa semacam sistem server terpusat pada dasarnya adalah suatu keharusan.
sumber
Jawaban:
Saya akan menggunakan WF atau Drools jika Anda mencoba membuat abstraksi yang bisa dilakukan oleh non-programmer untuk mengembangkan aturan bisnis. Namun, jika Anda berurusan dengan programmer daripada abstraksi WF tidak sepadan dengan waktu yang dibutuhkan untuk mengembangkan solusi, saya gagal melihat nilai tambah untuk investasi Anda.
Basis data adalah cara yang baik untuk mempertahankan aturan yang mungkin banyak berubah, tetapi izinkan saya menyarankan alternatif yang mungkin (belum tentu lebih baik, tetapi alternatif).
1) Pisahkan logika bisnis ke dalam layernya sendiri (dll) - abstraksi bagaimana Anda menyebutnya dengan beberapa antarmuka (lihat strategi dan pola pengamat) yaitu IRuleEvaluator.Evaluate (string myParams).
2) Sekarang Anda dapat membuat kelas diskrit untuk setiap aturan (jika perlu) dan tes unit yang menyertainya.
3) Sekarang untuk Pièce de résistance, pasang segala sesuatu di belakang layar dalam wadah IOC - dll dan instance evaluator aturan itu sendiri. Dengan cara ini evaluator aturan Anda dibangun melalui konfigurasi saat runtime - tidak ada yang dikodekan bersama.
Pendekatan ini sangat dinamis (mungkin terlalu dinamis untuk beberapa selera) - ini akan memungkinkan Anda untuk memiliki unit test yang sebenarnya untuk semua aturan Anda. Jika Anda perlu menggunakan kembali atau mengubah aturan, Anda dapat menjatuhkan DLL baru, mengubah file konfigurasi IOC Anda, memulai kembali dan memverifikasi - atau memutar kembali perubahan jika ada sesuatu yang salah - tanpa memodifikasi kode inti Anda (seperti basis data). Dan tidak seperti database, itu akan menyimpan logika dan kode aplikasi di bawah satu payung, bukannya setengah ditulis dalam C # dan setengah dalam SQL.
sumber
Ada dua kasus aturan yang saya lihat. Dalam kebanyakan kasus aturan itu sendiri tidak sangat fluktuatif (hampir tetap) tetapi data di mana keputusan diambil dapat diubah oleh pengguna bisnis. Dalam hal ini pola desain sederhana untuk merangkum setiap aturan dengan membaca data referensi dari DataBase biasanya cukup. Kemudian berikan frontend untuk mengubah data referensi aturan.
Kasus-kasus lain di mana logika aturan itu sendiri dapat diubah secara dinamis. Salah satu pendekatan adalah menggunakan IronPython atau bahasa dinamis lainnya (dalam .Net 4) untuk mengimplementasikan aturan dan memuatnya secara dinamis pada waktu eksekusi. Ini adalah kompromi karena Anda masih akan meminta programmer untuk mengubah aturan.
Jika Anda benar-benar ingin aturan dapat diedit oleh pengguna bisnis maka membuat DSL untuk domain bisnis Anda adalah pendekatan yang harus diambil. Ini adalah tugas yang rumit.
Akhirnya menggunakan Workflow atau BizTalk dapat membantu jika aturan cocok dengan pola transformasi / orkestrasi.
sumber
Jika Anda merancang aplikasi "berbasis aturan" yang sangat skalabel di mana aturan sering mengalami perubahan dari bisnis, maka pertimbangkan produk-produk BRMS terkemuka di pasar seperti: 1. IBM WODM 2. Penasihat FICO BLAZE 3. Drools (open source)
Saya telah bekerja pada aplikasi komersial besar dengan pendekatan BRMS yang membuatnya sangat terukur dan mudah dirawat dan juga membuatnya sangat fleksibel dengan downtime NOL ke produksi. Itu membuat bisnis bahagia. :)
sumber
Saya berasumsi Anda tidak secara ketat merujuk pada operasi sisi klien dan berada di. Net karena Anda menyebutkan c # ...
Jika Anda berada pada framework 4 Anda memiliki DLR (dynamic language runtime) atau pada framework apa pun jika Anda menyimpan aturan dalam sql Anda juga dapat memprosesnya di sana atau Anda selalu dapat menggunakan linq dinamis dalam> 3 frameworks atau menulis fungsi yang berbeda sebagai rakitan yang dapat dimuat dengan nama saat runtime melalui beban rakitan.
Tidak semua dari mereka elegan dalam banyak kasus, tetapi saya harus menggunakannya setiap saat.
sumber
Satu hal yang terlintas dalam pikiran adalah Windows Workflow Foundation , yang dapat digunakan bersama dengan ASP.NET tetapi akan berjalan di sisi server (jadi mungkin tidak berlaku untuk apa yang Anda lakukan). Di tanah Jawa ada jBPM (manajemen proses bisnis) yang juga berjalan di sisi server.
Karena solusi tersebut mungkin tidak sesuai dengan tagihan untuk Anda , hal terbaik yang harus dilakukan adalah menerapkan aturan-aturan bisnis dalam kode lama (menggunakan javascript, C #, atau apa pun yang terbaik untuk pekerjaan itu) dan berharap bahwa kode pemrograman akan harus diperbarui ketika perubahan desain terjadi. Menggunakan pola desain berorientasi objek akan membuat kode mudah diperpanjang. Jika Anda menulis kode dengan baik, upaya yang diperlukan untuk mengubahnya di masa mendatang harus minimal.
sumber
Jika semua aturan Anda adalah formulir
Anda dapat menggunakan Drools.NET atau implementasi Rete lain seperti iLog.
sumber