IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Portée de variable


Sujet :

avec Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Portée de variable
    Bonjour,

    J'ai récemment eu un cours d'initiation à la programmation orientée objet et j'ai donc quelques bases en java.
    J'essaye de créer un jeu d'énigme simple qui pose une image, une question, un Textfield ou entrer la réponse et un bouton pour vérifier.
    J'avais pensé le réaliser avec le state pattern, chaque étape de l'énigme étant un état, renvoyant les 3 variables: l'image, la question et la réponse de l'énigme.

    Seulement, j'ai toujours eu une lacune avec les variables, j'ai encore quelques difficultés avec les portées et les durées de vie. (oui, même si c'est la base -_-)

    Bref, voila mon problème:

    J'ai 3 classes, une avec mon interface graphique, une qui gère le bouton et une autre avec le modèle du jeu.

    le bouton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    package controler;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import model.ModelEnigme;
     
    public class NextActionListener implements ActionListener {
    	public void actionPerformed(ActionEvent arg0) {
    			ModelEnigme me = new ModelEnigme();
    		me.next();
    	}
    }
    Et le modèle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    package model;
    import java.util.ArrayList;
    import java.util.List;
    import javax.swing.JLabel;
     
    public class ModelEnigme{
     
    	public int = 1;
     
    public ModelEnigme(){
     
    }
    	public void next() {
    	 if(i == 1){	
    		System.out.println("phase n° " +i);
    		 i++;
    	 }
    	 else if (i == 2){
    		 System.out.println("phase n° " +i);
    		 i++;
    	 }
    	 else if (i == 3){
    		 System.out.println("phase n° " +i);
    		 i++;
    	 }
    	 else if (i == 4){
    		 System.out.println("phase n° " +i);
    		 i++;
    	 }
    	 else if (i == 5){
    		 System.out.println("phase n° " +i);
    		 i++;
    	 }
    	 else if (i == 6){
    		 System.out.println("phase n° " +i);
    		 i++;
    	 }
    	 else{
    		 System.out.println("Jeu fini ! (" +i +")");
    		 i++;	 
    	 }
    	}
    }
    Je compte remplacer les "if/else" de la méthode "next" par le code qui sert à gérer les états, avec l'interface etc...

    Par contre, quand je fais le test pour voir si ma variable change bien, si elle est bien incrémentée, elle reste à la valeur 1 a chaque fois ...

    Quelqu'un pourrait m'aider à régler mon petit problème et par la même occasion, critiquer mon code, me dire si j'ai pris la bonne architecture de départ, etc... pour que je puisse m'améliorer.

    Merci

  2. #2
    Membre habitué
    Homme Profil pro
    En rupture avec la societé
    Inscrit en
    Novembre 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : En rupture avec la societé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 144
    Points : 194
    Points
    194
    Par défaut
    bonsoir

    ta variable i dans ta classe n'est pas déclarer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public int = 1; ???

    tu un problème ! a chaque action tu instancie un objet de ton model, donc obligatoirement ta variable d'instance sera toujours a un.

    le remede serait plutot une variable de classe, qui, d'une instance objet a un autre conserve la valeur de i.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    class Variable {
     
         //tu declare une variable class
        private static int i = 0;
     
        //Methode classe pour remettre ta variable a zero sans instance
        public static void Reset()
        {
            i =0;
        }
     
        //Methode d'instance
        public int TotalPoint(){
            return i;
        }
     
        public void next() {
    	 if(i == 1){	
    		System.out.println("phase n° " +i);
    		 i++;
    	 }
    	 else if (i == 2){
    		 System.out.println("phase n° " +i);
    		 i++;
    	 }
    	 else if (i == 3){
    		 System.out.println("phase n° " +i);
    		 i++;
    	 }
    	 else if (i == 4){
    		 System.out.println("phase n° " +i);
    		 i++;
    	 }
    	 else if (i == 5){
    		 System.out.println("phase n° " +i);
    		 i++;
    	 }
    	 else if (i == 6){
    		 System.out.println("phase n° " +i);
    		 i++;
    	 }
    	 else{
    		 System.out.println("Jeu fini ! (" +i +")");
    		 i++;	 
    	 }
        }
     
    }
     
    public class MainVariable{
     
        public static void main(String args[]){
     
            for(int j = 0; j < 10; j++){
                Variable v = new Variable();
                v.next();
                System.out.println(String.format("Points : %d", v.TotalPoint()));
            }
        }
    }

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Nyaris Voir le message
    le bouton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    package controler;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import model.ModelEnigme;
     
    public class NextActionListener implements ActionListener {
    	public void actionPerformed(ActionEvent arg0) {
    			ModelEnigme me = new ModelEnigme();
    		me.next();
    	}
    }
    Ca n'a pas de sens. Tu crée un nouveau ModelEnigme à chaque fois, donc à chaque fois tu repart de zéro. Ton problème n'a rien à voir avec la portée des variable. Tu n'a juste pas compris que chaque instance d'un objet a ses données bien à elle, qu'elle ne partage pas avec les autres instances

    Tu dois transférer ton modèle de travail à ton NextActionListener, par exemple en la passant dans le constructeur, et l'y stocker pour y avoir accès quand on appelera action performed.

    Et résoudre le problème avec une variable statique, c'est résoudre le problème sans rien avoir compris à la POO.

  4. #4
    Membre habitué
    Homme Profil pro
    En rupture avec la societé
    Inscrit en
    Novembre 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : En rupture avec la societé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 144
    Points : 194
    Points
    194
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Et résoudre le problème avec une variable statique, c'est résoudre le problème sans rien avoir compris à la POO.
    je suis entièrement d'accord avec toi mais, si je tiens compte purement du contexte du code présenté et de la demande.

    en quoi une variable de class gene a la comprehension de la poo ?

    il va falloir me donner énormément de précisions.
    merci

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Les méthode statiques / champ statiques nient simplement l'existance des objets puisqu'on perd leur réutilisabilité (plus possible d'avoir plusieurs instances) et on perd l'héritage (les variables / méthodes statique en java ne sont pas héritées) De plus ici, son problème était clairement l'incompréhension de comment conserver et continuer à manipuler son instance depuis deux objets différents.
    Mettre son int en statique amène en tout logique à devoir mettre son next en statique aussi, du coup on ne crée plus d'instance, du coup la résolution de l'énigme devient quelque chose de global au projet du coup
    -> pas question d'avoir deux énigmes en même temps
    -> pas question d'avoir plusieurs joueurs du coup
    -> et on se retrouve à programmer comme en C avec des méthodes globales et un état global.

  6. #6
    Membre habitué
    Homme Profil pro
    En rupture avec la societé
    Inscrit en
    Novembre 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : En rupture avec la societé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 144
    Points : 194
    Points
    194
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Mettre son int en statique amène en tout logique à devoir mettre son next en statique aussi, du coup on ne crée plus d'instance, du coup la résolution de l'énigme devient quelque chose de global au projet du coup
    -> pas question d'avoir deux énigmes en même temps
    -> pas question d'avoir plusieurs joueurs du coup
    Effectivement, j'ai pas poussé la réflexion aussi loin.

    je remet le point que j'ai supprimé (lol)

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Ah parfait, merci de vos réponses, j'ai résolu le problème.

    Ca n'a pas de sens. Tu crée un nouveau ModelEnigme à chaque fois, donc à chaque fois tu repart de zéro. Ton problème n'a rien à voir avec la portée des variable. Tu n'a juste pas compris que chaque instance d'un objet a ses données bien à elle, qu'elle ne partage pas avec les autres instances

    Tu dois transférer ton modèle de travail à ton NextActionListener, par exemple en la passant dans le constructeur, et l'y stocker pour y avoir accès quand on appelera action performed.
    Merci pour l'indication, je prend note.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FLASH MX] Portée des variables ???
    Par mic79 dans le forum Flash
    Réponses: 2
    Dernier message: 08/02/2005, 10h21
  2. Portée des variables vbscript vers ASP
    Par Immobilis dans le forum ASP
    Réponses: 3
    Dernier message: 03/11/2004, 10h14
  3. [XSL]Problème de portée des variables
    Par djulesp dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 17/09/2004, 10h34
  4. [Portée] portée des variables
    Par parksto dans le forum Langage
    Réponses: 7
    Dernier message: 09/05/2004, 21h05
  5. [FLASH MX 2004][XML]portée de variable
    Par marco_ dans le forum Flash
    Réponses: 8
    Dernier message: 29/04/2004, 15h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo