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 :

Ma premiere classe : Aide et Critiques


Sujet :

C++

  1. #21
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    L'intérêt est la symétrie qui pourrait être la bienvenue le jour où il rajoute un constructeur de conversion, depuis un std::time_t p.ex.
    Et effectivement, ce n'est pas le cas pour l'instant.

    Maintenant, j'ai zappé le fait qu'il puisse y ajour un problème avec son implémentation actuelle de l'opérateur d'égalité.
    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...

  2. #22
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    L'intérêt est la symétrie qui pourrait être la bienvenue le jour où il rajoute un constructeur de conversion, depuis un std::time_t p.ex.
    Autant sur des opérateurs du style de +, -, etc. cet argument me parle et j'ai effectivement tendance à les implémenter en non-membre.

    Autant sur des opérateurs de conversion, je préfère les implémenter en tant que membre mais c'est essentiellement parce que je n'apprécie que modérément de comparer deux objets de type différent. Maintenant, il est clair que je fais des exceptions.

  3. #23
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Citation Envoyé par -={-_-}=- Voir le message
    J'ai bien compris ce que tu voulais dire et faire de l'objet c'est respecter la notion de private avec les attributs.

    Donc j'ai revu mon code en conséquence et donc par exemple mon code pour == est devenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    bool operator == (const Date& d1,const Date& d2){
        if( (d1.mDay==d2.mDay)
    	&& (d1.mMonth==d2.mMonth)
    	&& (d1.mYear==d2.mYear) ) {
    	return true;
        };
        return false;
    }
    Mais là, forcément, mDay mMonth mYear c'est public... Donc le compilateur crie au scandale.
    Qu'est ce que je dois faire docteur?
    Comme montré pour l'exemple de l'opérateur << dans mon message précédent, dans le cadre de cet opérateur défini à l'extérieur de la classe, l'utilisation de l'amitié (friend) est une solution qui ne rompt pas l'encapsulation.


    Citation Envoyé par -={-_-}=- Voir le message
    Je trouve ta remarque pleine de bon sens. S'il y a des problèmes autant les régler à la source. J'ai donc essayé de coder un truc mais je suis vraiment pas satisfait. Mettre NULL ou delete impliquerait utiliser des pointeurs, or mes variables ne le sont pas. Ce sont des int et des bool
    Tout ceci prouve que tu ne devrais pas gérer d'état invalide. Car à chaque fois se pose la question de comment représenter cet état et quelle sémantique lui donner. Ce qu'il y a dans IsValid ressemble peu ou prou aux invariants de ta classe. Le reste est la prédoncition de ton constructeur. Tu ne devrais pas donner trop de responsabilité à ta classe : à charge de celui qui l'utilise de l'utiliser correctement. S'il ne le fait pas, alors le contrat est rompu et qu'il ne s'étonne pas d'avoir des résultats aberrants. Fais-une recherche sur la programmation par contrat.

    Citation Envoyé par -={-_-}=- Voir le message
    De plus, écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ),mIsLeapYear(IsLeapYear())
    c'est correct?
    Tu appelles une méthode de ton objet avant que la construction de celui-ci ne soit terminée. Si IsLeapYear n'utilise que des membres à gauche de la liste d'initialisation, donc des membres déjà construits, alors il n'y a pas de problème. En revanche, s'il utilise des membres à droite, alors ces membres ne sont pas encore construits et le comportement est indéterminé. C'est à cause de ces raisons qui ne sont pas immédiates et peuvent apporter de la confusion en lecture de code, que j'évite autant se peut d'utiliser une fonction membre pour initialiser une variable membre. Qui sait comment sera comprise et modifiée la chose par les suivants.

  4. #24
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    Tu n'en n'as pas besoin en dehors du constructeur. Et si les paramètres sont invalides => exception et on n'en parle plus.
    Quand aux additions, additionner un nombre de jours ou de mois à une date (valide par construction) devrait toujours produire un résultat valide. Inutile de se trimballer l'état.
    Je suis d'accord dans les additions, la date de sortie sera toujours valide mais je dois dans la fonction vérifie cet état de validité car 28/02/2009 +1 pourrait donner 29/02/2009 mais comme cette date n'est pas valide j'obtiens 01/03/2009.
    Je ne suis pas d'accord qu'il est inutile de trimballer cet état mais par contre je pense qu'il faudrait mettre cette fonction en private. C'est ca que tu voulais dire?


    Citation Envoyé par 3DArchi
    Citation Envoyé par -={-_-}=-
    Je trouve ta remarque pleine de bon sens. S'il y a des problèmes autant les régler à la source. J'ai donc essayé de coder un truc mais je suis vraiment pas satisfait. Mettre NULL ou delete impliquerait utiliser des pointeurs, or mes variables ne le sont pas. Ce sont des int et des bool

    Tout ceci prouve que tu ne devrais pas gérer d'état invalide. Car à chaque fois se pose la question de comment représenter cet état et quelle sémantique lui donner. Ce qu'il y a dans IsValid ressemble peu ou prou aux invariants de ta classe. Le reste est la prédoncition de ton constructeur. Tu ne devrais pas donner trop de responsabilité à ta classe : à charge de celui qui l'utilise de l'utiliser correctement. S'il ne le fait pas, alors le contrat est rompu et qu'il ne s'étonne pas d'avoir des résultats aberrants. Fais-une recherche sur la programmation par contrat.
    Je trouve ca bizarre ce que tu dis de laisser des résultats abérrants :-)
    Ce que je voulais faire c'est dans le constructeur si la date n'est pas valide ben direct je le détruis.
    Ok je vais regarder la programmation par contrat.


    En tout cas je souhaitais tous vous remercier de participer à ma discussion, j'apprends vraiment trop de truc. merci a tous.

  5. #25
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Privée est une possibilité.
    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...

  6. #26
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par -={-_-}=- Voir le message
    Je trouve ca bizarre ce que tu dis de laisser des résultats abérrants :-)
    Une réponse rapide est de dire que c'est un peu le principe de la programmation par contrat : la classe établit un contrat avec son client. Si le client respecte le contrat (appels avec des paramètres valides entre autres), alors la classe donne un résultat attendu. Si le client ne respecte pas le contrat en fournissant des paramètres invalides par exemple, alors le comportement est indéterminé. Cela a comme avantages, entre autres, de simplifier le design des classes et de bien déterminer les responsabilités de chacun.

  7. #27
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut
    Merci pour tout je pense que c'est OK.
    Si au cas ou j'ai encore un pb, je le rouvrirais
    Notamment si je veu faire evoluer ma classe vers une classe de durée.
    Mais je pense avoir pas mal d'élements.
    Merci à tous d'avoir participer

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. diagramme de classe AIDE pour la Correction
    Par djoufouf dans le forum Diagrammes de Classes
    Réponses: 1
    Dernier message: 18/08/2015, 16h31
  2. GoogleMapAPI.class aide script
    Par loribac dans le forum Langage
    Réponses: 2
    Dernier message: 15/11/2012, 18h04
  3. [MCD] Découverte de Merise, Premier MCD. Aide et conseil recherché
    Par Invité dans le forum Schéma
    Réponses: 4
    Dernier message: 19/03/2010, 21h02
  4. [POO] Ma premiere classe
    Par zugolin dans le forum Langage
    Réponses: 12
    Dernier message: 02/03/2009, 10h17
  5. [Classes] aide a la conception
    Par maminova77 dans le forum Langage
    Réponses: 13
    Dernier message: 24/01/2006, 20h47

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