Topic de SangreLatino :

[CULS 10/10][AIDE] Exercice PATRON COMPOSITE JAVA

Supprimé

Le 29 septembre 2021 Ă  16:47:30 :
Aidez ce pauvre homme

Cet exercice me donne des frissons :)

Le 29 septembre 2021 Ă  16:49:16 :
je up pour l'effort

Merci clé ! Sympa ! :ok:

Le 29 septembre 2021 Ă  16:53:25 :
Culs de qualité https://image.noelshack.com/fichiers/2021/12/3/1616609713-pessisym1.png

De rien pour ça clé :ok:

Ravi que tu apprécies les culs :oui:

Wah un diagramme.

Je bosse depuis 2 ans et c'est la première fois que j'en revois un :hap:

Le monde pro est codé avec le cul, t'en fais pas.

Le 29 septembre 2021 Ă  13:29:31 :

- Pourquoi il y a un constructeur privé de NoeudBinaire ? :(

Ca signifie qu'il est désactivé

- À quoi sert evaluation(int, int) : int dans le programme ? :(

Une opération effectue un calcul entre 2 nombres, tu auras par exemple une opération "Addition" qui fera chiffre_gauche + chiffre_droit

Le 29 septembre 2021 Ă  16:55:33 :
Wah un diagramme.

Je bosse depuis 2 ans et c'est la première fois que j'en revois un :hap:

Le monde pro est codé avec le cul, t'en fais pas.

Ayaaa, ça bosse pas sans diagramme dans le monde pro, si ? :)

J'ai rien bité a ton message mais merci pour les culs chef + up
    public static Operation getInstance(String nomOP) {
        if (instance == null) {
            instance = new Operation(nomOP);
            ajouterOperation(nomOP);
        }

        return instance;
    }

C'est faux, c'est un singleton pour chaque type d'Operation, c'est à dire que quand tu veux appeler l'opération Soustraction, il faut regarder si cette opération existe bien.

Donc :

    public static Operation getInstance(String nomOP) {
        if (!mesOP.containsKey(nomOP)) {
            final Operation newOp = new Operation(nomOP);
            ajouterOperation(newOp );
        }

        return mesOP.get(nomOP);
    }

Le 29 septembre 2021 Ă  16:55:48 :

Le 29 septembre 2021 Ă  13:29:31 :

- Pourquoi il y a un constructeur privé de NoeudBinaire ? :(

Ca signifie qu'il est désactivé

- À quoi sert evaluation(int, int) : int dans le programme ? :(

Une opération effectue un calcul entre 2 nombres, tu auras par exemple une opération "Addition" qui fera chiffre_gauche + chiffre_droit

Q1: Oui mais qu'elle est son utilité puisqu'on peut créer un NoeudBinaire(Noeud, Noeud, Operation) ? :(

Q2: Cela se réalise dans NoeudBinaire déjà, non ? Chiffre_gauche et chiffre_droit correspondent aux 2 NoeudValeur de NoeudBinaire du coup ? Evaluation(int,int) d'Operation fait clairement doublon avec Evaluation() de NoeudBinaire dans ce cas là :(

Le 29 septembre 2021 Ă  17:00:02 :
<code> public static Operation getInstance(String nomOP) {
if (instance == null) {
instance = new Operation(nomOP);
ajouterOperation(nomOP);
}

return instance;
}</code>

C'est faux, c'est un singleton pour chaque type d'Operation, c'est à dire que quand tu veux appeler l'opération Soustraction, il faut regarder si cette opération existe bien.

Donc :

    public static Operation getInstance(String nomOP) {
        if (!mesOP.containsKey(nomOP)) {
            final Operation newOp = new Operation(nomOP);
            ajouterOperation(newOp );
        }

        return mesOP.get(nomOP);
    }

https://image.noelshack.com/fichiers/2021/39/3/1632928110-capture-d-ecran-du-2021-09-29-17-08-19.png

De telle manière ? :(

J'ai gardé le instance == null sinon j'ai une StackOVerflow error

Par contre en déboguant, la valeur est à null, bizarre :(

L'erreur :
https://image.noelshack.com/fichiers/2021/39/3/1632928455-capture-d-ecran-du-2021-09-29-17-14-09.png

DĂ©bogage:
https://image.noelshack.com/fichiers/2021/39/3/1632928428-capture-d-ecran-du-2021-09-29-17-13-19.png

Le 29 septembre 2021 Ă  17:01:13 :

Le 29 septembre 2021 Ă  16:55:48 :

Le 29 septembre 2021 Ă  13:29:31 :

- Pourquoi il y a un constructeur privé de NoeudBinaire ? :(

Ca signifie qu'il est désactivé

- À quoi sert evaluation(int, int) : int dans le programme ? :(

Une opération effectue un calcul entre 2 nombres, tu auras par exemple une opération "Addition" qui fera chiffre_gauche + chiffre_droit

Q1: Oui mais qu'elle est son utilité puisqu'on peut créer un NoeudBinaire(Noeud, Noeud, Operation) ? :(

Le constructeur privé dans le diagramme UML est là pour indiquer que le constructeur n'est pas accessible (il est privé). Sans ça, cela veut dire qu'on peut instancier une Operation sans arguments, ce qu'on ne veut pas.

Q2: Cela se réalise dans NoeudBinaire déjà, non ? Chiffre_gauche et chiffre_droit correspondent aux 2 NoeudValeur de NoeudBinaire du coup ? Evaluation(int,int) d'Operation fait clairement doublon avec Evaluation() de NoeudBinaire dans ce cas là :(

Non tu comprends mal le principe du pattern Composite, le but est de créer et d'empiler plein de noeuds pour réaliser des opérations, par exemple

(2+4)/3+8 ça donne
final Noeud noeud = new NoeudBinaire(
___new NoeudBinaire(new NoeudValeur(2), new NoeudValeur(4), Operation.getInstance("+")),
___new NoeudBinaire(new NoeudValeur(3), new NoeudValeur(8), Operation.getInstance("+")),
___new Operation.getInstance("/")
)

Le fait d'appeler evaluation() sur un NoeudBinaire va appeler evaluation(int, int) de son Operation, les deux int qu'il passe sont récupéré en faisant un evaluation() des 2 noeuds qu'il stock, dans le cas où il possède des NoeudBinaire ça va refaire une boucle, jusqu'à arriver au cas où il y a 2 NoeudValeur, dans ce cas on se retrouve avec 2 int (car evaluation() de NoeudValeur renvoi sa propre valeur), ce qui permet de réaliser l'opération (dans la classe Opération), et on remonte toute la chaine jusqu'au 1er Noeud, ce qui nous renvoie le résultat (un int).

[13:46:30] <blaskovitch>
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

Les DP je sais pas mais ce gendre d'UML a part pour faire de la doc que personne ne lit tu l'utiliseras jamais.

Le 29 septembre 2021 Ă  17:09:12 :

Le 29 septembre 2021 Ă  17:00:02 :
<code> public static Operation getInstance(String nomOP) {
if (instance == null) {
instance = new Operation(nomOP);
ajouterOperation(nomOP);
}

return instance;
}</code>

C'est faux, c'est un singleton pour chaque type d'Operation, c'est à dire que quand tu veux appeler l'opération Soustraction, il faut regarder si cette opération existe bien.

Donc :

    public static Operation getInstance(String nomOP) {
        if (!mesOP.containsKey(nomOP)) {
            final Operation newOp = new Operation(nomOP);
            ajouterOperation(newOp );
        }

        return mesOP.get(nomOP);
    }

https://image.noelshack.com/fichiers/2021/39/3/1632928110-capture-d-ecran-du-2021-09-29-17-08-19.png

De telle manière ? :(

J'ai gardé le instance == null sinon j'ai une StackOVerflow error

On a pas besoin d'avoir une variable instance dans ta classe. C'est un Singleton assez particulier dans notre cas.
Chaque Operation a son propre nom (nomOP) donc non statique, mais toutes les opérations partagent la même Map (mesOp) qui est donc statique, c'est à dire que quand tu veux faire un getInstance(String), tu vas regarder dans ta Map si elle possède déjà une classe Operation avec ce nom, si ce n'est pas le cas tu la créer, l'ajoute à la Map et tu renvoies cette instance.

Le 29 septembre 2021 Ă  17:16:54 :

Le 29 septembre 2021 Ă  17:01:13 :

Le 29 septembre 2021 Ă  16:55:48 :

Le 29 septembre 2021 Ă  13:29:31 :

- Pourquoi il y a un constructeur privé de NoeudBinaire ? :(

Ca signifie qu'il est désactivé

- À quoi sert evaluation(int, int) : int dans le programme ? :(

Une opération effectue un calcul entre 2 nombres, tu auras par exemple une opération "Addition" qui fera chiffre_gauche + chiffre_droit

Q1: Oui mais qu'elle est son utilité puisqu'on peut créer un NoeudBinaire(Noeud, Noeud, Operation) ? :(

Le constructeur privé dans le diagramme UML est là pour indiquer que le constructeur n'est pas accessible (il est privé). Sans ça, cela veut dire qu'on peut instancier une Operation sans arguments, ce qu'on ne veut pas.

Q2: Cela se réalise dans NoeudBinaire déjà, non ? Chiffre_gauche et chiffre_droit correspondent aux 2 NoeudValeur de NoeudBinaire du coup ? Evaluation(int,int) d'Operation fait clairement doublon avec Evaluation() de NoeudBinaire dans ce cas là :(

Non tu comprends mal le principe du pattern Composite, le but est de créer et d'empiler plein de noeuds pour réaliser des opérations, par exemple

(2+4)/3+8 ça donne
final Noeud noeud = new NoeudBinaire(
___new NoeudBinaire(new NoeudValeur(2), new NoeudValeur(4), Operation.getInstance("+")),
___new NoeudBinaire(new NoeudValeur(3), new NoeudValeur(8), Operation.getInstance("+")),
___new Operation.getInstance("/")
)

Le fait d'appeler evaluation() sur un NoeudBinaire va appeler evaluation(int, int) de son Operation, les deux int qu'il passe sont récupéré en faisant un evaluation() des 2 noeuds qu'il stock, dans le cas où il possède des NoeudBinaire ça va refaire une boucle, jusqu'à arriver au cas où il y a 2 NoeudValeur, dans ce cas on se retrouve avec 2 int (car evaluation() de NoeudValeur renvoi sa propre valeur), ce qui permet de réaliser l'opération (dans la classe Opération), et on remonte toute la chaine jusqu'au 1er Noeud, ce qui nous renvoie le résultat (un int).

J'ai capté pour la Q1 :ok:

D'accord, je vais réfléchir à refaire la méthode evaluation() parce que j'ai pas l'impression que ça appelle evaluation(int, int) d'Operation :ok:

 public class NoeudBinaire implements Noeud {

     [...]

     @Override
     public int evaluation() {
         return this.monOP.evaluation(n1.evaluation(), n2.evaluation());
     }

Ce sera déjà mieux comme ça

Le 29 septembre 2021 Ă  17:24:18 :
<code> public class NoeudBinaire implements Noeud {

[...]

@Override
public int evaluation() {
return this.monOP.evaluation(n1.evaluation(), n2.evaluation());
}</code>

Ce sera déjà mieux comme ça

Merci clé :ok:

Me reste à gérer la StackOVerflow error et je pense que ça va fonctionner :ok:

https://image.noelshack.com/fichiers/2021/39/3/1632929279-capture-d-ecran-du-2021-09-29-17-27-49.png

Le 29 septembre 2021 Ă  17:28:02 :

Le 29 septembre 2021 Ă  17:24:18 :
<code> public class NoeudBinaire implements Noeud {

[...]

@Override
public int evaluation() {
return this.monOP.evaluation(n1.evaluation(), n2.evaluation());
}</code>

Ce sera déjà mieux comme ça

Merci clé :ok:

Me reste à gérer la StackOVerflow error et je pense que ça va fonctionner :ok:

https://image.noelshack.com/fichiers/2021/39/3/1632929279-capture-d-ecran-du-2021-09-29-17-27-49.png

    public static Operation getInstance(String nomOP) {
        if (!mesOP.containsKey(nomOP)) {
            final Operation newOP = new Operation(nomOP);
            mesOP.put(nomOP, newOP);
        }

        return mesOP.get(nomOP);
    }

Données du topic

Auteur
SangreLatino
Date de création
29 septembre 2021 Ă  13:29:31
Date de suppression
29 septembre 2021 Ă  17:53:57
Supprimé par
Auteur
Nb. messages archivés
83
Nb. messages JVC
83
En ligne sur JvArchive 321