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 :

Fonction globales ou classe utilitaire ?


Sujet :

C++

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut Fonction globales ou classe utilitaire ?
    Hello,

    Est-ce mal vu de faire des fonctions globales ?

    Doit-on tout encapsuler ces fonctions dans des classes pour faire "plus propre" ?

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Je pense que sur ce sujet, les avis vont diverger.

    Mon avis personnel c'est que je n'aime pas les fonction globales. Je dirais plutôt "flottantes". Pourquoi?

    - Généralement, ça cache une erreur de conception. Je dis bien généralement, car il y a des cas où l'on ne peut pas faire autrement. Mais en général, l'idée de la poo est que chaque objet possède ce qu'il faut pour les manipuler, ou bien, lorsque c'est compliqué ou que la structure du programme le demande, on passe par un proxy, un médiateur, etc.

    - Dans le cas où on ne peut vraiment pas encapsuler la fonctionnalité, je pense qu'il est tout de même une bonne chose de "classer" proprement cette fonctionnalité. Donc mettre ces fonctions flottantes dans un namespace ou en statique dans une classe (ce qui, pour moi, revient au même, mais là encore il peut y avoir débat). C'est plus dans un soucis de maintenabilité que de "beauté du code".

    My cent
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  3. #3
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Dans quelle classe encapsuler quelque chose comme "sin"? Tout ce qu'on pourra faire sera artificiel, alors autant s'en passer.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Hmmm... Après réflexion, je crois que je vais pouvoir les encapsuler de manière statique dans des objets que je dois créer bien plus tard, mais qui sémantiquement correspondent.

    Merci de ton avis.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    tu peux les mettre dans un namespace.

    Mais je ne vois pas de raison, comme tu le décris, de les mettre dans une classe.

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Dans quelle classe encapsuler quelque chose comme "sin"? Tout ce qu'on pourra faire sera artificiel, alors autant s'en passer.
    Une classe NomProjet_Math, par exemple. L'expérience m'a montré que lorsqu'on commence à implémenté une fonction de ce type, il en arrive rapidement d'autres. Donc autant créer un "espace sémantique" (classe, namespace, ...) dès le début.

    edit: sans compter que de tout encapsuler évite les erreurs bêtes de redéclaration de variables (qui peut deveniir problématique dans certains cas, comme par exemple lorsqu'on utililse plsin de libs).
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  7. #7
    screetch
    Invité(e)
    Par défaut
    c'est utile pour eviter les conflits de nommage, mais une fonction "globale" reste une fonction "globale" que l'on mette des termes de POO devant ou pas.
    J'ai vu des projets ou du coup ils avaient une classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Utils
    {
      static void sinus(float angle);
      static void print(const char *str);
      static bool isDebuggerAttached();
      static Coffe doCoffee(bool sugar, bool milk);
    };
    je vois pas l'interet. ah si, c'est de l'objet...

  8. #8
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par r0d Voir le message
    Une classe NomProjet_Math, par exemple. L'expérience m'a montré que lorsqu'on commence à implémenté une fonction de ce type, il en arrive rapidement d'autres. Donc autant créer un "espace sémantique" (classe, namespace, ...) dès le début.
    Il est question de classes, pas de namespace (j'ai rien contre les namespaces; il y a des cas ou introduire des classes avec que des membres statiques est utile -- on peut par exemple les faire template ou les passer en parametre template -- mais introduire systematiquement des classes ne me semble pas necessaire).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  9. #9
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 68
    Points : 86
    Points
    86
    Par défaut
    Personellement, je pense que dans le cas de la fonction sin: un namespace "math" car comme le dit r0d en général quand on commence avec ce genre de fonction on arrive vite à en avoir plein et puis on va certainement rajouter des types: complex, vector3, mat4, ... donc un namespace est certainement la meilleure solution pour ce cas ci.

    Mais cela ne peut pas être une règle générale, il y aura toujours des cas ou une classe utilitaire sera mieux ou même une fonction globale.

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 374
    Points : 23 631
    Points
    23 631
    Par défaut
    Citation Envoyé par oodini Voir le message
    Hello,

    Est-ce mal vu de faire des fonctions globales ?

    Doit-on tout encapsuler ces fonctions dans des classes pour faire "plus propre" ?
    Presque tout est dit au-dessus. J'ajouterais donc que cela dépend beaucoup de langage. Java, par exemple, ne te laissera pas le choix. En revanche, surtout en C++, je ne vois pas pourquoi il faudrait obligatoirement définir une classe si celle-ci ne contient que des fonctions membres statiques et qu'il n'y a rien à instancier. À dire vrai, c'est de la transformation de fonction en méthode et, à mon avis, elle n'a pas lieu d'être.

    En plus, il y aura des moments où tu n'auras pas le choix non plus, typiquement lorsque tu redéfiniras des opérateurs pour faire interagir tes objets avec des types natifs ou d'autres classes d'objets déja existantes.

    Donc, c'est le bon sens qui s'applique ici : si ta fonction est principalement destinée à modifier les membres d'un objet, alors elle doit (si possible) faire partie de l'objet lui-même et donc être une de ses méthodes.

    Dans le cas contraire, tu peux définir une fonction indépendante et d'intérêt générale, si c'en est bien une. Tu peux utiliser les namespaces si tu crains une collision, mais attention : si c'est le cas, c'est peut-être dû au fait qu'elle devrait en fait être une méthode. Mais si c'est pour séparer des fonctions similaires dans des bibliothèques différentes, c'est parfaitement indiqué, et c'est même valable pour les classes.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/12/2006, 10h09
  2. classe friend vs fonctions globales vs ...
    Par khayyam90 dans le forum C++
    Réponses: 8
    Dernier message: 23/03/2006, 23h19
  3. Réponses: 4
    Dernier message: 17/03/2004, 17h24
  4. Réponses: 14
    Dernier message: 15/01/2004, 01h15
  5. Fichier de fonctions globales
    Par PEM dans le forum C++Builder
    Réponses: 5
    Dernier message: 10/07/2002, 21h35

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