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 :

discours sur la methode


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 127
    Par défaut discours sur la methode
    Bonjour,

    encore une question philosophique, mais j'aurai besoin d'une clarification :

    Je débute et je suis en train de terminer mon premier projet, tout marche globalement bien, cool, merci au forum pour tous ces conseils !

    Mais je viens d'echanger mon code avec un autre débutant qui avait un projet similaire et je me rends compte que j'ai sans doute pas fait les choses comme il faut.

    Pour récupérer une variable, pendant que lui codait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    String getString()
    {
    return variableString;
    }
    pour la même utilisation je code (et très souvent en plus) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    nomdelaclasse.variableString;
    Je sais, c'est mal. Mais j'ai beau relire mes tutos préférés, je ne vois pas ce qui me l'interdit. Je pense bien que ça contredit l'esprit d'encapsulation des données de Java, mais quel est le risque? Pourquoi est-ce qu'il vaut mieux passé par une méthode GET que par l'appel direct à la variable recherchée?

    D'avance merci de pas m'accabler d'insultes...

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    En effet, il s'agit d'une question de philosophie

    L'encapsulation est un des piliers de la programmation orientée objet. Elle consiste à réduire la visibilité des attributs afin d'empêcher que ceux-ci ne soient accessibles à tord et à travers.

    Un exemple. Supposons une classe Calculatrice :
    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
     
    public class Calculatrice {
    	private int resultat;
     
    	public int plus(int i) {
    		return resultat += i;
    	}
     
    	public int moins(int i) {
    		return resultat -= i;
    	}
     
    	public int getResultat() {
    		return resultat;
    	}
    }
    Dans ce cas, l'attribut resultat est encapsulé car il n'est pas question d'autoriser quelqu'un à injecter le résultat qu'il veut, celui-ci doit être uniquement le produit des opérations que nous avons implémenté, à savoir la somme et la soustraction.

  3. #3
    Membre éclairé Avatar de EIN-LESER
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2008
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 703
    Par défaut
    ton truc marche (bien que sa soit tres laid lol) tan que ta variable est public mais des que tu a une variable privée (et tu en auras souvent pour une question de securisation des données) tu sera obligé de passer par un get donc autemps prendre les bonnes habitudes dés le debut ^^

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 127
    Par défaut
    Citation Envoyé par verbose Voir le message
    Elle consiste à réduire la visibilité des attributs afin d'empêcher que ceux-ci ne soient accessibles à tord et à travers.
    C'est à dire qu'il peut y avoir des problèmes de piratages, ou il s'agit de s'empecher de faire soi-même des bétises plus tard ?



    Citation Envoyé par €IN-LESER Voir le message
    ton truc marche (bien que sa soit tres laid lol) tan que ta variable est public
    Donc c'est bien un problème d'organisation interne et personnelle au programmeur, y'a t'il des changements en terme de performances ou autre?

    Qu'on se comprenne bien, mon but est pas de remettre en cause cette façon de fonctionner qui effectivement me parait plus propre, mais bien d'intégrer et de comprendre ce système et cette philosophie.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par firgon Voir le message
    C'est à dire qu'il peut y avoir des problèmes de piratages, ou il s'agit de s'empecher de faire soi-même des bétises plus tard ?
    Salut

    Je ne dirais pas un problème de piratage mais il faut comprendre : tu fournis des classes qui ont une certaine interface définissant les opérations que tu autorises. Si quelqu'un d'autre utilise ta classe pour autre chose, veux tu lui autoriser d'autres opérations ou non ? etc...
    Ce n'est pas que personnel, si tu fais un projet libre les gens pourront réutiliser ton travail à d'autres fins, si c'est professionnel il vaut mieux respecter les ligne de développement pour éviter le bazard dans les sources. De plus ca te permet de faire des accesseurs qui peuvent aussi effectuer d'autres opérations et comme l#a montré verbose dans son exemple, tu reste maître en quelque sorte de ce que tu as voulu définir comme opérations possibles et autorisées

  6. #6
    Membre éclairé Avatar de EIN-LESER
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2008
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 703
    Par défaut
    Tu reste maitre surtout sur tes propres betises futures (involontaires cela s'entend lol) et celles des autres succeptibles d'ultiliser ton code.

    Il est vrai qu'il peut paraitre fastitieux d'appliquer cette methode sur les premiers projets en java etant données qu'ils ne sont (en general) pas bien gros mais si tu prends pas les bonnes habitudes dés le debut tu verras qu'il tarrivera des petites mesaventures quand tu arriveras ades projets de plusieurs milliers de lignes repartis sur un dixaine de classes voire plus

  7. #7
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Citation Envoyé par George7 Voir le message
    ...si c'est professionnel il vaut mieux respecter les ligne de développement pour éviter le bazard dans les sources...
    Voilà une bonne raison de se mettre aux getters / setters. Si jamais tu veux faire du développement ton métier, ce n'est même pas la peine d'y réfléchir ! Sans même parler de bazard, chaque boîte a ses normes de développement, par ex dans certaines :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public void toto() {
    }
    sera interdit au bénéfice de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void toto()
    {
    }
    La position du "{", c'est de l'enculage de mouches mais c'est comme ça
    Et donc les get / set , une seule certitude, c'est chez tout le monde pareil : obligatoire

  8. #8
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    Citation Envoyé par verbose Voir le message
    En effet, il s'agit d'une question de philosophie

    L'encapsulation est un des piliers de la programmation orientée objet. Elle consiste à réduire la visibilité des attributs afin d'empêcher que ceux-ci ne soient accessibles à tord et à travers.
    Ca marche bien avec les types primitifs (int, boolean...) et la classe String.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class A {
      private List zeList;
     
      public  A() {
         zeList = new ArrayList();
         .... // là on insère des valeurs dans la liste...
      }
      public List getList() {
        return this.zeList;
      }
    }
    Je peux très bien faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new A().getList().removeAll();
    Et là, tous les objets de la liste sont supprimés alors que naïvement on pense que les données sont sécurisées.

    A méditer.

  9. #9
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Citation Envoyé par billynirvana Voir le message
    Je peux très bien faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new A().getList().removeAll();
    Et là, tous les objets de la liste sont supprimés alors que naïvement on pense que les données sont sécurisées.

    A méditer.
    Oui. C'est un problème connu, qui bien souvent se résoud par l'utilisation de copies défensives

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     public List getList() {
        // return this.zeList; <-- WEAK!!
    
        // Copie défensive de this.zeList, afin de ne retourner qu'une "image" de la vraie liste.
        List clone = new ArrayList();
        clone.addAll(this.zeList);
        return clone;
      }
    Cf. "Java Efficace, Joshua Bloch"


  10. #10
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 127
    Par défaut
    Bon, on a perdu pas mal de message à cause du bug, mais qu'il est intéressant ce post, on apprend plein de choses!!

    Bon pour les getters et setters, c'est intégré, les copies défensives ont l'air assez simples à gérer, aussi, merci à vous.

  11. #11
    Membre chevronné
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Par défaut
    new A().getList().removeAll();
    Au lieu d'utiliser la copie, on peut aussi retourner une liste non modifiable. Cela n'a pas le même effet mais cela peut être intéressant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return Collections.unmodifiableList(this.zeList);

  12. #12
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Citation Envoyé par firgon Voir le message
    les copies défensives ont l'air assez simples à gérer, aussi, merci à vous.
    Attention, ce n'est pas si simple que ça. A vrai dire, le code que j'ai proposé ci-dessus n'est pas 100% sûr. Il faudrait également cloner le contenu de la liste pour être vraiment stable.

    Après, il faut choisir le degré d'isolation des éléments en fonction de l'utilisation de la classe. Ce genre de copies défensives ne devient vraiment utile que lorsque l'on travaille sur des api utilisées par beaucoup de programmeurs. A l'intérieur d'un projet dans une équipe de développeurs qui se connaissent, ce n'est vraiment pas nécessaire


Discussions similaires

  1. des difficultés sur des methodes
    Par bambi98 dans le forum UML
    Réponses: 4
    Dernier message: 12/12/2006, 09h32
  2. Réponses: 2
    Dernier message: 20/10/2006, 15h07
  3. Pb sur la methode waitFor depuis un jar
    Par martin_o dans le forum Général Java
    Réponses: 3
    Dernier message: 06/04/2006, 17h34
  4. Pointeur sur une methode d'une classe
    Par Pe04 dans le forum C++
    Réponses: 2
    Dernier message: 02/03/2006, 13h29
  5. [VBA-E] Question sur la méthode "SaveAs"
    Par Flateric dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 25/04/2005, 14h18

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