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 :

fonctions independantes ou classe ?


Sujet :

Langage C++

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 89
    Points : 86
    Points
    86
    Par défaut fonctions independantes ou classe ?
    Bonjour,

    J'ai une petite question concernant l'architecture globale d'un projet.
    Plusieurs fonctions de mon projet donnaient un "cout << message << endl" et pour prevenir l'utilisateur de ces actions, et pour me permettre de voir ou j'en suis cote programmeur (oui, les point d'arret c'est mieux mais pour des fonctions tres simples, un petit message dans le terminal mange pas de pain).

    Cependant, je me suis dit que ce serait pas mal de creer un fichier "log.hpp"/"log.cpp" qui contient les fonctions pour afficher ces messages. J'ai donc créé ce fichier avec une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    logMessage(logType type, std::string message);
    qui display le message donné en argument (et en me precisant la nature du message (error/warning/info)).

    Cependant, je n'ai pas créé de classe, j'ai simplement cree des fonctions "en l'air" dans ce fichier.
    N'est il pas mieux de creer une classe pour ceci ?
    (que des fonctions statiques dans une classe sans attribut ?)

    PS : j'ai le meme "probleme" avec les fichiers algo.hpp/algo.cpp qui contiennent des fonctions de conversion (doubleToString stringToDouble etc...) et des fonctions 'purement' mathematiques (je devrais en faire une classe aussi ?)

    Merci d'avance

  2. #2
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Bonjour.
    Il est fréquent d'avoir des fonctions libres (surtout en programmation générique). As-tu considéré l'utilisation des namespace ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    log::msg(msg_type, "message\n");
    convert::to_string(un_double); // C++11 : http://www.cplusplus.com/reference/string/to_string/
    convert::to_string(un_int);
    math::median(un_container);

  3. #3
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Tu peux avoir plusieurs façon de faire qui sont toutes plus ou moins équivalente.
    1 - Une classe/Struct avec un fonction static comme le log::msg de Ehonn
    2 - Une macro qui "commente" l'utilisation d'un log comme
    LOG("Message %i, %f",valeur1, valeur2) //Cela cache un printf ou mieux un std::cout std::cerr std::clog
    3 - L'utilisation des assert pour stopper et faire popper une windows message box avec le message que tu veux afficher.

    Tout ça est relativement simple à mettre en oeuvre.
    Homer J. Simpson


  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 89
    Points : 86
    Points
    86
    Par défaut
    Merci beaucoup, je ne savais pas que les convert faisaient parti de std !
    Je suis allé voir les namespace, ca m'a tout l'air d'etre ce qu'il me faut, merci

    Edit : une classe avec les fonctions static a l'avantage de se "doxygener" (est il possible de generer la doc d'un fichier non class ?)

  5. #5
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Citation Envoyé par Astraya Voir le message
    1 - Une classe/Struct avec un fonction static comme le log::msg de Ehonn
    J'ai parlé de namespace, pas de classe + fonction statique

    Citation Envoyé par gabrielS Voir le message
    Merci beaucoup, je ne savais pas que les convert faisaient parti de std !
    convert non, mais std::to_string(type_de_base) qui est dans l'include string, oui.

    Citation Envoyé par gabrielS Voir le message
    Je suis allé voir les namespace, ca m'a tout l'air d'etre ce qu'il me faut, merci )


    Citation Envoyé par gabrielS Voir le message
    Edit : une classe avec les fonctions static a l'avantage de se "doxygener" (est il possible de generer la doc d'un fichier non class ?)
    Doxygen gère très bien les namespace aussi (il créé un onglet namespace avant celui des classes).

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Certaines philosophies tentent d'imposer le "tout objet".

    Il y a d'ailleurs certains langages (java et C#, par exemple) qui suivent purement et simplement cette philosophie.

    Mais C++ est un langage multiparadigme! C'est à dire qu'il permet aussi bien d'utiliser le paradigme purement procédural (les fonctions libres) que le paradigme orienté objet (les classes et leurs fonctions membres) ou le paradigme générique (les fonctions et le classes template).

    L'idée générale est donc de choisir "ce qui correspond le mieux" à tes besoins.

    Une classe est particulièrement intéressante pour regrouper des comportements qui travaillent avec des données qui n'ont aucun sens si elles sont prises séparément.

    Ainsi, tu créeras peut etre une classe Personne, parce que chaque personne va devoir pouvoir répondre à certaines questions (ca, ce sont les comportements) comme "quel est ton nom", "quel est ton age" ou encore "quelle est ton adresse" et que les données manipulées par une personne sont (généralement) différentes des données manipulées par une autre.

    Par contre, si un comportement peut s'appliquer à "n'importe quelle donnée" quelle que soit son origine, tu as sans doute avantage à garder la fonction qui fournit ce comportement sous la forme d'une fonction libre.

    Ainsi, si tu crées une fonction intToString dont le but est de convertir un entier en une chaine de caractères, tu te fous sans doute pas mal de savoir quelle est l'origine de l'entier à convertir: que ce soit l'age du capitaine, le code postal d'une commune ou le nombre de roses commandées n'aura strictement aucun intérêt, et tu risques de vouloir utiliser cette fonction avec des entiers venant de virtuellement "n'importe où".

    A ce moment là, il ne sert strictement à rien de placer cette fonction dans une classe, parce que cela t'obligerait à ... créer une instance de la classe en question pour pouvoir l'utiliser.

    Alors, bien sur, tu pourrais déclarer la fonction statique pour la rendre indépendante de toute instance réelle de la classe, mais cela ne changerait pas grand chose.

    Si tu veux placer cette fonction dans une sorte de "boite noire" qui t'obligera à utiliser un nom pleinement qualifié, le mieux est d'utiliser un espace de noms: ta fonction reste une fonction totalement libre (indépendante de n'importe quelle classe et de l'origine des données qu'elle manipule), et tu as malgré tout la certitude que son nom n'entrera jamais en conflit avec le nom d'une autre fonction issue de "n'importe où"
    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

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/03/2005, 12h37
  2. Réponses: 4
    Dernier message: 10/02/2005, 16h10
  3. [VB6]Valeurs une collection renvoyée par la fonction d'une classe
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 30/03/2004, 11h04
  4. Réponses: 4
    Dernier message: 17/03/2004, 17h24
  5. Réponses: 14
    Dernier message: 15/01/2004, 01h15

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