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

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 6
    Points : 2
    Points
    2
    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 expérimenté
    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
    Points : 1 745
    Points
    1 745
    Par défaut
    Poste ton code qu'on jette un œil.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 6
    Points : 2
    Points
    2
    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
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 6
    Points : 2
    Points
    2
    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 expérimenté
    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
    Points : 1 745
    Points
    1 745
    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 confirmé Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Points : 649
    Points
    649
    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.

  7. #7
    Membre expérimenté
    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
    Points : 1 745
    Points
    1 745
    Par défaut
    Si tu regarde bien il enlève le premier élément juste après
    Enfin de toute manière, ce n'est pas propre.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Salut,

    Merci pour vos réponses,

    J'ai pris compte de vos conseils et j'ai laissé tomber la récursion ; au final, oui, c'est plus simple avec un simple boucle

    Je vais chercher à produite un objet règle à qui l'on passe la liste de règle, et qui une fois initialisé en représente l'agrégation..

  9. #9
    Membre expérimenté
    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
    Points : 1 745
    Points
    1 745
    Par défaut
    Si tu regardes sur le site dont tu as posté le lien en début de topic ce sont les opérators qui gèrent l'agrégation.

    Constructeur du AND
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public AndSpecification(Specification<T>... specifications) {
        super(specifications);
    }
    Et tu peux ensuite faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Specification specif = new AndSpecification(
        new Regle1(),
        new Regle2(),
        ...
        );

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Mmmm je crois que je vois
    Je me complique la vie donc ?

    En fait je n'ai pas l'habitude d'utiliser les arguments variables

    C'est ca qui me perturbe je crois

  11. #11
    Membre expérimenté
    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
    Points : 1 745
    Points
    1 745
    Par défaut
    Tu peux remplacer les arguments variables par une List si tu préfères.

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