Moteur de règles - avantages et inconvénients
Je suis de la vérification d'un projet qui utilise ce qu'on appelle un Moteur De Règles. En bref, c'est un moyen d'externaliser la logique métier de l'application du code.
Ce concept est totalement nouveau pour moi et je suis assez sceptique à ce sujet. Après avoir entendu des personnes parler de Anémique Modèles De Domaine depuis quelques années, je suis en interrogeant le Moteur de Règles d'Approche. Pour moi, ils semblent comme un excellent moyen pour AFFAIBLIR un modèle de domaine. Par exemple dire que je suis en train de faire une java webapp de l'interaction avec un Moteur de Règles. Puis je décide d'avoir une application Android basée sur le même domaine. Sauf si je veux l'application Android pour interagir avec le Moteur de Règles, je vais devoir manquer quelle que soit la logique d'entreprise a été déjà écrit.
Que je n'ai pas d'expérience avec eux, juste de la curiosité, j'ai été intéressé d'entendre parler des avantages et des inconvénients à utiliser un Moteur de Règles? Le seul pro que je peux penser, c'est que vous n'avez pas besoin de reconstruire l'ensemble de votre Application il suffit de changer quelques affaires de la règle (mais vraiment, combien d'apps vraiment eu beaucoup de changements?). Mais à l'aide d'un Moteur de Règles pour résoudre ce problème sonne pour moi comme mettre un pansement sur un fusil de chasse de la plaie.
Mise à JOUR - depuis la rédaction de ce, le dieu lui-même, Martin Fowler, a blogué sur l'utilisation d'un moteur de Règles.
- Vous êtes à la recherche dans des produits de tiers ou allez-vous rouler?
- C'est un excellent article de Martin Fowler, merci!
- vous avez raison, ils sont très anti-OO. Ils viennent d'un temps où OO n'était pas commun (qui explique en partie cela), mais oui, ils sont très désireux de travailler avec des dossiers/des objets de valeur qui sont "anémique" comme vous dites. Ce n'est pas nécessairement une mauvaise chose, mais c'est ce qu'il est. Si vous n'aimez pas que vous n'aimez pas la règle des moteurs.
- Je voudrais également d'examiner si l'on veut vraiment le (chaînage avant) moteur de règle ou l'on veut réellement le point de vue sémantique claire (dans le sens de: au moins, on sait ce qu'ils calculent en premier lieu) de la logique des programmes de Prolog ou beaucoup plus simples Datalog (ou on peut aller plus raréfié des territoires et de prendre un coup d'oeil à l'Opération Logique). Si l'on veut réactivité ("chaque fois que quelque chose change dans la base de données, faire quelque chose, n'importe quoi!"), un coup d'oeil a un Tuplespace/Lindaspace de mise en œuvre liées à un bon vieux OO programmation en $PREFERRED_LANGUAGE pourrait être en vaut la peine.
Vous devez vous connecter pour publier un commentaire.
La plupart des moteurs de règles que j'ai vu sont considérés comme une boîte noire par le code du système. Si je devais construire un modèle de domaine, je serais probablement besoin de certaines règles métier pour être intrinsèque au modèle de domaine, par exemple, de règles métier qui me disent, quand un objet a des valeurs non valides. Cela permet à plusieurs systèmes de partager le modèle de domaine sans dupliquer une logique d'entreprise. Je pourrais avoir à chaque utilisation du système de la même règle, le service de valider mon modèle de domaine, mais cela ne semble affaiblir mon modèle de domaine (comme il a été souligné dans la question). Pourquoi? Parce qu'au lieu de constamment faire respecter mes règles métier dans l'ensemble des systèmes à tout moment, je suis en s'appuyant sur le système de programmeurs pour déterminer quand les règles devraient être appliquées (en appelant le service à la règle). Cela peut ne pas être un problème si le modèle de domaine vient à vous complètement rempli, mais peut être problématique si vous faites affaire avec une interface utilisateur ou d'un système qui modifie les valeurs dans le modèle de domaine pour sa durée de vie.
Il y a une autre catégorie de règles métier: la prise de décision. Par exemple, une compagnie d'assurance peut-être besoin de classer le risque de souscription d'un demandeur et d'arriver à une prime. Vous pouvez placer ces types de règles métier dans votre modèle de domaine, mais une décision centralisée pour les scénarios de ce genre sont généralement souhaitable et, en fait, fit assez bien dans une architecture orientée service. Ce n'poser la question de pourquoi un moteur de règles et pas de code système. L'endroit où un moteur de règles peut être un meilleur choix est l'endroit où les règles d'affaires responsable de la décision de changer au fil du temps (comme certains autres réponses ont souligné).
Moteurs de règles vous permet également de changer les règles sans avoir à redémarrer votre système ou le déploiement d'un nouveau code exécutable (indépendamment de ce qui promet de vous recevoir à partir d'un fournisseur, assurez-vous de tester vos modifications dans un environnement de non-production parce que, même si la règle moteur est impeccable, les humains sont toujours modifier les règles). Si vous êtes en train de penser, "je peux le faire en utilisant une base de données pour stocker des valeurs qui changent", vous avez raison. Un moteur de règles n'est pas une boite magique qui fait quelque chose de nouveau . Il est destiné à être un outil qui fournit un niveau d'abstraction plus élevé, de sorte que vous pouvez vous concentrer moins sur la manière de réinventer la roue. De nombreux fournisseurs d'aller plus loin en vous permettant de créer des modèles de sorte que les utilisateurs peuvent remplir les blancs à la place de l'apprentissage d'une règle de la langue.
Une séparation à la prudence sur les modèles: les modèles ne peut pas prendre moins de temps que d'écrire une règle sans modèle, parce que le modèle doit, au minimum, de décrire la règle. Plan pour un coût initial plus élevé (le même que si vous créez un système qui a utilisé une base de données pour stocker des valeurs qui changent de vs écrire les règles directement dans le système de code) - le ROI est parce que vous économisez sur l'avenir de la maintenance de système de code.
Je pense que vos préoccupations au sujet de anémique modèles de domaine sont valides.
J'ai vu deux applications d'un commercial bien connu Rete règles de fonctionnement du moteur dans la production de l'endroit où je travaille. Je voudrais examiner un un succès, et les autres un échec.
Le succès de l'application est un arbre de décision app, composé de ~10 arbres de ~30 points chacun. Le moteur de règles a une INTERFACE utilisateur qui permet aux gens d'affaires à maintenir les règles.
La moins réussie de l'application a ~3000 règles de percuter une des règles de base de données. On n'a aucune idée si il y a des conflits de règles quand un nouveau est ajouté. Il y a peu de compréhension de l'algorithme Rete et de l'expérience avec le produit a quitté la société, c'est devenu une boîte noire qui est intouchable et unrefactorable. Le cycle de déploiement est toujours affectée par les changements des règles - une régression complète de test doit être fait lorsque les règles sont modifiées. La mémoire est un problème, trop.
J'avais de la bande de roulement légèrement. Lorsqu'une règle est de taille modeste, il est facile de comprendre les changements, comme l'simpliste e-mail exemple donné ci-dessus. Une fois que le nombre de règles monte dans les centaines je pense que vous pourriez avoir un problème.
Je voudrais aussi s'inquiéter d'un moteur de règles de devenir un singleton goulot d'étranglement dans votre application.
Je ne vois rien de mal avec l'aide d'objets comme un moyen de partitionner le moteur de règles de l'espace. L'incorporation de comportement dans les objets qui s'en remettre à un privé, moteur de règles semble bon pour moi. Les problèmes vont vous frapper quand le moteur de règles nécessite de l'état qui ne fait pas partie de son objet à feu correctement. Mais c'est juste un autre exemple de la conception d'être difficile.
Moteurs de règles peut vous offrir beaucoup de valeur, dans certains cas.
Tout d'abord, de nombreux moteurs de règles de travail en plus de façon déclarative. Un très brut exemple serait AWK, où vous pourrez vous assigner regexes à des blocs de code. Lorsque la regex est vu par l'analyseur de fichiers, le bloc de code est exécuté.
Vous pouvez voir que dans ce cas, si vous avez, disons, un grand AWK fichier et que vous vouliez ajouter Encore une Autre "règle", vous pouvez facilement aller à la fin du fichier, ajoutez vous regex et de la logique, et être fait avec elle. Plus précisément, pour de nombreuses applications, vous n'êtes pas particulièrement concernée par ce que les autres règles sont faites, et les règles n'ont pas vraiment d'interagir les uns avec les autres.
Donc le fichier AWK devient de plus en plus comme une "règle de la soupe". Cette "règle de la soupe" la nature permet aux gens de se concentrer étroitement sur leur domaine avec peu de préoccupation pour toutes les autres règles qui peuvent être dans le système.
Par exemple, Frank est intéressé à commandes avec un total de plus de 1000$, de sorte qu'il met dans le système de règles qu'il est intéressé. "SI l'ordre.total > 1000 e-mails Frank".
Pendant ce temps, Sally veut que tous les ordres de la côte ouest: "SI l'ordre.source == 'WEST_COAST' e-mail Sally".
Ainsi, vous pouvez le voir dans cette triviale, artificiel cas, un ordre peut satisfaire à la fois les règles, mais les règles sont indépendants les uns des autres. Des $1200 l'ordre à partir de la Côte Ouest notifie à la fois Franc et Sally. Lorsque Frank n'est plus concerné, il va tout simplement de tirer sa règle de la soupe.
Pour de nombreuses situations, cette flexibilité peut être très puissant. Il peut également, à l'instar de ce cas, être exposés à des utilisateurs finaux pour les règles simples. À l'aide de haut niveau des expressions et peut-être léger script.
Maintenant, clairement, dans un système complexe il y a toutes sortes de relations et d'interactions qui peuvent se produire, ce est pourquoi, l'ensemble du système n'est pas Fait "avec les règles". Quelqu'un, quelque part va être en charge de la réglementation n'est pas sortir de la main. Mais cela ne veut pas nécessairement diminuer la valeur d'un tel système peut fournir.
Esprit, cela ne veut pas y aller pour des choses comme les systèmes experts, où les règles de feu sur les données que les règles peuvent créer, mais un assouplissement des règles du système.
De toute façon, j'espère que cet exemple montre comment un système de règles peut aider à augmenter une application plus large.
Le plus pro que j'ai vu pour les règles des moteurs est qu'il permet à l'Entreprise Règle les propriétaires de mettre en œuvre les règles d'affaires, au lieu de mettre le fardeau de la preuve sur les programmeurs. Même si vous avez un processus agile où vous êtes constamment à obtenir les commentaires des parties prenantes et en passant par itérations rapides, il n'est pas encore allez atteindre le niveau d'efficacité qui peut être réalisé en ayant des gens qui font de l'entreprise, règles de les mettre en œuvre aussi bien.
Aussi, vous ne pouvez pas sous-souligner la valeur de retrait de la recompiler-retest-redéployer cycle qui peut résulter d'un simple changement de règle, si les règles sont incorporées dans le code. Il y a souvent plusieurs équipes qui sont impliqués dans la réalisation de la bénédiction sur une génération, et à l'aide d'un Moteur de Règles peut faire beaucoup de qui inutiles.
J'ai écrit un moteur de règles pour un client. La plus grande victoire a été, y compris toutes les parties prenantes. Le moteur pourrait exécuter (ou la relecture) d'une requête et d'expliquer ce qui se passait dans le texte. Les gens d'affaires pourrait se pencher sur le texte de la description et rapidement le point des nuances dans les règles, les exceptions, et d'autres cas particuliers. Une fois que le côté commercial a été impliqué, la validation a obtenu beaucoup mieux, car il était facile d'obtenir leurs commentaires. En outre, le moteur de règles peuvent vivre séparément des autres parties de l'application du code de base de sorte que vous pouvez l'utiliser dans toutes les applications.
La con, c'est que certains programmeurs n'aiment pas apprendre trop. Des moteurs de règles et les règles que vous mettez en eux, avec les choses qui les met en œuvre, peut être un peu poilue. Bien qu'un bon système peut facilement manipuler malade et tordu les webs de la logique (ou illogic souvent ;), il n'est pas aussi simple que le codage d'un tas de
if
consolidés (peu importe ce que certains de la simple à l'esprit de la règle des moteurs). Le moteur de règles vous donne les outils pour gérer la règle des relations, mais vous avez toujours être en mesure d'imaginer tout cela dans votre esprit. Parfois, c'est comme vivre dans le film Brésil. 🙂(Comme tout le reste) dépend de votre application. Pour certaines applications (en général ceux qui ne changent jamais ou les règles sont les meilleurs sur la vie réelle des constantes, c'est à dire ne changera pas sensiblement dans les éons, par exemple, les propriétés physiques et formules) qu'il n'a pas de sens d'utiliser un moteur de règles, c'est juste introduit une complexité supplémentaire et nécessite le développeur d'avoir un plus grand ensemble de compétences.
Pour d'autres applications, c'est vraiment une bonne idée. Prenez, par exemple, le traitement de commandes (commandes de tout, de la facturation, le traitement des transactions en devises), chaque maintenant et puis, il y a une minute à certains pertinentes de la loi ou du code (dans le sens judiciaire) qui vous oblige à répondre à une nouvelle exigence (par exemple la taxe de vente, un classique).
Plutôt que d'essayer de forcer votre ancienne application dans cette nouvelle situation où, tout d'un coup, vous avez à penser à propos de la taxe sur les ventes, alors qu'avant vous ne l'avez pas, il est plus facile d'adapter votre jeu de règles plutôt que d'avoir à se mêler à propos potentiellement un grand ensemble de votre code.
Ensuite l'amendement suivant à partir de votre gouvernement local nécessite la déclaration de toutes les ventes à l'intérieur de certains critères, plutôt que vous avez à y aller et d'ajouter que, trop. À la fin, vous vous retrouverez avec un code très complexe qui s'avère assez difficile à gérer lorsque vous tournez autour et que vous voulez annuler l'effet de l'une des règles, sans influencer tous les autres...
Tout le monde a été très positif sur les règles des moteurs, mais je conseille au lecteur de se méfier. Quand un problème devient un peu plus compliqué, vous pouvez retrouver tout à coup que la totalité d'un moteur de règles a été rendue impropre, ou beaucoup plus compliqué que dans un plus puissant de la langue. Aussi, pour de nombreux problèmes, les règles des moteurs ne seront pas en mesure de détecter facilement les propriétés qui réduisent considérablement l'exécution et la mémoire de l'empreinte de l'évaluation de la condition. Il y a relativement peu de situations dans lesquelles je préfère un moteur de règles pour une injection de dépendance cadre ou d'un langage de programmation dynamique.
"mais en réalité, combien d'apps vraiment eu beaucoup de changements?"
Honnêtement, toutes les applications que j'ai travaillé sur a traversé de sérieux flux de travail et/ou de la logique des changements de concept jusqu'à bien après le déploiement. C'est la raison numéro un pour la "maintenance" de la programmation...
La réalité est que vous ne pouvez pas penser à tout dès le départ, raison pour laquelle les processus Agiles. En outre, la BA est toujours l'impression de manquer de quelque chose de vital jusqu'à ce qu'il trouve dans les tests.
Moteurs de règles force de séparer la logique métier de la présentation et de stockage. De plus, si vous utilisez le moteur droit, votre BA pouvez ajouter et supprimer logique que nécessaire. Comme Chris Marasti-Georg dit, il met le fardeau de la preuve sur le BA. Mais plus que cela, il permet à la BA pour obtenir exactement ce qu'ils demandent.
Un moteur de règles est une victoire sur une application configurable où vous ne voulez pas avoir à faire personnalisé si elle peut être évitée. Ils sont aussi bon à la centralisation de grandes bases de règles et d'algorithmes comme Rete sont efficaces pour rapidement le rapprochement avec de grands ensembles de règles.
Beaucoup de bonnes réponses déjà mais je voulais ajouter une ou deux choses:
Je voir la règle, des processus et des données moteurs (un.k.un. les bases de données) comme étant essentiellement similaire. Mais, pour une raison quelconque, nous ne disons jamais que blackboxing la persistance du sous-système est mauvais.
Deuxièmement, à partir de mon POV, une anémie modèle n'est pas celui qui est la lumière dans mise en œuvre de comportements, il en est une qui est la lumière dans comportements de lui-même. La méthode qui décrit un comportement disponibles dans un modèle de domaine objet n'a pas à être fait par l'objet lui-même.
La plus grande complexité de mon expérience dans les Moteurs de règles, c'est que: