Comment l'utilisation d'un moteur de règles affecte-t-elle la conception, l'implémentation et les performances d'une application?
11
Je suis intéressé par la capacité des moteurs de règles à:
lancer et itérer sur la logique métier
demander aux "utilisateurs professionnels" d'effectuer la modification réelle de ces règles plutôt qu'aux développeurs
comprendre les règles commerciales en général
De plus, l'utilisation d'un moteur de règles a-t-elle un impact sur la qualité d'une application?
L'utilisation d'un moteur de règles change-t-elle si vous déployez sur une configuration à une machine par rapport à votre architecture par rapport à une architecture distribuée cloud à plusieurs niveaux utilisant des milliers de machines? En quoi serait-ce différent?
La décision d'exposer ou non une interface permettant au personnel non technique de modifier les règles métier dépend en grande partie de plusieurs facteurs, notamment les objectifs du projet, le coût du projet, la durée de vie du projet et le rapport des connus aux inconnus dans le projet.
Par exemple, si je pensais que personne n'utiliserait l'interface de règles, je choisirais probablement de ne pas l'implémenter. Cependant, si j'avais des raisons de croire que les changements seraient fréquents et que différents utilisateurs finaux s'attendraient à ce que différentes règles soient en place, alors j'envisagerais de travailler à la création d'une telle fonctionnalité.
J'ai choisi de le faire sur un projet, et il a fallu des années avant que la fonctionnalité ne soit largement utilisée. Je soupçonnais que nous aurions éventuellement des utilisateurs finaux qui voudraient personnaliser les choses eux-mêmes, nous avons donc implémenté cette fonctionnalité en plusieurs parties.
Cela a commencé comme quelque chose que seules certaines personnes, comme les développeurs ou les administrateurs, pouvaient utiliser. L'interface était maladroite, mais utilisable si vous saviez ce que vous faisiez. Mais au moment où le produit était presque terminé, la logique du moteur de règles était utile, et notre équipe de conception lui a donné une belle interface utilisateur orientée client.
Si je devais le faire différemment, je pourrais choisir une architecture de base de données différente simplement parce que la courbe d'apprentissage est élevée. Mais en bref, le construire tôt a conduit à de nombreuses fonctionnalités destinées aux clients plus tard, sans les maux de tête d'avoir à revenir dans le code et à le refactoriser pour inclure toutes les règles dynamiques.
J'ajouterais que les utilisateurs professionnels devraient s'attendre à passer du temps à apprendre l'interface des règles. L'interface sera plus facile à utiliser pour les utilisateurs, mais cela prendra certainement du temps et des efforts pour apprendre. Ils ne devraient pas s'attendre à quelque chose comme par magie.
9000
@ 9000 - Très bon point. Je l'ai vu dans mes propres projets. En fait, cela implique souvent la formation pour mettre les utilisateurs à jour, ainsi qu'un certain aspect de la «vente» de l'interface aux utilisateurs et de leur montrer la valeur qu'elle a pour eux.
jmort253
4
Si je devais faire cela, je créerais un langage spécifique au domaine pour exprimer les règles, et peut-être donner aux types de biz une interface utilisateur pour le modifier si demandé. Utilisez ensuite un langage fonctionnel (comme Haskell, Lisp ou Erlang) pour évaluer les règles.
Si un parallélisme massif était requis, j'irais avec Erlang qui fait très bien la concurrence. L'utilisation d'Erlang évoluerait bien d'un nœud à 100 ou plus.
Si vous considérez les règles comme une algèbre qui sera appliquée à un ensemble de données, il devient beaucoup plus facile de mettre en logique ce qui est nécessaire dans votre code et de prouver à vous-même (ou à vos responsables) qu'elle est correcte. C'est l'un de ces endroits où un langage fonctionnel fonctionnera en votre faveur.
J'ai écrit une application basée sur WF (Windows Workflow Foundation). Mon patron (un DBA) était convaincu que WF pouvait effectuer le multi-threading sans avoir besoin de planifier la simultanéité. La mémoire était divisée à fond, mais il y avait tellement de problèmes que je ne peux pas l'expliquer en quelques paragraphes et ce n'est que légèrement lié à votre question ... alors je continue.
Capacité à itérer BL:
WF le fait bien. permettre aux non-technologies de "créer une application":
WF le fait bien SI l'architecture fonctionne ET les non-technologies comprennent les limites techniques ... La nôtre ne l'a pas fait. Capacité à comprendre les règles métier en général:
il existe des compléments qui peuvent faire des choses de base, tout comme SharePoint peut automatiser les flux de travail. Je ne suis pas entré dans ces articles. Qualité des éditions logicielles:
Médiocre. WF n'a pas bien fonctionné pour nos besoins, mais le système était mal conçu et mes mains étaient liées. Rapidité des applications:
Lent. La courbe d'apprentissage est assez abrupte pour les développeurs et les utilisateurs finaux. La façon dont la mémoire séparée WF (domaines d'application si je me souviens bien) a rendu la communication entre les threads, les mutex et autres concepts de threading compliquée ou tout simplement ne fonctionnait pas du tout.
Finalement, j'ai écrit un prototype pour prouver que WF échoue dans la façon dont il a été implémenté. Je l'ai remplacé par un multi-threading commun. Les performances et la lisibilité du code ont augmenté. Prenez ceci avec un grain de sel car c'était ma première application WF professionnelle.
Les Nontechs peuvent en venir à croire que pratiquement tout est possible sans aucun programmeur requis, un négatif potentiellement important pour tout le "mannequin" de BL; des problèmes sociologiques liés à cela ont tué le projet.
Si je pouvais revenir en arrière et le faire à ma façon : utilisez le filetage traditionnel et le moulage BL réalisé via Decorator Pattern. J'ai écrit une preuve de concept qui a utilisé ces technologies et cela a bien fonctionné. ET le mappage BL doit être enveloppé dans une interface utilisateur SIMPLE. Mise à jour
J'ai trouvé un ancien message que j'ai écrit en travaillant sur des problèmes de concurrence. Le code montre comment l'impression de "hello world" dans des workflows parallèles ne fonctionne pas sans une compréhension de ce qui se passe sous les couvertures (ce qui va à l'encontre du but de l'abstraction WF). Le modérateur MSDN explique un aperçu de haut niveau de la façon dont les activités parallèles sont vraiment séquentielles. Il conclut avec "vous devez lire le manuel entier" pour faire quelque chose d'aussi basique. http://social.msdn.microsoft.com/Forums/en/windowsworkflowfoundation/thread/8a1fa165-ad5c-4cd2-b489-7ea5fc31fed8
Je n'ai aucune expérience avec WF, mais je m'en suis toujours éloigné, car mon instinct était de le faire. Mais je ne peux pas m'empêcher de me demander si WinWF n'est pas seulement une version retardée d'un système ETL, tel que Rhino ETL, en termes de ce qui peut être fait avec la même facilité?
Henrik
3
J'ai eu une expérience moins que parfaite de la connexion du code Java à un moteur de règles Oracle. Cela peut être dû en partie à l'inexpérience des auteurs de règles, mais c'est ce à quoi j'ai dû faire face.
Nous avons implémenté notre moteur de règles comme un appareil sans état. L'appelant a dû rassembler tous les paramètres et les transmettre au moteur pour évaluation. Cela signifiait que si la règle avait besoin d'un autre champ de données, tous les clients devaient être mis à jour, ce qui annulait l'avantage espéré de pouvoir mettre à jour les règles indépendamment de leurs consommateurs.
Le moteur a publié un WSDL SOAP, mais il a été généré automatiquement à partir de l'ensemble de règles. Des modifications mineures des règles rompraient le contrat avec les consommateurs.
Le moteur était bon pour évaluer les règles, mais terrible pour nous dire pourquoi l'évaluation a échoué. Il était difficile de renvoyer des messages d'erreur informatifs à l'utilisateur.
Le WSDL n'était pas propre à la consommation générale. Le jeu de règles le plus simple avait un WSDL de 14 pages, qui exposait les éléments internes de la base de règles. Nous avons dû mettre une couche de traduction SOA en avant pour présenter une façade conviviale. Ainsi, au lieu d'appeler une bibliothèque locale 100% fiable, il y avait deux serveurs supplémentaires dans la boucle. Cela n'ajoute en rien à la fiabilité. De plus, toute modification de la signature de la règle impliquait trois équipes disparates mettant à jour le code. Pas ma définition de l'agile!
Chaque fois que l'ensemble de règles nécessitait des ajouts, le WSDL devait être mis à jour, ce qui signifiait que les clients ne le comprenaient plus. Cela a conduit à l'ajout de nouveaux points de terminaison SOAP pour v2, v3 .., ce qui a eu pour effet de provoquer la mise à jour des règles de pare-feu.
Les règles étaient exprimées en «anglais structuré» qui était facilement compréhensible pour les règles simples, mais presque opaque pour les règles complexes.
Nous n'avons jamais pu trouver des entrepreneurs connaissant le langage de création des règles.
Le langage de règles n'a pas implémenté de tableaux, de récursivité ou d'orientation d'objet. Dans un cas, la seule façon d'implémenter une règle était via une légende vers une feuille de calcul Excel, où la règle a été implémentée dans VB. Pourquoi s'embêter?
Je ne pense pas que le choix d'utiliser ou non un moteur de règles soit clair. Je vous suggère de prototyper n'importe quel moteur que vous avez l'intention d'utiliser, puis de prendre une décision éclairée. Ils ne sont certainement pas une solution miracle ...
Si je devais faire cela, je créerais un langage spécifique au domaine pour exprimer les règles, et peut-être donner aux types de biz une interface utilisateur pour le modifier si demandé. Utilisez ensuite un langage fonctionnel (comme Haskell, Lisp ou Erlang) pour évaluer les règles.
Si un parallélisme massif était requis, j'irais avec Erlang qui fait très bien la concurrence. L'utilisation d'Erlang évoluerait bien d'un nœud à 100 ou plus.
Si vous considérez les règles comme une algèbre qui sera appliquée à un ensemble de données, il devient beaucoup plus facile de mettre en logique ce qui est nécessaire dans votre code et de prouver à vous-même (ou à vos responsables) qu'elle est correcte. C'est l'un de ces endroits où un langage fonctionnel fonctionnera en votre faveur.
la source
J'ai écrit une application basée sur WF (Windows Workflow Foundation). Mon patron (un DBA) était convaincu que WF pouvait effectuer le multi-threading sans avoir besoin de planifier la simultanéité. La mémoire était divisée à fond, mais il y avait tellement de problèmes que je ne peux pas l'expliquer en quelques paragraphes et ce n'est que légèrement lié à votre question ... alors je continue.
Capacité à itérer BL:
WF le fait bien.
permettre aux non-technologies de "créer une application":
WF le fait bien SI l'architecture fonctionne ET les non-technologies comprennent les limites techniques ... La nôtre ne l'a pas fait.
Capacité à comprendre les règles métier en général:
il existe des compléments qui peuvent faire des choses de base, tout comme SharePoint peut automatiser les flux de travail. Je ne suis pas entré dans ces articles.
Qualité des éditions logicielles:
Médiocre. WF n'a pas bien fonctionné pour nos besoins, mais le système était mal conçu et mes mains étaient liées.
Rapidité des applications:
Lent. La courbe d'apprentissage est assez abrupte pour les développeurs et les utilisateurs finaux. La façon dont la mémoire séparée WF (domaines d'application si je me souviens bien) a rendu la communication entre les threads, les mutex et autres concepts de threading compliquée ou tout simplement ne fonctionnait pas du tout.
Finalement, j'ai écrit un prototype pour prouver que WF échoue dans la façon dont il a été implémenté. Je l'ai remplacé par un multi-threading commun. Les performances et la lisibilité du code ont augmenté. Prenez ceci avec un grain de sel car c'était ma première application WF professionnelle.
Les Nontechs peuvent en venir à croire que pratiquement tout est possible sans aucun programmeur requis, un négatif potentiellement important pour tout le "mannequin" de BL; des problèmes sociologiques liés à cela ont tué le projet.
Si je pouvais revenir en arrière et le faire à ma façon : utilisez le filetage traditionnel et le moulage BL réalisé via Decorator Pattern. J'ai écrit une preuve de concept qui a utilisé ces technologies et cela a bien fonctionné. ET le mappage BL doit être enveloppé dans une interface utilisateur SIMPLE.
Mise à jour
J'ai trouvé un ancien message que j'ai écrit en travaillant sur des problèmes de concurrence. Le code montre comment l'impression de "hello world" dans des workflows parallèles ne fonctionne pas sans une compréhension de ce qui se passe sous les couvertures (ce qui va à l'encontre du but de l'abstraction WF). Le modérateur MSDN explique un aperçu de haut niveau de la façon dont les activités parallèles sont vraiment séquentielles. Il conclut avec "vous devez lire le manuel entier" pour faire quelque chose d'aussi basique. http://social.msdn.microsoft.com/Forums/en/windowsworkflowfoundation/thread/8a1fa165-ad5c-4cd2-b489-7ea5fc31fed8
Bonne chance.
la source
J'ai eu une expérience moins que parfaite de la connexion du code Java à un moteur de règles Oracle. Cela peut être dû en partie à l'inexpérience des auteurs de règles, mais c'est ce à quoi j'ai dû faire face.
Je ne pense pas que le choix d'utiliser ou non un moteur de règles soit clair. Je vous suggère de prototyper n'importe quel moteur que vous avez l'intention d'utiliser, puis de prendre une décision éclairée. Ils ne sont certainement pas une solution miracle ...
la source