Moteur de règles pour .NET

Nous avons l’obligation professionnelle de permettre aux utilisateurs privilégiés de modifier les règles relatives aux taux d’assurance et aux inscriptions. Nous avons besoin d’une interface Web qui leur permette d’indiquer que “ce produit est destiné uniquement aux personnes de moins de 55 ans, sauf si elles sont originaires du Texas et possèdent un caniche” ou autre. Modifier pour clarification: L’assurance est folle. Les règles diffèrent d’un produit à l’autre, d’un état à l’autre et changent constamment.

Nous avons examiné quelques moteurs de règles, mais les moteurs commerciaux ont une capacité de plus de 100 000 $ et les systèmes open source ne semblent pas terminés. Le stream de travail Windows fonctionne si nous créons les règles à l’avance, mais leur création au moment de l’exécution semble nécessiter de contourner la sécurité d’access au code. C’est effrayant.

Sommes-nous fous pour réinventer cette roue? Existe-t-il une meilleure alternative au .net?

Je ne pense pas que l’évaluation des règles sera le défi. Je pense que le plus grand défi consiste à parsingr les règles que l’utilisateur peut entrer. Pour parsingr les règles, vous devez envisager de créer un DSL. Martin Fowler a quelques idées à ce sujet ici . Alors peut-être qu’ANTLR pourrait alors valoir le coup d’oeil.

