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

Dotnet Discussion :

Utilisation des ascesseurs


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 48
    Par défaut Utilisation des ascesseurs
    Petite question que je n'ai jamais vue abordée:

    En java, les méthodes getXXX() et setXXX() sont vivement conseillées pour encapsuler les champs privés d'une classe et ainsi éviter que pour une modification de l'implémentation d'une classe résulte la modification des classes qui l'utilisent.

    Ex: classe personne (Java)

    V1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Personne
    {
    public String getNomPrénom()
    {
    return NomPrénom;
    }
    private String NomPrénom;
    }

    V2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Personne
    {
     
    public String getNomPrénom()
    {
    return Nom + " " + Prénom;
    }
     
    private String Nom;
    private String Prénom;
    }


    Dans le cas de .NET:

    V1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class Personne
    {
    public String NomPrénom;
    }

    V2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Personne
    {
    public String NomPrénom
    {
    get { return Nom + " " + Prénom; }
    }
    private String Nom;
    private String Prénom;
    }

    Donc peut-on conclure qu'il n'est pas conseillé en .NET d'utiliser systématiquement des ascesseurs?

  2. #2
    Membre émérite Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Par défaut
    Si, c'est tout à fait conseillé, comme pour tous les languages orientés objets.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 48
    Par défaut
    Oui, ma question c'est pourquoi? (puisqu'un ascesseur peut remplacer un champ public de manière transparente pour l'utilisateur de la classe)

  4. #4
    Membre émérite Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Par défaut
    C'est le principe de l'encapsulation. Tu caches les données internes de ta classe à ses utilisateurs. Ainsi, tu peux modifier tout le fonctionement interne sans poser de problèmes à ceux qui utilise ta classe. En publiant des accesseurs, tu décides quelles sont les seules manipulations autorisées sur ta classe.

    De plus, si aujourd'hui une classe Person expose Name et renvoie une simple variable m_name, demain, si les règles business l'exigent, tu peux renvoyer String.Format("{0} ({1})", m_name, m_age) via le meme accesseurs, sans casser les applications qui l'utilisent.

  5. #5
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 48
    Par défaut
    Oui, je sais ce qu'est l'encapsulation...

    Et justement... Je reprends ton exemple
    (en faisant exprès de ne pas encapsuler les champs pour te montrer que ça ne pose pas de problème!):

    classe Person V1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class Person
    {
        public String Nom; 
    }
    classe Person V2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Person
    {
        public String Nom
        {
           get{ return m_nom + m_age; }
           set{ m_nom = value;}
        }
     
        private String m_nom;
        private int m_age;
    }
    Donc, les utilisateurs de la classe V1, accédaient directement à la variable publique Nom. Lors du passage à la V2, on a un ascesseur à la place d'un champ public...

    Tu n'es pas d'accord avec moi que le mec qui utilisait la V1 n'a rien à changer à son code et que c'est totalement transparent pour lui?

  6. #6
    Expert confirmé
    Avatar de Ditch
    Inscrit en
    Mars 2003
    Messages
    4 160
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mars 2003
    Messages : 4 160
    Par défaut
    Salut JF,

    c'est tout à fait correct ce que tu dis dans l'exemple cité.

    Les ascesseurs sont utilisés principalement pour encapsuler les règles business comme cela a été indiqué mais aussi gérer les droits sur les propriétés (en mettant en private le get ou le set par exemple).

    Mais tu pourrais aussi avoir des utilisations en interne qui font que le fait de proposer cette solution directement peut être utile:

    Si tu as

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public string Var
    {
    get
    {
    if (var == String.Empty)
    throw new Exception("blabla");
     
    // ou encore
    // if (var == String.Empty)
    // return "NOTHING";
    }
    set{}
    }
    private string var = String.Empty;
    Ce que tu gères et ce que tu renvoies sont ainsi différents.

Discussions similaires

  1. Règles d'utilisation des forums C
    Par Franck.H dans le forum C
    Réponses: 3
    Dernier message: 26/01/2008, 17h35
  2. [CR8.5] Utilisation des codes barre
    Par Robert dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 20/01/2005, 16h13
  3. utilisation des sockets sous windows
    Par Tupac dans le forum Réseau
    Réponses: 2
    Dernier message: 21/12/2002, 18h24
  4. [Crystal Report] Utilisation des vues de sql serveur
    Par Olivierakadev dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 15/11/2002, 17h44
  5. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01

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