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

Langage C++ Discussion :

Bonne pratique en POO ?


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Charente (Poitou Charente)

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

    Informations forums :
    Inscription : Novembre 2017
    Messages : 35
    Par défaut Bonne pratique en POO ?
    Bonjour,

    Depuis longtemps je me suis posé la question de si on devais utiliser ou non les méthodes d'objets dans un constructeur.
    Je sais que cela est autoriser par bien des langages, mais en C++, en activant une option (dont je ne me rappel plus le nom) lors de la compilation avec g++, il est déconseiller d'écrire un code comme celui-ci :

    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
     
    // Doit-on utiliser tous de même la liste d'initialisation ?
    Lifebar::Lifebar(int max, int min): m_max(max), m_min(min)
    {
        this->setMax(max);
        this->setMin(min);
     
        /*
         * Que je peut aussi écrire :
         *
         * setMax(max)
         * setMin(min)
         */
    }
     
    void Lifebar::setMax(int max)
    {
        m_max = max;
    }
     
    void Lifebar::setMin(int min)
    {
        m_min = min;
    }
    Je sais que l'utilisation du mot clé "this" n'est pas recommandé dans le constructeur car this est un pointeur sur l'instance d'objet, et dans le constructeur, il n'y a pas encore d'instance à proprement parler (c'est le but d'un constructeur).

    Cependant, en retirant le mot clé this, est-ce que le compilateur fait quand même appel implicitement à lui ?

    Et si oui, il parait évident qu'il ne faut pas faire appel aux méthodes dans le constructeur. Cependant, je trouve qu'on perd une partie de l’intérêt des accesseurs/mutateurs, car on duplique le code de vérification à 2 endroits différents dans le code (dans le code supposons que je ne veux pas que min et max soit inférieur à 1).

    J'aimerais avoir l'avis de d'autres développeurs afin de mieux comprendre ce genre de situations.

    Merci d'avance, et bonne journée !

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Tu peux tester, mais dans un constructeur tu peux appeler une méthode de la classe.

    Après, il faut voir pour une méthode virtuelle

    Et sinon, il y a les méthodes inline qui correspondent souvent très bien aux accesseurs/ mutateurs

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Charente (Poitou Charente)

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

    Informations forums :
    Inscription : Novembre 2017
    Messages : 35
    Par défaut
    Citation Envoyé par foetus Voir le message
    Tu peux tester, mais dans un constructeur tu peux appeler une méthode de la classe.

    Après, il faut voir pour une méthode virtuelle

    Et sinon, il y a les méthodes inline qui correspondent souvent très bien aux accesseurs/ mutateurs
    Bien-sûr, sa fonctionne, d'ailleurs je l'utilise actuellement, seulement lorsqu'on active l'option de compilation -Weffc, celà nous indique que ce n'est pas recommandé (pourquoi je ne sais pas, je devrais lire le livre en question qui le déconseille).

    Pour les inline sa reste la même réflexion, car au final, ce sont des méthodes de la classe comme les autres.

    Globalement j'aimerais avoir l'avis de quelques personnes sur pourquoi sa ne serais pas recommandé ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Ce qui est trompeur dans un constructeur, c'est l'appel d'une fonction virtuelle. Pour construire un objet dérivé, la fonction qui sera appelée est celle qui existe au niveau du constructeur en cours.
    On pourrait alors préférer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // on suppose ici que  Lifebar::setMax() est virtual
    Lifebar::Lifebar(int max, int min): m_min(min) {
        Lifebar::setMax(max);  // lève le doute, on n'accède pas aux fonctionnalités dérivées tant que le corps de l'objet dérivé n'a pas débuté.
        this->setMax(max);     // équivalent, mais trompeur
        setMax(max);           // idem
    }
    void Lifebar::fonction() {
        setMax(max);           // si la setMax() est virtuelle et que fonction() est appelée après construction => appel virtuel
        this->setmax(max);     // idem
        Lifebar::setMax(max);  // empêche l'utilisation de DeriveDeLiveBar::setMax()
    }

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Charente (Poitou Charente)

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

    Informations forums :
    Inscription : Novembre 2017
    Messages : 35
    Par défaut
    Ah, d'accord je vois mieux le pourquoi du comment alors, merci beaucoup, je passe le sujet en résolu dans ce cas.

    Bonne journée à vous !

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

Discussions similaires

  1. Bonne pratique en POO PHP ?!
    Par Kontas dans le forum PHP & Base de données
    Réponses: 29
    Dernier message: 08/08/2015, 16h09
  2. Bonnes pratiques pour la POO en Javascript
    Par piemur2000 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 05/10/2013, 15h33
  3. Bonne pratique MVC & POO
    Par discmat dans le forum Langage
    Réponses: 3
    Dernier message: 14/03/2012, 17h38
  4. [PHP 5.3] POO agrégation et bonne pratique
    Par yannux dans le forum Langage
    Réponses: 3
    Dernier message: 02/12/2011, 09h53
  5. [POO] Bonnes pratiques href="javascript:fonction()"
    Par LhIaScZkTer dans le forum Général JavaScript
    Réponses: 20
    Dernier message: 04/04/2009, 18h26

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