IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Mise en oeuvre d'un pattern, pb de conception


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 6
    Par défaut Mise en oeuvre d'un pattern, pb de conception
    Bonsoir,

    Dans le cadre de la mise en place d'un moteur de prise en charge de règles métiers à destination d'une application web, j'ai découvert le Pattern Specification avec la note de blog suivante (Le concept de cette pattern y est bien expliqué)

    http://blog.xebia.fr/2009/12/29/le-p...regles-metier/

    Cela correspond bien à mon besoin, cependant j’espérais pouvoir le rendre dynamique, de façon à parser les règles 'à chaud' et les appliquer, sans être obligé de modifier le code.

    Je parviens à parser mes règles, j'en construis les objets adéquats (dérivant de LeafSpecification) que je place dans une liste.

    Avant de complexifier plus le traitement, je cherche à chainer ces règles à l'aide de la fonction and(), ce qui au final me renvoie un objet AbstractCompositeSpecification.

    Sur cet objet, je devrais pouvoir vérifier l'ensemble de mes règles avec la fonction isSatisfiedBy(), mais il semble que je parte dans un traitement infini..

    Je bloque un peu, je suis un peu à la limite de mes capacités d'abstraction.. Mais j'aimerais comprendre..

    Quelqu'un aurait une piste ?

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Par défaut
    Poste ton code qu'on jette un œil.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 6
    Par défaut
    Je vais essayer :p

    Toutes mes classes règles dérivent de la classe suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public abstract class RuleCategory extends LeafSpecification<Category> {
    }
    Exemple d'une de mes classes "règles"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public class RuleCategoryMatch extends RuleCategory {
    	private Category categoryMatch;
     
    	public void setCategoryMatch(Category categoryMatch) {
    		this.categoryMatch = categoryMatch;
    	}
     
    	@Override
    	public boolean isSatisfiedBy(Category candidate) {
    		if(candidate.equals(categoryMatch))
    		{
    			return true;
    		}
    		return false;
    	}
     
    	@Override
    	public String toString() {
    		return "Rule Category Match - match cat " + categoryMatch;
    	}
    }
    Exemple d'ajout d'une régle à la liste de règle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       RuleCategoryMatch rule = new RuleCategoryMatch();
       rule.setCategoryMatch(myCategory)
       listRules.add(rule);
    fonction qui empile recursivement les regles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    private AbstractCompositeSpecification recurseBuildRule(ArrayList <RuleCategory> list, RuleCategory curRule)
    	{
    		if(list.get(0) != null)
    		{
    			RuleCategory rule = list.iterator().next();
     
    			list.remove(0);
    			if(list.size() > 0 && list.get(0) != null)
    			{
    				return (AbstractCompositeSpecification)curRule.and(recurseBuildRule(list, curRule));
    			}
    		}
    		return curRule;
    	}
    Puis cette portion de code fait appel à la fonction récursive pour construire l'empilement de règle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    RuleCategory rule = (RuleCategory) listRules.iterator().next();
    listRules.remove(0);
     
    RuleCategory finalRule = (RuleCategory) recurseBuildRule(listRules, rule);
     
    if (finalRule.isSatisfiedBy(testCategory))
    {
    	System.out.println("Rules are OK");
    }
    else
    {
    	System.out.println("Rules are KO");
    }
    Cela fonctionne mais je me demande si il n'y a pas moyen de concevoir cela autrement, par exemple en créant une classe FinalRule, qui "s'auto-construirait" en tant que classe finale, et à laquelle je passerais ma liste de règle au contructeur..

    le tout s'appuie sur le schéma suivant


    Merci de m'avoir lu, c'est bien difficile de décrire de tels problèmes

    Merci !

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 6
    Par défaut
    En fait, je viens de trouver un facon de le faire fonctionner, mais je ne trouve pas ca élégant.. Enfin je suppose qu'il y a plus propre et fiable.

    Je modifie mon post précedent

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Par défaut
    La méthode recurseBuildRule(ArrayList <RuleCategory> list, RuleCategory curRule) me semble pas très bien codée. Une simple boucle aurait suffit à la place de la récursivité. Mais c'est une affaire de goût

    Ton code bloque (ou boucle) sur l'exécution ou la construction de tes règles ?

    Il manque le code de l'exécution de tes règles isSatisfiedBy() pour le AND ainsi que celui de la construction du and().

  6. #6
    Membre émérite Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Par défaut
    Effectivement, ta recursion ne fonctionne pas.

    le code suivant te reverra systématiquement le même element car la méthode iterator() va te renvoyer un nouvelle Iterator à à chaque appel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RuleCategory rule = list.iterator().next();
    donc ton objet rule sera systématiquement le premier élément de ta liste.
    Pour bien faire, il aurait fallu passer l'itérator en paramètre et non la liste... où simplement mettre cela dans une boucle.

Discussions similaires

  1. Mise en oeuvre de pattern MVC
    Par mandzokich dans le forum Général Java
    Réponses: 4
    Dernier message: 25/01/2015, 18h11
  2. [EJB3] [Stratégie] Mise en oeuvre du pattern observer
    Par raggadoll dans le forum Java EE
    Réponses: 5
    Dernier message: 27/05/2008, 14h23
  3. [MVC | WPF] Mise en oeuvre du MVC Pattern
    Par Nadd dans le forum C#
    Réponses: 2
    Dernier message: 09/02/2008, 00h38
  4. [JMS] Mise en oeuvre
    Par tery dans le forum Java EE
    Réponses: 4
    Dernier message: 21/02/2005, 13h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo