Topic de SangreLatino :

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

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/2/1632863743-1603585766-bikini.jpg https://image.noelshack.com/fichiers/2021/39/2/1632863757-1603585772-cul1.jpeg https://image.noelshack.com/fichiers/2021/39/2/1632863773-1602108343-1.jpeg https://image.noelshack.com/fichiers/2021/39/2/1632863789-1603585778-cul2.jpeg https://image.noelshack.com/fichiers/2021/39/2/1632863800-1602108375-fetichistes.jpg
J'ai regardé les culs, merci :ok:
Je suis desco mais up pour les culs :ok:

Le 28 septembre 2021 à 23:18:20 :
J'ai regardé les culs, merci :ok:

Le 28 septembre 2021 à 23:18:37 :
Je suis desco mais up pour les culs :ok:

Merci mes kheys :oui:

Le 28 septembre 2021 à 23:18:49 :
merci

C'est moi qui vous remercie :ok:

j'ai compris juste les images :bave:
63 ghosts qui réfléchissent :hap:
Pourquoi tu fais une getinstance au lieu de juste mettre le string de l'opération dans le noeud ?

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 suis toujours là, ne vous inquiétez pas si vous cherchez la solution :)

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

Veirifie la liste mesOp pour voir si ton " diff " est enregistré

Le 28 septembre 2021 à 23:34:26 :
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

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'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

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 )

UP pour les culs mon bon khey

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'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

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

https://image.noelshack.com/fichiers/2021/39/2/1632865359-capture-d-ecran-du-2021-09-28-23-42-25.png

Je ne trouve aucun diff quand je débogue le programme :(

même pour n2 en dessous :(

Déjà si on te demande de faire un singleton c'est que celui qui fait lénoncé ne maîtrise pas m'orienté objet

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
En ligne sur JvArchive 601