Messages de SangreLatino

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 :up: pour les culs

C'est très gentil khey, merci à toi :ok:

:-(
:up: svp
:up:
En uppant :up:

J'espère que vous cherchez :hap:

Et merci si c'est le cas :ok:

Le 29 septembre 2021 à 14:06:05 :

[13:59:15] <SangreLatino>
Uppercut :up:

Je up pour la ref

Merci kheyou :ange:

:up:
Uppercut :up:
Oui je continue les :up:

Le 29 septembre 2021 à 13:46:30 :
Tiens du design pattern, ça me rappelle mes études

Si ç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 :ok:

Bide même avec des culs :)
S'il vous plaît :)
:up:
:up: a l'aide

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 :ok:

Le but étant de faire le code fonctionnel du diagramme ci-dessous :

Diagramme :
https://image.noelshack.com/fichiers/2021/39/2/1632862737-u.png

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 :up: le topic en échange, c'est possible :) ) :

https://image.noelshack.com/fichiers/2021/39/3/1632914848-1602108343-1.jpeghttps://image.noelshack.com/fichiers/2021/39/3/1632914855-1603585766-bikini.jpghttps://image.noelshack.com/fichiers/2021/39/3/1632914861-1603585772-cul1.jpeghttps://image.noelshack.com/fichiers/2021/39/3/1632914870-1603585778-cul2.jpeghttps://image.noelshack.com/fichiers/2021/39/3/1632914877-1602108375-fetichistes.jpghttps://image.noelshack.com/fichiers/2021/39/3/1632914943-1602108362-3.jpg

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 :cimer:
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 :ok:

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 :hap:

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 :hap:

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 StackOverflow :hap:

Il faudrait remettre le instancce == null car en cours on a appris à écrire comme ça les singletons :hap:

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 :-(