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

Java Discussion :

Patron de conception Composite - implémenter arbres synthétiques abstraits en java


Sujet :

Java

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut Patron de conception Composite - implémenter arbres synthétiques abstraits en java
    Bonjour,

    j'étudie actuellement les patrons de conception et j'essaie d'implémenter les exemples du cours en java pour mieux comprendre
    par exemple, nous avons étudié le patron composite/composant sur les arbres synthétiques abstraits

    et je n'obtient pas le résultat attendu
    par exemple, (2+4)/3+8 devrait me donner 10 et moi j'obtiens 17
    le Noeud N11 ne se calcule pas (résultat = 0 au lieu de 2)

    le problème se situe probablement dans la classe Operation car nous n'avons pas vu le code en cours
    jtout ce que l'on avait, c'est le diagramme de classe qui nous indiquait :
    - 2 attributs :
    private nomOP : String
    private mesOp : Map<String,Operation>

    3 méthodes :
    private Operation()
    public getInstance(String) : Operation
    public evaluation(int,int) : int

    ce que j'ai compris (mais je me trompe peut-être) c'est que Map permets de définir la liste des opérations essentielles (addition, soustraction, multiplication et division)

    d'avance merci pour votre aide


    interface Noeud
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public interface Noeud {
    	public int evaluation();
    }
    classe NoeudValeur
    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
     
    public class NoeudValeur implements Noeud{
     
    	private int valeur;
     
    	public NoeudValeur(int valeur){
    		this.valeur=valeur;
    	}
     
    	@Override
    	public int evaluation() {
    		return this.valeur;
    	}
     
    	public String toString(){
    		return ""+this.valeur;
    	}
    }
    classe NoeudBinaire
    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
    22
    23
    24
    25
    26
    27
     
    public class NoeudBinaire implements Noeud {
     
    	public Noeud n1;
    	public Noeud n2;
    	public Operation monOp;
     
    	private NoeudBinaire(){}
     
    	public NoeudBinaire(Noeud n1, Noeud n2, Operation o){
    		this.n1=n1;
    		this.n2=n2;
    		this.monOp=o;
    	}
     
    	@Override
    	public int evaluation() {
    		int v1 = n1.evaluation();
    		int v2 = n2.evaluation();
    		return monOp.evaluation(v1, v2);
    	}
     
    	@Override
    	public String toString() {
    		return ""+this.evaluation();
    	}
    }
    classe Operation
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    public class Operation {
     
    	private static String nomOP;
    	private static Map<String,Operation> mesOP = new HashMap<String,Operation>();
     
    	//on créé une Map qui contient les opérations élémentaires
    	private Operation(){
    		mesOP.put("opAdd", this);
    		mesOP.put("opSou", this);
    		mesOP.put("opMul", this);
    		mesOP.put("opDiv", this);
    	}
     
    	//constructeur public qui permet de créé un objet Operation
    	//appel à la methode getInstance(String) qui créé l'objet à l'aide
    	//du constructeur privé
    	public Operation(String operation){
    		this.getInstance(operation);
    		this.nomOP=operation;
    	}
     
    	//on définit les opérations élémentaires
    	public int evaluation(int v1, int v2){
    		if(nomOP=="addition")
    			return (v1+v2);
    		if(nomOP=="soustraction")
    			return (v1-v2);
    		if(nomOP=="division")
    			return (v1/v2);
    		if(nomOP=="multiplication")
    			return (v1*v2);
    		return 0;
    	}
     
    	//retourne une opération
    	public static Operation getInstance(String operation){
    		return new Operation();
    	}
    }
    code application
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    NoeudValeur N1111 = new NoeudValeur(2);
    NoeudValeur N1112 = new NoeudValeur(4);
    Operation opAdd1 = new Operation("addition");
    NoeudBinaire N111 = new NoeudBinaire(N1111,N1112,opAdd1);
     
    NoeudValeur N112 = new NoeudValeur(3);
    Operation opDiv1 = new Operation("division");
    NoeudBinaire N11 = new NoeudBinaire(N111,N112,opDiv1);
     
    NoeudValeur N12 = new NoeudValeur(8);
    Operation opAdd2 = new Operation("addition");
    NoeudBinaire N1 = new NoeudBinaire(N11,N12,opAdd2);

  2. #2
    Nouveau membre du Club Avatar de Runhide
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2017
    Messages : 35
    Points : 36
    Points
    36
    Par défaut Une erreur classique :)
    Bonjour,

    Une erreur qui est arrivé à tout bon développeur java.

    Lorsque que tu évalues une chaîne de caractères, que cela soit via une référence String myString ou une chaîne de caractères bruts entre crochets "blabla" (qui en réalité équivaut à un new instance() de la classe String), il faut faire attention à la méthode employée.

    Là, quand tu évalues avec nomOp=="division", en réalité tu évalues la réference de la classe encapsulante String, et non pas son contenu.

    Si tu veux comparer les caractères brut, il faut utiliser nomOp.equals("division"). La méthode equals() est coder de sorte à ce quel compare le contenue des chaînes de caractères, et non pas les références de leur classe encapsulantes.

    Elle te renverra soit true si les chaînes sont identiques, false dans le cas contraire .

    Et dans ton cas, elle finira par bien renvoyé true pour division et ton calcul sera bon.

    Corrige les 4 évaluations dans ta classe operation et redis nous ce que cela donne.

  3. #3
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    merci pour ta réponse et ton aide
    j'ai modifié dans le code la méthode de comparaison mais cela ne change rien

    mon jeu test
    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
    22
    23
     
    NoeudValeur N1111 = new NoeudValeur(2);
    //System.out.println(N1111);
    NoeudValeur N1112 = new NoeudValeur(4);
    //System.out.println(N1112);
    Operation opAdd1 = new Operation("addition");
    NoeudBinaire N111 = new NoeudBinaire(N1111,N1112,opAdd1);
    System.out.println("Résultat attendu : 6 --> "+N111);
    //System.out.println("("+N111+"+"+N1112+") = "+N111.evaluation());
     
    NoeudValeur N112 = new NoeudValeur(3);
    //System.out.println(N112);
    Operation opDiv1 = new Operation("division");
    NoeudBinaire N11 = new NoeudBinaire(N111,N112,opDiv1);
    System.out.println("Résultat attendu : 2 --> "+N11);
     
    NoeudValeur N12 = new NoeudValeur(8);
    //System.out.println("N11 ="+N11);
    //System.out.println("N12 ="+N12);
    Operation opAdd2 = new Operation("addition");
    NoeudBinaire N1 = new NoeudBinaire(N11,N12,opAdd2);
    System.out.println("Résultat attendu : 10 --> "+N1);
    //System.out.println(N1.evaluation());
    j'obtiens :
    Résultat attendu : 6 --> 6
    Résultat attendu : 2 --> 0
    Résultat attendu : 10 --> 17

    en gros, quand je passe des NoeudValeur dans un NoeudBinaire çà fonctionne mais quand je passe un NoeudBinaire et un NoeudValeur dans un NoeudBinaire (récursivité) çà ne fonctionne pas...
    une autre idée ?

  4. #4
    Membre expérimenté Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 592
    Points : 1 679
    Points
    1 679
    Par défaut
    Bonjour,

    Quelle est l'utilité de la Map mesOp ? Elle ne paraît pas utilisée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private static Map<String,Operation> mesOP = new HashMap<String,Operation>();
     
    	//on créé une Map qui contient les opérations élémentaires
    	private Operation(){
    		mesOP.put("opAdd", this);
    		mesOP.put("opSou", this);
    		mesOP.put("opMul", this);
    		mesOP.put("opDiv", this);
    	}
    Et le constructeur privé est-il utile ?

    Et Operation.getInstance est appelée par le constructeur public Operation( String operation ) mais le paramètre n'est pas utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //retourne une opération
    	public static Operation getInstance(String operation){
    		return new Operation();
    	}
    Enfin, ce paramètre 'operation' est plutôt un 'codeOperation', étant un String passé à un objet Operation.

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/03/2014, 00h26
  2. Implémenter le patron de conception DAO par les tests
    Par thierryler dans le forum Général Java
    Réponses: 7
    Dernier message: 02/01/2013, 14h37

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