Le 29 septembre 2021 à 14:34:08 :
Il est privé pour qu'on ne l'utilise pas et qu'on utilise uniquement celui qui est public.
Oui mais je suis obligé de l'utiliser en dehors de ma classe pour trouver à quelle opération correspond celui en public (avec NoeudBinaire.java et la méthode getKey)
Le 29 septembre 2021 à 14:31:52 :
Je peux pas t’aider mais je te pour les culs
C'est très gentil khey, merci à toi
J'espère que vous cherchez
Et merci si c'est le cas
Le 29 septembre 2021 à 14:06:05 :
[13:59:15] <SangreLatino>
UppercutJe up pour la ref
Merci kheyou
Le 29 septembre 2021 à 13:46:30 :
Tiens du design pattern, ça me rappelle mes étudesSi ça peut te rassurer lop , c’est un truc que tu n’utiliseras plus jamais dans la vie active
Ça me rassure parce que l'usage du singleton ici me pose vraiment problème et j'aurai plus jamais affaire à des design patterns
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
Donc le problème doit sans doute venir de ma classe Operation (et de getInstance(String) ?) mais je sais pas comment le régler
Le putain de Singleton pose problème à coup sur
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 29 septembre 2021 à 00:39:05 :
Pour le faire en respectant le schéma que tu as donné, il faut me payer ou me donner un truc en échange; j'ai beaucoup de travail qui m'attend demain.Je suis très curieux de savoir d'où vient cet exercice, et quel en est la correction
La correction je ne l'ai pas
L'exercice vient d'un polycopié universitaire (je ne peux en dire plus)
J'imagine que 2 culs ne suffisent pas en échange
Je ne payerai pas pour cet exercice, j'espère que tu comprendras
Mais sinon je supprime le topic et je referai le même topic demain, à moins que j'ai une illumination
Donc le problème vient de la classe Operateur, je vois...
Le 29 septembre 2021 à 00:23:44 :
<code>package com.company;public class OperationNode {
private String operationType;
private OperationNode leftOperationNode;
private OperationNode rightOperationNode;
private Double leafNumber;public OperationNode(String operationType, OperationNode leftOperationNode, OperationNode rightOperationNode) {
this.operationType = operationType;
this.leftOperationNode = leftOperationNode;
this.rightOperationNode = rightOperationNode;
}public OperationNode(double leafNumber) {
this.leafNumber = leafNumber;
}public double getResult(){
if(this.leafNumber!=null)
return this.leafNumber;double result = 0;
double leftOperand = this.leftOperationNode.getResult();
double rightOperand = this.rightOperationNode.getResult();
switch (this.operationType){
case "+": result = leftOperand+rightOperand;break;
case "-": result = leftOperand-rightOperand;break;
case "*": result = leftOperand*rightOperand;break;
case "/": result = leftOperand/rightOperand;break;
default:break;
}
return result;
}}
</code>package com.company;
public class Main {
public static void main(String[] args) {
// write your code here
OperationNode operationNode1 = new OperationNode(
"+",
new OperationNode(10),
new OperationNode(2)
);
OperationNode operationNode2 = new OperationNode("/", operationNode1,
new OperationNode(6));
System.out.println(operationNode2.getResult());
}
}
Le singleton ne sert à rien. Une sorte d'arbre binaire qui a soit une operation soit un nombre parait beaucoup plus simples. Une classe suffit pour ça, et très peu de code
Merci pour ça
Une autre implémentation du diagramme fonctionne parfaitement et plus condensée mais on préfère un putain de Singleton
Le truc c'est que ça respecte pas le diagramme du prof du coup
Mais après le code que t'as produit donne des idées
Le 28 septembre 2021 à 23:59:32 :
Le 28 septembre 2021 à 23:55:25 :
Le 28 septembre 2021 à 23:53:01 :
Le 28 septembre 2021 à 23:50:02 :
Le 28 septembre 2021 à 23:46:15 :
Tu peux pas rajouter à la suite du if(instance==null) (pseudo code fais pas gaffe a la syntaxe)If(instance != null) (un else quoi)
{
Instance.nomOp = nomOp
This.nomOp = nomOp
AjouterOperarion(nomOp)
}Ou juste :
{
Instance = new Operation(nomOp);
}
? Bah oui tu recrees un Operation mais il n'y en a toujours qu'un, comme le sujet demande.Edit : oublie le premier car le instance est private
Mais tu peux le remplacer par un new Operation et ça restera un singleton
https://image.noelshack.com/fichiers/2021/39/2/1632865734-capture-d-ecran-du-2021-09-28-23-48-46.png De cette manière j'imagine
J'ai un problème dans NoeudBinaire.java, et particulièrement dans : switch(getKey(Operation.mesOP, monOP))
EDIT: j'ai rajouté un else finalement :
https://image.noelshack.com/fichiers/2021/39/2/1632865900-capture-d-ecran-du-2021-09-28-23-51-29.png Enleve le if en fait
Dans tous les cas tu vas rajouter ta nouvelle instance
Et oublie pas ton ajouterOperarion sinon MesOp fera la mauvaise taille
https://image.noelshack.com/fichiers/2021/39/2/1632866070-capture-d-ecran-du-2021-09-28-23-54-23.png
Là j'ai une boucle StackOverflowIl faudrait remettre le instancce == null car en cours on a appris à écrire comme ça les singletons
Je suis d'accord mais du coup c'est juste pas adapté...
L'exercice est mal fait du coup selon toi ?
En fait l'usage de Singleton est juse à chier dans cet exo, je comprends pourquoi on voudrait l'utiliser mais comment bien le coder c'est autre chose