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 :

Vérification erreur/éléments inutiles programme


Sujet :

avec Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 97
    Points : 68
    Points
    68
    Par défaut Vérification erreur/éléments inutiles programme
    Bonjour,

    Quelqu'un pourrait-il regarder s'il y a des erreurs ou des éléments inutiles dans le programme qui suit.

    Merci

    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
    class Personne3{
    	int age;
    	String nom,ntel;
    	Adresse adr;//champ qui se réfère à adresse
    	//le constructeur:
    	Personne3(int a,String n,String t)
    		{
    		age=a;
    		nom=n;
    		ntel=t;
    		}
    	Personne3(int a,String n,String t,int num,String r,String vil){
    		Personne3(a,n,t);
    		adr=new Adresse(num,r,vil);
    		}
    	class Adresse{
    		int numero;
    		String rue;
    		String ville;
    		Adresse(){
    			}
    		Adresse(int num,String r,String vil){
    			numero=num;
    			rue=r;
    			ville=vil;
    			}
    	}
     
    	//le modifieur:
    	void setAge(int ag)
    		{
    		if(age<0) System.out.println("age négatif, impossible");
    		else age=ag;
    		}
    	//l'accesseur:
        	int getAge()
    		{
    		return age;
    		}
    	String getNom()//rendre une valeur accessible en lecture
    		{
    		return nom;
    		}
    	public String toString()	
    		{
    		return("l'age est de "+age);
    		}
    	boolean memeNom(Personne3 p)
    			{//fonction utilisée pour comparer les noms
    			if(nom.equals(p.nom)){
    			return true;
    			}
    			else{
    			return false;
    			}
    			}
    }

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Quel est le problème ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    1. Quand tes setters sont non-triviaux (ie, comportent des tests ou des fonctions en plus du simple set), je te conseille fortement de les utiliser dans ton constructeur plutôt que de faire des affectations.
    Parce que là, tu peux créer une personne d'âge négatif via le constructeur.

    2. Est-il vraiment utile que ta classe Adresse soit interne ? Elle a probablement des utilités ailleurs En plus ça te permettrait de créer un constructeur qui prenne une adresse en argument, c'est moins horrible que 3 arguments en plus pour un total de 6 arguments.

    3. Si certaines données membre sont assorties de getters/setters, il faut les mettre en private, sinon tu peux bypasser ces getters/setters, ce qui en diminue fortement l'intéret !

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 97
    Points : 68
    Points
    68
    Par défaut
    Ok merci. Ainsi j'évite les choses inutiles dans mes programmes.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 97
    Points : 68
    Points
    68
    Par défaut
    Et une variable (je ne sais pas si l'on appelle ça ainsi) qui passe par un getteur est-elle utilisable dans une classe externe (fichier externe)?
    Mes questions sont peut être idotes mais je débute.

    Merci

  6. #6
    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
    a partir du moment ou tu récupère une valeur de retour après avoir appelé une méthode, t'en fais ce que tu veux.

  7. #7
    Membre actif Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Points : 254
    Points
    254
    Par défaut
    Tu devrais eviter le toString pour afficher le champ age et plutot declarer un fonction propre genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public String quelAge(){
    return("l'age est de "+age);
    }
    note: si tu as juste besoin d'afficher l'age tu peu aussi faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void quelAge(){
    system.out.println("l'age est "+age);
    }
    La surcharge de toString serai plus logique pour faire ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public String toString(){
    return (nom+" est agé de "+age+", son num de tel est: "+ntel+",son adresse est "+adr.toString);
    }
    En redefinissant biensur le toString de ton objet adresse.
    Toutefois c'est a eviter car certain objet, notement les element graphique utilise,par defaut, le toString pour l'affichage de l'objet, exemple les JTables.

    donc mieux vaut declarer un fonction propre plutot que de surcharger un fonction dont tu sais au final si elle sera pas utiliser ailleur par defaut..
    La javaDoc est mon amie, elle est la tienne aussi!

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 33
    Points : 40
    Points
    40
    Par défaut
    bonjour
    tu peux peut etre simplifier ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    boolean memeNom(Personne3 p)
    			{//fonction utilisée pour comparer les noms
    			if(nom.equals(p.nom)){
    			return true;
    			}
    			else{
    			return false;
    			}
    			}
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    boolean memeNom(Personne3 p){
    	return nom.equals(p.getnom())
    }

  9. #9
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 133
    Points : 149
    Points
    149
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    1. Quand tes setters sont non-triviaux (ie, comportent des tests ou des fonctions en plus du simple set), je te conseille fortement de les utiliser dans ton constructeur plutôt que de faire des affectations.
    Parce que là, tu peux créer une personne d'âge négatif via le constructeur.
    Le problème n'est pas résolu si tu utilises le setters dans le constructeur. Si tu mets le setter dans le constructeur et que tu donnes un age négatif, alors la variable age ne sera pas initialisée, ce qui est problématique.

    Solution à ca :
    • Donner une valeur à age par défaut au cas ou l'age est négatif
    • Ou, je préfère, créer une méthode statique de création de l'objet Personne, qui renvoie un objet uniquement si les paramètres sont valides, et renvoie null si invalides, et mettre le constructeur en private.
    • Ou balancer dans le constructeur des IllegalArgumentException si les arguments sont invalides

  10. #10
    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
    Voilà une correction que je considère personnellement comme "propre". Idéallement il faudrait aussi des getters/setters sur la classe Adresse
    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
    62
    63
    64
     
    public class Adresse{
        public int numero;
        public String rue;
        public String ville;
        Adresse(){ }
        Adresse(int num,String r,String vil){
            numero=num;
            rue=r;
            ville=vil;
        }
    }
     
    public class Personne3{
        private int age;
        private String nom,tel;
        Adresse adr;//champ qui se réfère à adresse
        //le constructeur:
        Personne3(int a,String n,String t){
            setAge(a);
            setNom(n);
            setTel(t);
        }
        Personne3(int a,String n,String t,Adresse adresse){
            Personne3(a,n,t);
            setAdresse(adresse);
        }
        public Adresse getAdresse() { return adr;}
        public void setAdresse(Adresse adresse) {
            this.adr=adresse;
        }
        public String getTel() { return tel;}
        public void setTel(String tel) {
            this.tel=tel;
        }
        public void setAge(int age){
            if(age<0) 
                throw new IllegalArgumentException("age négatif impossible");
            else 
                this.age=age;
        }
        //l'accesseur:
        public int getAge(){
            return age;
        }
        String getNom() {
            //rendre une valeur accessible en lecture
            return nom;
        }
        public void setNom(String nom) {
            this.nom=nom;
        }
        /* Bon pour du debug seulement
        public String toString(){
            return("l'age est de "+age);
        } */
        public boolean memeNom(Personne3 p){//fonction utilisée pour comparer les noms
            if (p.nom==nom==null)
                return true; // les deux noms sont à null
            if (p.nom==null || nom==null)
                return false; // un seul des noms est à null
            return p.nom.equals(nom); // aucun nom à null
        }
    }
    correction effectuée
    • précision de la portée des champs / méthodes (public / private)
    • indentation
    • correction des erreurs de logique (test d'équalité, test de l'âge)
    • systématisation des getters/setters
    • correction des noms de champs
    • Utilisation du IllegalArgumentException
    • Retrait de la classe interne


    edit: code corrigé (cf adresse et setter incomplet)

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 97
    Points : 68
    Points
    68
    Par défaut
    Ok merci pour vos réponses.

  12. #12
    Membre chevronné
    Avatar de sovo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    1 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 389
    Points : 1 788
    Points
    1 788
    Par défaut
    J'ai quelques incompréhensions/questions avec ton code tchize_

    1. Pourquoi ne pas faire un constructeur avec une variable de type Adresse, vue que tu as déjà fait sortir la classe Adresse ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Personne3(int a,String n,String t,Adresse add){...}
    2. Je vois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setAdresse(new Adresse(num,r,vil));
    mais je ne vois nulle part une méthode SetAdresse

    3. Comment ce fait que ton setter n'a pas de paramètre, il modifie donc quoi ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void setTel() {
            this.tel=tel;
        }
    "Toute question a une reponse. Et chaque reponse est une nouvelle question." Albert EINSTEIN

    En cas de Question resolu, n'oubliez pas

  13. #13
    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 sovo Voir le message
    J'ai quelques incompréhensions/questions avec ton code tchize_

    1. Pourquoi ne pas faire un constructeur avec une variable de type Adresse, vue que tu as déjà fait sortir la classe Adresse ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Personne3(int a,String n,String t,Adresse add){...}
    J'ai péché par paresse, je suis d'accord avec toi, autant faire aussi sortie le new

    mais je ne vois nulle part une méthode SetAdresse

    3. Comment ce fait que ton setter n'a pas de paramètre, il modifie donc quoi
    La fatigue, je corrige mon post

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

Discussions similaires

  1. [Help] Erreurs dans mon programme
    Par Tacha dans le forum Langage
    Réponses: 13
    Dernier message: 02/10/2006, 13h57
  2. erreur dans un programme
    Par krole57 dans le forum Bases de données
    Réponses: 2
    Dernier message: 21/06/2006, 14h30
  3. Erreur dans un programme php pour une connexion à une bdd
    Par gaetan.tranvouez dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 12/06/2006, 21h06
  4. [Debutant][XSL] Erreur de code programmation
    Par SkyDev dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 14/03/2006, 22h38
  5. [Lien]erreur dans mon programme python
    Par durnambule dans le forum Général Python
    Réponses: 11
    Dernier message: 29/01/2004, 14h59

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