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 :

Intérêt de l'accesseur /mutateur ?


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Points : 13
    Points
    13
    Par défaut Intérêt de l'accesseur /mutateur ?
    Je ne comprends pas un truc

    Dans le main je crée par exemple un objet "client"
    Client client1=new Client();

    Je peux ensuite décider que
    client1.nom="Dupont";

    Mais je lis que c'est "dangereux". Pourquoi donc ?
    Ensuite je lis qu'il faut , pour éviter ce danger, créer des mutateurs, soit dans la classe Client, ajouter une méthode genre
    public ecrireNom(String nomClient);

    Mais en quoi donc cela changerait la dangerosité de l'affaire ? on ne fait que décaler la zone de dangerosité, non ?

    idem pour l'accesseur: pourquoi ne pas directement utiliser
    nom=client1.nom; ?

  2. #2
    Membre régulier
    Femme Profil pro
    Développeur Java
    Inscrit en
    Août 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2013
    Messages : 61
    Points : 105
    Points
    105
    Par défaut
    Pour commencer, ton "mutateur" te permet de faire des tests, donc tu encapsule en quelque sorte une manipulation que tu aurais du faire dans ton code, et souvent à plein plein plein d'endroits, donc pas facile à maintenir par la suite...

    Il en va de même pour les accesseurs, tu peux très bien imaginer un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public String getNom(){
         String str;
         if(this.role == AGENT_SECRET ){
            str = "identité indisponible";
         }else{
             str = this.nom;
         }
         return str;
    }
    Voilà une des raisons

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par CrikTeCroque Voir le message
    Pour commencer, ton "mutateur" te permet de faire des tests, donc tu encapsule en quelque sorte une manipulation que tu aurais du faire dans ton code, et souvent à plein plein plein d'endroits, donc pas facile à maintenir par la suite...

    Il en va de même pour les accesseurs, tu peux très bien imaginer un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public String getNom(){
         String str;
         if(this.role == AGENT_SECRET ){
            str = "identité indisponible";
         }else{
             str = this.nom;
         }
         return str;
    }
    Voilà une des raisons
    Donc si je comprends bien l'intérêt de déplacer la fonction d'écriture du nom ailleurs réside dans la possibilité d'avoir un traitement plus complet en rajoutant automatiquement d'autres choses/actions. Par exemple, sans rentrer dans l'espionnage , on pourrait simplement formater pour qu'il y ait uen majuscule au début du mot.
    Mais en quoi ce serait moins dangereux d'écrire le nom à partir de la classe "main" que de la classe "client" ?

  4. #4
    Membre régulier
    Femme Profil pro
    Développeur Java
    Inscrit en
    Août 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2013
    Messages : 61
    Points : 105
    Points
    105
    Par défaut
    La question de la visibilité est un sujet croustillant, aussi, ce que je t'en dit n'engage que moi

    Déjà tu as le droit d'être un kawabunga sans peur et sans reproche et de tout mettre en public, mais c'est dangereux

    Pour moi une classe doit être maîtresse de ses attributs, si ce sont les autres qui décident de leur valeur, c'est peut être que l'attribut n'est pas au bon endroit. Ça nous fait déjà un petit repère de conception, en ce qui me concerne ça m'aide

    De plus si ta classe est bien faite, les attributs ont une cohérence entre eux..

    une classe Carre par exemple avec int h et int w (oui c'est bête mais parlant )

    si tu laisses la classe PierrePaulJacques dire que moncarre.w = 2 ... tu vas avoir un p'tit problème à l'affichage quand ta classe PowerOfFlower va vouloir afficher

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    monpanelcarre.setW(moncarre.w) ;
    monpanelcarre.setH(moncarre.h) ;
    Bon dans une toute chtite appli, tu peux gérer ça "en dur", mais quand tu te retrouves avec des classes par ci des classes par là, et je te parles pas des multi-threads... tu risques vite de générer des erreurs et tu mettras du temps à en trouver la source.

    De plus ton objet est plus complet s'il s'auto-gère, tu auras peut être alors le plaisir de le réutiliser plus tard ailleur dans d'autres applis

    Oulà je dois aller faire les PASTAAAA !!

    Bonne soirée

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Merci.

    Je crois que j'ai compris: on doit intégrer au maximum dans la classe toutes les fonctions qui s'y rapporteront pour:
    - une meilleure lisibilité
    - un contrôle non redondant
    - éviter qu'il soit modifié ailleurs par un processus mal défini ou mal synchronisé

    Donc à partir de maintenant je vais procéder comme ça

  6. #6
    Membre régulier
    Femme Profil pro
    Développeur Java
    Inscrit en
    Août 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2013
    Messages : 61
    Points : 105
    Points
    105
    Par défaut
    Bon je ne t'ai pas tout dit non plus j'avoue

    il y a aussi le problème de ce que tu lances dans le monde impitoyable de ton programme quand tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Machin monmachin = truc.sonmachin;
    Si je me met à te parler de référence, ça te fais quoi?

  7. #7
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Citation Envoyé par orphee03 Voir le message
    Merci.

    Je crois que j'ai compris: on doit intégrer au maximum dans la classe toutes les fonctions qui s'y rapporteront pour:
    - une meilleure lisibilité
    - un contrôle non redondant
    - éviter qu'il soit modifié ailleurs par un processus mal défini ou mal synchronisé

    Donc à partir de maintenant je vais procéder comme ça
    bien formulé ... mais il faut tirer les arguments jusqu'au bout.
    pour reprendre ton exemple tu pourrais avoir:
    - des champs immuables (pas de setNom(String nom) pour le Client qui sera créé une fois pour toute avec un nom)
    - des champs qui ne sont pas modifiables directement (pas de setSolde(montant) pour un compte en banque: la valeur n'est modifiable qu'à partir des opération retrait et depot)
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

Discussions similaires

  1. Accesseur / Mutateur
    Par VanLoc dans le forum C++
    Réponses: 13
    Dernier message: 08/02/2011, 11h10
  2. [NetBeans 6.9] probleme accesseurs-mutateurs
    Par stc074 dans le forum NetBeans
    Réponses: 0
    Dernier message: 31/10/2010, 16h33
  3. Mutateur et accesseur sur énumération
    Par stallaf dans le forum Débuter
    Réponses: 13
    Dernier message: 17/08/2010, 13h44
  4. [Doc] Mutateurs/Accesseurs PHP5, comment faites vs ?
    Par ePoX dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 28/02/2006, 01h34
  5. Outils pour creer les accesseurs et les mutateurs
    Par MarieMtl dans le forum MFC
    Réponses: 3
    Dernier message: 03/10/2005, 17h03

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