[CUL 10/10][AIDE] Problème Patron COMPOSITE JAVA
SuppriméSalut les kheys,
J'ai des problèmes de compréhension évidents sur cet exercice sur le patron Composite
Des Culs sont disponibles en dessous pour vous récompenser, je vous remercie pour votre aide
Le but étant de faire le code fonctionnel du diagramme ci-dessous :
Diagramme :
Par rapport au diagramme, déjà j'ai des questions :
- Pourquoi il y a un constructeur privé de NoeudBinaire ?
- À quoi sert evaluation(int, int) : int dans le programme ?
Et j'ai un problème dans mon programme : en gros mon Operation.getInstance(String) ne varie pas dans mes tests et reste à add et du coup je me retrouve avec ça... 18 au lieu de 2 pour la dernière opération.
NB : le tableau associatif de Operation.java est privé mais je l'ai passé en public pour pouvoir effectuer mes tests
Output du Main.java
NoeudValeur = 4
Résultat 5+3 : 8
Résultat (10+2)/6 : 18
Main.java (mes tests)
package patroncompositeexercice;
public class Main {
public static void main(String[] args) {
// Test NoeudValeur
Noeud n = new NoeudValeur(4);
System.out.println("NoeudValeur = " + n.evaluation());
// Test NoeudBinaire (5+3)
Noeud expression1 = new NoeudBinaire(new NoeudValeur(3), new NoeudValeur(5), Operation.getInstance("add"));
System.out.println("Résultat 5+3 : " + expression1.evaluation());
// Test NoeudBinaire (10+2)/6
Noeud expression2
= new NoeudBinaire(
new NoeudBinaire(
new NoeudValeur(10),
new NoeudValeur(2),
Operation.getInstance("add")
),
new NoeudValeur(6),
Operation.getInstance("diff")
);
System.out.println("Résultat (10+2)/6 : " + expression2.evaluation());
}
}
NoeudBinaire.java
package patroncompositeexercice;
import java.util.Map;
import java.util.Map.Entry;
public class NoeudBinaire implements Noeud {
private Noeud n1;
private Noeud n2;
private Operation monOP;
public NoeudBinaire(Noeud n1, Noeud n2, Operation op) {
this.n1 = n1;
this.n2 = n2;
this.monOP = op;
}
private NoeudBinaire() {
}
@Override
public int evaluation() {
Integer resultat = null;
switch (getKey(Operation.mesOP, monOP)) {
case "add":
resultat = n1.evaluation() + n2.evaluation();
break;
case "minus":
resultat = n1.evaluation() - n2.evaluation();
break;
case "mult":
resultat = n1.evaluation() * n2.evaluation();
break;
case "diff":
resultat = n1.evaluation() / n2.evaluation();
break;
default:
break;
}
return resultat;
}
private <K, V> K getKey(Map<K, V> map, V value) {
for (Entry<K, V> entry : map.entrySet()) {
if (entry.getValue().equals(value)) {
return entry.getKey();
}
}
return null;
}
}
Operation.java
package patroncompositeexercice;
import java.util.HashMap;
import java.util.Map;
public class Operation {
private static Operation instance;
private String nomOP;
public static Map<String, Operation> mesOP = new HashMap<>();
public int evaluation(int i1, int i2) {
Integer resultat = null;
switch (nomOP) {
case "+":
resultat = i1 + i2;
break;
case "-":
resultat = i1 - i2;
break;
case "*":
resultat = i1 * i2;
break;
case "/":
resultat = i1 / i2;
break;
default:
break;
}
return resultat;
}
public static Operation getInstance(String nomOP) {
if (instance == null) {
instance = new Operation(nomOP);
ajouterOperation(nomOP);
}
return instance;
}
private Operation(String nomOP) {
this.nomOP = nomOP;
}
private static void ajouterOperation(String nomOP) {
mesOP.put(nomOP, getInstance(nomOP));
}
}
NoeudValeur.java
package patroncompositeexercice;
public class NoeudValeur implements Noeud {
private int valeur;
public NoeudValeur(int v) {
this.valeur = v;
}
@Override
public int evaluation() {
return this.valeur;
}
}
Les Culs (si vous voulez le topic en échange, c'est possible ) :
Le 28 septembre 2021 à 23:18:20 :
J'ai regardé les culs, merciLe 28 septembre 2021 à 23:18:37 :
Je suis desco mais up pour les culs
Merci mes kheys
Le 28 septembre 2021 à 23:18:49 :
merci
C'est moi qui vous remercie
Le 28 septembre 2021 à 23:24:20 :
Pourquoi tu fais une getinstance au lieu de juste mettre le string de l'opération dans le noeud ?
Parce que je suis obligé, comme montré dans l'énoncé, d'utiliser le singleton Operation et getInstance et modifier l'objet en fonction de si c'est add, minus, mult, diff
La modification d'opérateur n'est pas effective et reste à add ici
Je up le resultat m'interesse
Ma theorie c'est qu'il y a un probleme avec getInstance
Genre si instance != null, il ne recrée pas d'objet Operation, donc à tous les coups tu gardes le même
Le 28 septembre 2021 à 23:34:26 :
Je up le resultat m'interesseMa theorie c'est qu'il y a un probleme avec getInstance
Genre si instance != null, il ne recrée pas d'objet Operation, donc à tous les coups tu gardes le même
J'ai vérifié dans mes tests et ça créé bel et bien qu'une et qu'une seule instance avec le getInstance
Oui, d'où le but d'un singleton qui créé une unique instance d'Operation
Du coup, il faut que la modification d'opérateur soit réalisée mais je suis un peu perdu pour le coup
Le 28 septembre 2021 à 23:35:31 :
Veirifie la liste mesOp pour voir si ton " diff " est enregistré
Il n'y a que le premier add qui est enregistré
D'où le fait que la taille de mesOP donne 1
Le 28 septembre 2021 à 23:36:29 :
Le 28 septembre 2021 à 23:34:26 :
Je up le resultat m'interesseMa theorie c'est qu'il y a un probleme avec getInstance
Genre si instance != null, il ne recrée pas d'objet Operation, donc à tous les coups tu gardes le même
J'ai vérifié dans mes tests et ça créé bel et bien qu'une et qu'une seule instance avec le getInstance
Oui, d'où le but d'un singleton qui créé une unique instance d'Operation
Du coup, il faut que la modification d'opérateur soit réalisée mais je suis un peu perdu pour le coup
Oui mais tu prends en compte le changement d'operatil seulement si instance==null
Et quand tu appelles avec " diff ", instance n'est pas null car tu as deja appelé la fonction 2 fois
Le 28 septembre 2021 à 23:38:09 :
Le 28 septembre 2021 à 23:35:31 :
Veirifie la liste mesOp pour voir si ton " diff " est enregistréIl n'y a que le premier add qui est enregistré
D'où le fait que la taille de mesOP donne 1
Ça confirme ce que je dis kheyou
Le
" if (instance==null) " ne passe qu'une fois
Donc apres quand tu reappelles getInstance il ne lance plus les lignes
new Operagion(Op)
AjouterOperation(Op)
Et passe direct à return instance (qui est un " add " depuis le 5+3 )
Le 28 septembre 2021 à 23:38:37 :
Le 28 septembre 2021 à 23:36:29 :
Le 28 septembre 2021 à 23:34:26 :
Je up le resultat m'interesseMa theorie c'est qu'il y a un probleme avec getInstance
Genre si instance != null, il ne recrée pas d'objet Operation, donc à tous les coups tu gardes le même
J'ai vérifié dans mes tests et ça créé bel et bien qu'une et qu'une seule instance avec le getInstance
Oui, d'où le but d'un singleton qui créé une unique instance d'Operation
Du coup, il faut que la modification d'opérateur soit réalisée mais je suis un peu perdu pour le coup
Oui mais tu prends en compte le changement d'operatil seulement si instance==null
Et quand tu appelles avec " diff ", instance n'est pas null car tu as deja appelé la fonction 2 fois
Je ne trouve aucun diff quand je débogue le programme
même pour n2 en dessous
Données du topic
- Auteur
- SangreLatino
- Date de création
- 28 septembre 2021 à 23:17:31
- Date de suppression
- 29 septembre 2021 à 01:15:45
- Supprimé par
- Auteur
- Nb. messages archivés
- 38
- Nb. messages JVC
- 38