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 :

parametres fonctions & contexte, bonne idée ?


Sujet :

C++

  1. #1
    Membre régulier

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2003
    Messages : 120
    Points : 82
    Points
    82
    Billets dans le blog
    1
    Par défaut parametres fonctions & contexte, bonne idée ?
    Bonjour !

    pour simplifier l'appel de plusieurs fonctions qui nécessite le passage en paramètres de plusieurs "services"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void fonction_n(Service1& srv1, Service2& srv2, Service3& srv3 ...etc)
    est-ce une bonne pratique d'utiliser le concept de "context" ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    struct Context
    {
    Service1 srv1;
    Service2 srv2;
    Service3 srv3;
    }
     
    void fonction_n(Context& context)
    ou est-ce à proscrire absolument ?

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 681
    Points
    13 681
    Billets dans le blog
    1
    Par défaut
    Quelle bonne raison vois-tu à le faire ? Quelle mauvaise raison vois-tu à le faire ? Voilà les 2 questions que tu devrais te poser. Tu listes les pour et les contre de ta solution, et comme ça tu peux prendre une décision

  3. #3
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 486
    Points : 6 169
    Points
    6 169
    Par défaut
    Bonjour,

    De mon point de vue, c'est une bonne idée, à condition que les fonctions qui prennent en paramètre un Context utilisent bien à la fois Service1, Service2 et Service3 et pas seulement deux parmi les trois. La structure Context permet alors d'écrire un code moins lourd.

    Attention, si beaucoup de fonctions ont besoin de ce paramètre de type Context, alors c'est peut-être un signe que le code n'est pas assez découplé (à voir au cas par cas). Mais, de toute façon, ce ne sera pas pire qu'avec des triplets de paramètres Service1& srv1, Service2& srv2 et Service3& srv3.

    Au fait, dans ton programme, à quoi correspondent ces classes Service1, Service2 et Service3 ?

  4. #4
    Membre régulier

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2003
    Messages : 120
    Points : 82
    Points
    82
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Pyramidev Voir le message
    Au fait, dans ton programme, à quoi correspondent ces classes Service1, Service2 et Service3 ?
    merci à vous !

    ces 'services' sont des modules de différents domaines au sein de mon application, rendu graphique, accès fichiers, pool d'objets etc... le but de ce 'context' est d’être passé en argument du design pattern command

    en gros résumé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void command::exec(Context& context)
    {
    ...
    }

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 053
    Points
    33 053
    Billets dans le blog
    4
    Par défaut
    Si c'est pour le passer de partout, autant mettre des accesseurs globaux directement.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,
    Citation Envoyé par Katian Voir le message
    merci à vous !

    ces 'services' sont des modules de différents domaines au sein de mon application, rendu graphique, accès fichiers, pool d'objets etc... le but de ce 'context' est d’être passé en argument du design pattern command

    en gros résumé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void command::exec(Context& context)
    {
    ...
    }
    De manière générale, il est toujours bon de regrouper les données "qui vont bien ensemble", ne serait ce que pour pouvoir fournir des services qui pourront s'assurer que les invariants soient respectés.

    Sauf que, dans le cas présent, je soupçonnes très largement que toute ta conception devrait sans doute être à revoir, car tu te retrouve à mélanger -- l'un dans l'autre -- des informations qui n'ont aucune raison d'être mélangées :

    Le rendu graphique fait, en effet -- très clairement -- partie de la vue (le V de MVC), alors que les accès aux fichiers font partie du controller (le C de MVC) et que les pools d'objets font partie du modèle (le M de MVC), des données "business".

    Il n'y a donc -- a priori -- aucune raison de commencer à mélanger ces trois éléments dans une fonction, car
    • soit, ta fonction s'occupe du rendu graphique, et elle s'en fout pas mal d'afficher un rocher, un oiseau ou un ennemi, ni même de savoir la manière dont les données ont été sauvegardées
    • soit ta fonction s'occupe de manipuler un fichier, et elle n'a aucun besoin de s'occuper de l'affichage
    • soit ta fonction s'occupe de gérer les données métier et elle se fout pas mal de savoir comment ces données seront sauvegardées et / ou affichées.

    Après, il est clair qu'il faut bel et bien, à un moment ou à un autre, en arriver à faire communiquer la vue avec le controller et le controller avec les données métier. Mais, a priori, "tout ce que tu dois faire", c'est t'assurer d'envoyer des messages d'un endroit à l'autre en sachant que, avec un peu de (mal)chance, le message émis sera récupéré par "quelque chose" ... ou non

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    C'est une question intéressante.
    L'utilisation d'un contexte que l'on fait passer en paramètre des fonctions tout au long de la hiérarchie d'appel peut résulter d'une mauvaise compréhension du "static is evil". Si on s'interdit le fait d'avoir des singletons statiques, alors le "context dispatch" est un solution évidente.
    Mais s'il comporte beaucoup d'avantage, il cache également quelques pièges dus au fait qu'il complexifie l'état du logiciel.

    Déjà, premier écueil à éviter: il faut absolument que le contexte soit passé aux fonctions qui l'utilisent par référence constante. Sinon ça lui ôte tout intérêt.
    Ensuite, ça pose tout un tas de problèmes en terme de QA/QC, notamment ça peut rendre très complexe l'implémentation de tests unitaires. Ce problème peut être contourné par l'utilisation de frameworks qui émulent le contexte, mais c'est une solution lourde et complexe qui n'a de sens que sur de très gros projets.

    Après, d'un point de vue de l'architecture du logiciel, il faut comprendre ce que l'on fait quand on fait ça: on rend nos objets dépendants du framework. Ce n'est pas toujours ce que l'on veut faire, par exemple lorsqu'on fait du MEF (c'est le premier exemple qui me vient mais il y en a d'autres).

    Comme toujours, en général la bonne réponse se trouve au milieu : identifier ce dont les classes vont avoir besoin, décider si ça nécessite une notion de contexte (qu'en général on ne nommera pas "contexte" dans notre code, mais quelque chose de plus représentatif et explicite), et si oui, y mettre uniquement ce dont on a besoin.

    Quant au problème de rassembler plusieurs objets dans une structure pour le passer en paramètre de fonction, ça peut aider s'il y a beaucoup de paramètres, mais c'est généralement inutile, et ça fait perdre quelques précieux cycles (si la fonction est appelée 50 fois par frame, ça peut être décisif).

  8. #8
    Membre régulier

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2003
    Messages : 120
    Points : 82
    Points
    82
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par r0d Voir le message
    Quant au problème de rassembler plusieurs objets dans une structure pour le passer en paramètre de fonction, ça peut aider s'il y a beaucoup de paramètres, mais c'est généralement inutile, et ça fait perdre quelques précieux cycles (si la fonction est appelée 50 fois par frame, ça peut être décisif).
    et dans le cas d'un passage par référence constante ?

    finalement, je me demande si je ne suis pas en train d’implémenter le design pattern médiateur...

    en tout cas toutes vos réponses me font avancer merci !! ^^

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Katian Voir le message
    et dans le cas d'un passage par référence constante ?
    Ça ne change rien à ma remarque. Ce qui coûte, c'est la création (instanciation) de la structure qui va contenir des objets du contexte, puis leur accès. Dans la majorité des cas, c'est un coût totalement négligeable, mais dans d'autre, rares certes, c'est notable, donc j'ai estimé qu'il était utile d'en parler; ça peut éviter de longues heures de profiling.
    Et quoi qu'il en soit, si tes fonctions doivent modifier le contexte, alors il y a un sérieux soucis d'architecture.

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

Discussions similaires

  1. Problème parametre fonction DLL VC++
    Par lio33 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 29/06/2007, 14h01
  2. Réponses: 4
    Dernier message: 27/06/2007, 13h38
  3. Parametre Fonction falcultatif
    Par hugo69 dans le forum VBA Access
    Réponses: 4
    Dernier message: 31/05/2007, 16h15
  4. Remplacer les erreur 404 par 200 OK : bonne idée?
    Par haltabush dans le forum Référencement
    Réponses: 5
    Dernier message: 04/04/2007, 09h30
  5. [FLASH] Coupler html et flash ? Bonne idée ?
    Par psycomel dans le forum Flash
    Réponses: 14
    Dernier message: 06/12/2005, 13h10

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