Moteur de règles for.NET
nous avons une exigence d'affaires de laisser les utilisateurs d'électricité modifier les règles pour les taux d'assurance et les inscriptions. Nous avons besoin d'un ui web qui leur permet de dire "ce produit est seulement pour les gens <55 à moins qu'ils soient du Texas et possèdent un caniche" ou autre. Edit pour la clarification: l'Assurance est fou. Les règles diffèrent d'un produit à un état à l'autre et changent constamment.
nous avons regardé un couple de moteurs de règles, mais les commerciaux sont 100K+ et les open source ceux ne semblent pas de messagerie unifiée, fini. Le flux de travail de Windows fonctionne si nous créons les règles à l'avance, mais les construire à l'exécution semble exiger de contourner la sécurité d'accès au code. C'est effrayant.
sommes-nous fous de réinventer cette roue? Y a-t-il une meilleure alternative pour .net?
7 réponses
Je ne pense pas que l'évaluation des règles sera le défi. Je pense que le plus grand défi est de analyser les règles que l'utilisateur peut entrer. Pour analyser les règles, vous devriez envisager de créer un certain DSL. Martin Fowler a quelques réflexions à propos de ce ici . Alors peut-être ANTLR alors pourrait valoir le coup d'oeil.
pour la partie évaluation: je travaille dans l'industrie de la finance et il y a aussi des règles compliquées, mais je n'ai jamais eu à utiliser un moteur de règles. Les moyens d'un langage de programmation impératif (dans mon cas C#) étaient (jusqu'à présent) suffisants. Pour certaines occasions, j'envisageais un moteur de règles, mais les risques technologiques(*) d'un moteur de règles étaient toujours plus élevés que les avantages escomptés. Les règles n'étaient (jusqu'à présent) jamais aussi compliquées, Ce modèle de programmation déclarative était nécessaire.
Si vous utilisez un langage orienté objet, vous pouvez essayer d'appliquer les Spécification Du Modèle . Eric Evans et Martin Fowler ont écrit une explication plus détaillée, que vous pouvez trouver ici . Vous pouvez aussi écrire votre propre moteur de règle simple.
( * ) note de bas de page: D'une manière ou d'une autre, vous aurez besoin d'intégrer le moteur de règles dans votre application qui est très probablement écrite dans un langage orienté objet. Il y a donc des limites technologiques que vous devez franchir. Chaque pont est un risque technologique. J'avais un jour été témoin d'une application Web Java utilisant un moteur de règles écrit en C. Au début, le programme C produisait parfois des dumps de base et détruisait toute l'application web.
je pense qu'avec la plupart des décisions de faire vs acheter c'est toujours un compromis que vous avez à faire personnellement. Si vous achetez un produit commercial qui coûte+ de 100K et vous allez seulement utiliser 1% de ce que c'est probablement un peu d'argent imprudemment passé. Cependant, si le produit convient parfaitement, vous pouvez être presque sûr que vous ne pouvez jamais le construire pour moins (en supposant qu'ils ont beaucoup d'expérience dans ce domaine particulier).
donc non vous n'êtes pas fou de réinventer cette roue aussi longtemps comme vous n'êtes pas en train d'essayer de faire tout ce que le produit off the shelve fait et juste se concentrer sur la fonctionnalité spécifique dont vous avez besoin et ne pas vous laisser tenter par l'idée de construire un très beau (mais cher) cadre pour quelque chose de très simple.
100K n'est pas un changement stupide, mais un programmeur décent pour un an coûtera presque certainement plus que cela - Avez-vous un programmeur moins cher qui peut le faire plus rapidement qu'un an? il sera tout aussi bon (pour vos besoins) ou mieux?
ce n'est pas tout à fait mon domaine, je suis venu par cette question par accident, donc je peux être hors, mais je voudrais jeter un oeil à Wolfram Mathematica . Il s'agit d'un environnement informatique technique et d'un langage de programmation (propriétaire) multi-paradigme, supportant de nombreux styles de programmation (y compris la programmation basée sur des règles et la programmation fonctionnelle). Il a un moteur de règle très générale à son cœur. Malgré le nom et la réputation de logiciel mathématique (ce qui est), il est un langage de programmation universel, de très haut niveau. Un sous-ensemble de celui-ci peut être compilé en C. Il peut charger des dlls externes de manière dynamique, et il interagit de manière transparente avec les plates-formes Java et.net. Il a une version web - webMathematica (qui est basée sur Java cependant, jsp+Tomcat, mais personne ne vous empêche de l'interfacer directement avec votre couche web basée sur .Net, juste un peu plus de travail). L'avantage supplémentaire est que, si jamais vous avez besoin de calculs mathématiques, l'analyse, les tracés, les statistiques, c'est tous là, et l'état de l'art.
je pense qu'il devrait être beaucoup plus rapide de développer la fonctionnalité dont vous avez besoin dans Mathematica que dans beaucoup d'autres langues / solutions (Je programme professionnellement dans Mathematica, C, Java et Javascript, donc peut au moins comparer ces langues). La licence commerciale complète devrait être de 2 ou 3 K pour une seule machine (4 cœurs), je pense. Il possède plusieurs caractéristiques de parallélisation. La chose la plus difficile dans cette approche serait de trouver un programmeur Mathematica compétent, mais quelqu'un avec une expérience dans la programmation fonctionnelle/basée sur des règles (LISP / Prolog, say) devrait être en mesure de ramasser les choses assez rapidement. En outre, il peut ne pas être suffisamment rapide si vous avez besoin de très hautes performances - Je ne sais vraiment pas comment il se compare en termes de performance avec d'autres moteurs de règles. À l'occasion, j'ai eu la chance de comparer dans Mathematica une solution basée sur des règles pour quelque problème à celui compilé à C, et je dirais que le code basé sur des règles bien écrit devrait être au niveau de Python en termes de performance, et en moyenne peut-être un ordre de grandeur ou si plus lent que celui compilé à C. Mais c'était surtout pour des problèmes numériques/computationnels ou liés à la manipulation de données, donc je pense que pour les problèmes basés de façon inhérente sur des règles, l'écart de performance pourrait être plus petit.
une chose dont je suis sûr est que dans Mathematica vous pouvez créer des ensembles de règles de n'importe quelle généralité et complexité assez facilement avec une petite quantité de code. C'est le meilleur outil pour une programmation exploratoire basée sur des règles que j'ai rencontrées jusqu'à présent, avec un cycle de développement très court. Je vous invite à visiter le Mathematica tag ici à SO pour voir quels types de problèmes les gens sont en train de résoudre avec elle. Pour un projet important écrit entièrement en langage Mathematica (15 millions de lignes de code), consultez WolframAlpha moteur de connaissance.
y a-t-il une meilleure alternative pour .net?
une option est d'utiliser un moteur de script intégré dans votre code .net, comme Iron Python. Donnez une GUI à vos utilisateurs pour créer des règles, convertissez "la règle" en script Python, appelez le moteur de script Python à L'intérieur de .Net pour exécuter le script.
sommes-nous fous de réinventer cette roue?
si rien sur le marché répond à votre besoins, alors N'.
Le problème est que ces choses sont si étroitement liés avec la façon dont une entreprise unique fonctionne, il est difficile, voire impossible, d'utiliser efficacement un produit commercial.
j'ai fait quelque chose comme ça de deux façons différentes.
le plus récent (dans VS 2005/Framework 2.0) était de créer un moteur de base qui répondait aux exigences minimales communes qui seraient le cas dans l'ensemble. Ce serait des choses comme le nom, l'adresse, etc. Puis j'ai écrit une série de DLLs d'extension qui utilisaient des interfaces communes qui seraient chargées via la réflexion pour des types/régions spécifiques, par exemple, par État ou ligne de produit. Les utilisateurs de courant pouvaient utiliser une application simple pour créer une configuration de Compte dont ils avaient besoin (les configurations étaient stockées dans un DB). Si les choses changeaient, la DLL sous-jacente pourrait être modifiée ou une nouvelle DLL ajoutée. J'ai seulement eu à ajouter une nouvelle DLL D'extension pendant les 4 années où j'étais sur ce projet, mais il y avait généralement un ou deux petits mods nécessaires mois pour les règles.
dans un projet VB6 beaucoup plus tôt, j'ai utilisé un VBScript guidé pour fournir aux utilisateurs de puissance la capacité de coder certaines règles. Bien que les utilisateurs connaissaient bien Excel scripting et une interface de magicien a été écrite pour les aider à faire ce qu'ils avaient besoin de faire, ils m'ont généralement juste donné le travail de codage des règles. Ce plan s'est en quelque sorte retourné contre lui, c'est pourquoi je ne l'ai pas utilisé plus tard, mais j'ai plutôt opté pour une approche plus "check this, select that" de la construction des règles.
écrire votre propre moteur fonctionne si vos règles sont simples. Plus ils sont compliqués, plus il leur faudra du temps pour le maintenir.
vous pouvez utiliser Drools Server pour exécuter vos règles et continuer à faire votre application principale avec .NET ou n'importe quelle langue que vous aimez. Vous avez encore besoin de Java pour la partie Drools Server.