Pour la partie évaluation: je travaille dans le secteur financier et il existe également des règles compliquées, mais je n’ai jamais eu à utiliser de moteur de règles. Les moyens d’un langage de programmation impératif (dans mon cas, C #) étaient (jusqu’à présent) suffisants. À certaines occasions, je pensais à un moteur de règles, mais les risques technologiques (*) d’un moteur de règles étaient toujours supérieurs aux avantages escomptés. Les règles n’étaient (jusqu’à présent) jamais aussi compliquées, un modèle de programmation déclaratif était nécessaire.

Si vous utilisez un langage orienté object, vous pouvez essayer d’appliquer le modèle de spécification . Eric Evans et Martin Fowler ont écrit une explication plus détaillée, que vous pouvez trouver ici . Sinon, vous pouvez écrire votre propre moteur de règles simple.

(*) Note de bas de page: vous devrez peut-être intégrer le moteur de règles à votre application, qui est très probablement écrit dans un langage orienté object. Il existe donc des limites technologiques que vous devez franchir. Chacun de ces ponts est un risque technologique. J’avais déjà é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 fichiers core dump et détruisait l’ensemble de l’application Web.

Je pense que comme pour la plupart des décisions d’achat et d’achat, c’est toujours un compromis que vous devez faire personnellement. Si vous achetez une solution prête à l’emploi qui coûte plus de 100 000 $ et que vous n’utiliserez que 1% de cette sum, vous aurez probablement dépensé de l’argent à tort. Toutefois, si le produit convient parfaitement, vous pouvez presque être sûr de ne jamais le fabriquer à un prix inférieur (en supposant que les produits possèdent beaucoup d’expérience dans ce domaine particulier).

Donc, non, vous n’êtes pas cinglé pour réinventer cette roue tant que vous n’essayez pas de tout faire avec le produit standard, mais que vous vous concentrez uniquement sur les fonctionnalités spécifiques dont vous avez besoin et que vous ne vous laissez pas tenter (mais cher) cadre pour quelque chose de très simple.

100K n’est pas un changement radical, mais un bon programmeur 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? sera-t-il aussi bon (pour vos besoins) ou meilleur?

Ce n’est pas tout à fait mon domaine, je suis venu à cette question par accident, alors je peux être absent, mais je jetterais un coup d’œil à Wolfram Mathematica . Il s’agit d’un environnement informatique technique et d’un langage de programmation multi-paradigme (propriétaire), prenant en charge de nombreux styles de programmation (y compris la programmation à base de règles et fonctionnelle). Il a un moteur de règles très général à sa base. Malgré son nom et sa réputation de logiciel mathématique (quel qu’il soit), il s’agit d’un langage de programmation généraliste de très haut niveau. Un sous-ensemble de celui-ci peut être compilé en C. Il peut charger des dll externes de manière dynamic et interagit de manière transparente avec les plates-formes Java et .Net. Il a une version Web – webMathematica (qui est basé sur Java cependant, jsp + Tomcat, mais personne ne vous empêche de l’interfacer directement avec votre couche Web .Net, juste quelques travaux supplémentaires). L’avantage supplémentaire est que, si vous avez besoin de calculs mathématiques, d’parsings, de graphiques, de statistiques, tout est là et est à la pointe de la technologie.

Je pense qu’il devrait être beaucoup plus rapide de développer les fonctionnalités dont vous avez besoin dans Mathematica que dans de nombreux autres langages / solutions (je programme professionnellement en Mathematica, C, Java et Javascript, afin de pouvoir au moins comparer ces langages). 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 fonctionnalités de parallélisation. Le plus difficile dans cette approche serait de trouver un programmeur Mathematica compétent, mais une personne ayant une expérience en functional programming / basée sur des règles (LISP / Prolog, par exemple) devrait être capable de comprendre rapidement le processus. De plus, si vous avez besoin de performances très élevées, elles risquent de ne pas être suffisamment rapides. Je ne sais vraiment pas comment elles se comparent aux performances des autres moteurs de règles. À l’occasion, j’ai eu l’occasion de comparer dans Mathematica une solution à base de règles à celle compilée en C, et je dirais qu’un code bien écrit à base de règles devrait être au niveau de Python en termes de performances, et en moyenne peut-être un ordre de grandeur ou plus lent que celui compilé en C. Mais c’était principalement pour des problèmes numériques / informatiques ou liés à la manipulation de données, donc je penserais à des problèmes inhérents à des règles, l’écart de performance pourrait être plus petit.

Une chose dont je suis certain, c’est que dans Mathematica, vous pouvez créer assez facilement des ensembles de règles de toute généralité et de toute complexité avec une petite quantité de code. C’est le meilleur outil de programmation exploratoire basé sur les règles que j’ai rencontrées jusqu’à présent, avec un cycle de développement très court. Je vous invite à visiter le tag Mathematica ici à SO pour voir quels types de problèmes les gens résolvent avec. Pour un projet important entièrement rédigé en langage Mathematica (15 millions de lignes de code), consultez le moteur de connaissances WolframAlpha .

Existe-t-il une meilleure alternative au .net?

Une option consiste à utiliser un moteur de script intégré dans votre code .net, comme Iron Python. Donnez à vos utilisateurs une interface graphique pour établir des règles, convertissez “la règle” en script Python, appelez le moteur de script Python dans .Net pour exécuter le script.

Sommes-nous fous pour réinventer cette roue?

Si rien ne répond à vos besoins, alors non.

Le problème est que ces choses sont tellement liées à la manière dont une entreprise fonctionne de manière unique, il est difficile, voire impossible, d’utiliser efficacement une solution prête à l’emploi.

J’ai fait quelque chose comme ça de deux manières différentes.

La plus récente (dans VS 2005 / Framework 2.0) consistait à créer un moteur de base prenant en charge les exigences minimales communes qui seraient les mêmes dans tous les domaines. Ce sont des éléments tels que nom, adresse, etc. Ensuite, j’ai écrit une série de DLL d’extension utilisant des interfaces communes qui seraient chargées via la reflection pour des types / régions spécifiques, par exemple, par état ou par ligne de produit. Les utilisateurs expérimentés pouvaient utiliser une application simple pour créer la configuration de compte dont ils avaient besoin (les configurations étaient stockées dans une firebase database). Si les choses changent, la DLL sous-jacente peut être modifiée ou une nouvelle ajoutée. Je n’avais qu’à append une nouvelle extension DLL pendant les 4 années de mon projet, mais il fallait généralement un ou deux petits mods par mois.

Dans un projet beaucoup plus ancien de VB6, j’ai utilisé un VBScript guidé pour permettre aux utilisateurs expérimentés de coder certaines règles. Bien que les utilisateurs connaissent bien les scripts Excel et qu’une interface d’assistant ait été écrite pour les aider à faire ce qu’ils devaient faire, ils m’ont généralement confié le travail de codage des règles. Ce plan s’est en quelque sorte retourné contre lui, c’est pourquoi je ne l’ai plus utilisé plus tard, mais j’ai plutôt opté pour une approche plus “contrôlez ceci, sélectionnez-le” pour la construction de règles.

Écrire votre propre moteur fonctionne si vos règles sont simples. Plus ils deviennent compliqués, plus il faudra de temps pour le maintenir.

Vous pouvez utiliser Drools Server pour exécuter vos règles tout en réalisant votre application principale avec .NET ou la langue de votre choix. Vous avez toujours besoin de Java pour la partie serveur Drools.