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

C++ Discussion :

Quand les mutateurs nous mentent


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2008
    Messages : 132
    Par défaut Quand les mutateurs nous mentent
    [EDIT]Cette discussion est un fork de la discussionhttp://www.developpez.net/forums/d12...te-debutants-c de manière à recentrer le débat, n'hésitez pas à intervenir dans les deux discussions mais en veillant à ne pas les mélanger [/EDIT]

    Bon, je rêve ou bien je lis qu'en gros il ne faut plus faire du C parce que le C++ fait la même chose et plus encore?
    Pour le fait que le C++ touche plus de paradigmes, est plus simple à apréhender .. etc, pas de problème. Mais qu'il puisse se substituer à C, c'est juste une connerie équivalente à dire que l'on peut substituer MongoDB à MySQL.
    J'ai la flemme d'expliquer en détail mes propos .. je peux juste balancer un exemple: besoin d'un programme "compilé" prenant le moins d'espace possible.

    Aussi, l'utilité d'utiliser des getter/setter est un maintenance plus aisée du code. Exemple débile en Java (ne pas faire attention à la division d'un ingredient par un entier):
    1ere version:
    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
     
    class CocaColaDuMcdo extends Drink
    {
      private Ingredient eau;
      private Ingredient ingredientPrincipal;
      private Ingredient ingredientX;
      private Ingredient ingredientY;
     
      public CocaColaDuMcdo(Ingredient eau, Ingredient ingredientPrincipal, Ingredient ingredientX, Ingredient ingredientY)
      {
        setIngredientPrincipal(ingredientPrincipal);
        .
        .
        .
      }
     
      private Drink buildDrink()
      {
        this.getIngredientPrincipal() + this.getIngredientX() + ...
      }
     
      public Ingredient getIngredientPrincipal()
      {
        return this.ingredientPrincipal;
      }
     
      public setIngredientPrincipal(Ingredient ingredientPrincipal)
      {
        this.ingredientPrincipal = ingredientPrincipal;
      }

    2ieme version (histoire de commencer l'arnaque):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public setIngredientPrincipal(Ingredient ingredientPrincipal)
    {
      this.ingredientPrincipal = ingredientPrincipal / 2;
    }

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par nickyla Voir le message
    Bon, je rêve ou bien je lis qu'en gros il ne faut plus faire du C parce que le C++ fait la même chose et plus encore?
    Oui, tu rêves...

    Personne n'a jamais dit qu'il fallait abandonner C
    Pour le fait que le C++ touche plus de paradigmes, est plus simple à apréhender .. etc, pas de problème. Mais qu'il puisse se substituer à C, c'est juste une connerie équivalente à dire que l'on peut substituer MongoDB à MySQL.
    J'ai la flemme d'expliquer en détail mes propos .. je peux juste balancer un exemple: besoin d'un programme "compilé" prenant le moins d'espace possible.
    Mais comme tu rêves, quelle importance, hein
    Aussi, l'utilité d'utiliser des getter/setter est un maintenance plus aisée du code.
    Heuu... une quoi

    Il est vrai que, comme tu vas, souvent, devoir commencer par appeler l'accesseur pour récupérer la valeur d'origine et que toute la logique qui modifie cette valeur d'origine sera sans doute répétée de gauche et de droite, tu vas en effet avoir une maintenance beaucoup plus aisée

    Après cela, tu t'étonneras surtout qu'une correction s'applique si tu suis le chemin A mais que le chemin B continue à n'en faie qu'à sa tête
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2008
    Messages : 132
    Par défaut
    Citation Envoyé par white_tentacle Voir le message
    Et ça ne te pose pas de problème d’avoir une fonction menteuse ? (le nom dit une chose, le code en fait une autre).

    Moi, si…
    Même si mon exemple (j'ai bien précisé que c'était un exemple bidon non .. je vous sent un peu à cran) n'est pas parlant. Mon setter fait EXACTEMENT ce que son nom indique, il construit la valeur de mon attribut et la lui affecte. La sémentique du comment il l'affecte, c'est son affaire. Je lui dit de définir la valeur de l'ingrédient principal. S'il veut la couper, il la coupe.

  4. #4
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Citation Envoyé par nickyla Voir le message
    Même si mon exemple (j'ai bien précisé que c'était un exemple bidon non .. je vous sent un peu à cran) n'est pas parlant. Mon setter fait EXACTEMENT ce que son nom indique, il construit la valeur de mon attribut et la lui affecte. La sémentique du comment il l'affecte, c'est son affaire. Je lui dit de définir la valeur de l'ingrédient principal. S'il veut la couper, il la coupe.
    T’as pas compris où je voulais en venir. Mais honnêtement, quand je vois ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public void setIngredientPrincipal(Ingredient ingredientPrincipal) {}
    public Ingredient getIngredientPrincipal() const {}
    Je m’attends à ce que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Ingredient poireau; // note : sémantique de valeur
    Recette soupe; // note : sémantique d’entité
    soupe.setIngredientPrincipal(poireau);
    assert(soupe.getIngredientPrincipal() == poireau);
    Si ce n’est pas le cas (ce n’est pas le cas dans ton exemple), ta fonction est menteuse. Et ça de mon point de vue c’est très mal .

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Le verbe dans le nom de la fonction, c'est set, pas copy.

    Pour définir le membre, on a besoin d'un argument. Rien dans la sémantique du mot set ne dit que que cela sera une copie.

    On s'est peut-être trop habitué, à tort, à ce que set désigne un bête mutateur.

    Moi aussi, je m'attendrais à ce que soit une copie. Mais aurais-je raison ?

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Ce qui me choque le plus dans cette méthode c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.ingredientPrincipal = ingredientPrincipal / 2;
    Quel signification a de diviser un ingrédient par deux ?

    Je trouve que l'exemple est mal choisit et je pense qu'on utiliserais plus une méthode "add" qu'une méthode "set" pour effectuer cette action.
    Avec un ingrédiant contenant une quantité et une méthode pour en prélever une certaine quantité ou proportion.

    Par contre on peut envisager une classe avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void setGravity(Newton force)
    {
           m_poids = m_masse * force;
    }
    Bon ce n'est qu'un exemple, j'espère ne pas me tromper sur la formule

  7. #7
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Sauf que c'est le poids qui est changé...
    J'ai l'impression que certains d'entre nous ont souvenir d'un article profondément gravé en eux et d'autres ... sont plus cavaliers dans leur nommage.
    -> http://blog.emmanueldeloget.com/inde...des-accesseurs
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    D'après cet article, set signifie "initialiser avec une valeur spécifiée".

    Mais spécifiée par quoi ? L'argument ou le code ? Le site d'Oxford Dictionnary, donné en lien, le ne dit pas...

    Pour moi, c'est surtout une question d'usage.

  9. #9
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    Sauf que c'est le poids qui est changé...
    Si on modifie la gravité, il est évident que le poids serait changé sinon l'objet serait dans un état incohérent.
    Quand on mange une part de gâteau, on va modifier son volume et sa masse.
    Après, si on a pas besoin de récupérer/d'utiliser la gravité exercée sur l'objet, pourquoi la stocker ?

    Citation Envoyé par Luc Hermitte Voir le message
    J'ai l'impression que certains d'entre nous ont souvenir d'un article profondément gravé en eux et d'autres ... sont plus cavaliers dans leur nommage.
    -> http://blog.emmanueldeloget.com/inde...des-accesseurs
    C'est un article très intéressant et je comprend mieux où vous voulez en venir.
    En effet, je ne pensais pas que "set" avait une définition aussi précise.

    D'après ce que j'ai lu et ce que j'en pense, un bon setter devrait :
    - mettre l'objet dans l'état spécifié ou lancer une exception/ retourner false le cas échéant ;
    - que la valeur passée à un setter ne dépende pas de la valeur précédente.


    Citation Envoyé par Koala01
    Si la fonction fait plus que simplement initialiser la valeur, le nom de la fonction "ment" à l'utilisateur de l'objet quant ce qui est effectivement effectué
    Je ne suis pas d'accord, set veut dire "mettre dans un état spécifié" si j'ai bien compris, mais mettre un objet dans un état différent ne se résume pas uniquement à modifier une variable donc je trouve que la fonction ne "ment" pas dans ce sens.
    Citation Envoyé par Koala01
    "set" donne une impression "d'instantanéité" qui n'est pas *forcément* juste
    Personnellement je n'ai pas ce genre d'appriori à ce sujet, un "set" prendra le temps qu'il faut. Si nécessaire on rajoute une indication dans la doc.

Discussions similaires

  1. fonctions et classes... quand les utiliser ?
    Par fastmanu dans le forum Langage
    Réponses: 6
    Dernier message: 03/04/2006, 00h39
  2. Quand les tableaux deviènent vos pires enemis...
    Par Zenol dans le forum Balisage (X)HTML et validation W3C
    Réponses: 10
    Dernier message: 13/11/2005, 21h23
  3. 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