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 :

Gérer plusieurs implémentations d'une méthode


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 2
    Par défaut Gérer plusieurs implémentations d'une méthode
    Bonjour à tous,

    J'ai créé une classe dont deux méthodes ont 2 implémentations chacune. Je souhaiterais comparer l'efficacité des ces 2x2 implémentations.
    Comment faire pour qu'il soit facile de passer d'une implémentation à l'autre?

    Actuellement, je passe en paramètre de ma classe deux entiers prenant les valeurs 1 ou 2 pour sélectionner l'implémentation:

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    #include <iostream>
     
    class My_class {
    public:
        My_class(int implem_func1, int implem_func2);
        int func1();
        int func2();
     
    private:
        const int implem_func1;
        const int implem_func2;
        int func1_implem1();
        int func1_implem2();
        int func2_implem1();
        int func2_implem2();
    };
     
     
    My_class::My_class(int implem_func1, int implem_func2): implem_func1(implem_func1), implem_func2(implem_func2) {}
     
    ///////////////////////////////////////
    // Definition de la premiere methode //
    ///////////////////////////////////////
    int My_class::func1_implem1() {
        return 2+2;
    }
     
    int My_class::func1_implem2() {
        return 2*2;
    }
     
    int My_class::func1() {
        if (implem_func1 == 1) {
    	return func1_implem1();
        }
        else {
    	return func1_implem2();
        }
    }
     
    ///////////////////////////////////////
    // Definition de la deuxieme methode //
    ///////////////////////////////////////
    int My_class::func2_implem1() {
        return 4*3;
    }
     
    int My_class::func2_implem2() {
        return 4+4+4;
    }
     
    int My_class::func2() {
        if (implem_func2 == 1) {
    	return func2_implem1();
        }
        else {
    	return func2_implem2();
        }
    }
     
    int main() {
        My_class my_class11(1,1);
        std::cout << my_class11.func1() << std::endl;
        std::cout << my_class11.func2() << std::endl;
        My_class my_class12(1,2);
        std::cout << my_class12.func1() << std::endl;
        std::cout << my_class12.func2() << std::endl;
        My_class my_class21(2,1);
        std::cout << my_class21.func1() << std::endl;
        std::cout << my_class21.func2() << std::endl;
        My_class my_class22(2,2);
        std::cout << my_class22.func1() << std::endl;
        std::cout << my_class22.func2() << std::endl;
        return 0;
    }
    Les valeurs des paramètres implem_func1 et implem_func2 étant testées à chaque appel des fonctions func1 et func2, cette solution ne me parait pas satisfaisante.
    Qu'en pensez vous?
    Merci

  2. #2
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Salut,

    tu pourrais le faire sous forme de foncteur par exemple.
    Mais en terme de performance, l'idéal serait que ce soit décidé à la compilation.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    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 essayer le patron de conception stratégie (<- lien wiki en français)

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    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 296
    Par défaut
    +1 pour faire ça à la conception. Prévoir 2 politiques dans une classe (template). Chaque politique s'occupant de choisir l'implémentation d'une des 2 fonctions.
    Avec, passer les 4 instanciations templates possibles à google.benchmark.

    La difficulté: extraire les politiques des classes originales. Cela peut être complexe s'il y a beaucoup de dépendances à des membres "partagés" avec d'autres fonctions membres.
    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...

  5. #5
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    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 513
    Par défaut
    Bonjour,

    Attention, pour les tests, si tes fonctions funcX_implemY ont un temps d'exécution très très court, alors la performance de leur code dépendra du contexte dans lequel elles seront appelées.
    Pour plus de détails, voir l'article : The wrong way of benchmarking the most efficient integer comparison function.
    Alors, une solution fiable serait de faire de la compilation conditionnelle avec le préprocesseur (avec #if ou #ifdef), de compiler le programme pour chacune des versions et de lancer un script qui compare les temps d'exécution.

    Par contre, si les fonctions funcX_implemY sont suffisamment lentes pour que le contexte appelant n'ait pas d'impact sur les performances, alors tu peux faire ce que tu veux. Remarque : si tu fais de l'inversion des dépendances, alors tu pourras plus facilement ajouter de nouvelles implémentations.

    Exemples d'inversion des dépendances :
    • Patron de conception stratégie (cité par foetus) : la classe My_class stocke deux références vers des classes de base. Les implémentations des funcX_implemY sont dans les classes dérivées.
    • Classes de politique (citées par Luc Hermitte) : My_class devient un template avec deux paramètres. Les deux arguments du template sont des types dont une des opérations implémente une des fonctions funcX_implemY.
    • La classe My_class stocke deux std::function (cas particulier des foncteurs cités par Bousk).

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 2
    Par défaut
    Bonjour à tous,

    Merci pour vos réponses.
    J'ai implémenté ça avec de la compilation conditionnelle

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #define IMPLEM_FUNC1 1
    #define IMPLEM_FUNC2 1
    #include <iostream>
     
    class My_class {
    public:
        My_class();
        int func1();
        int func2();
    };
     
    My_class::My_class(){}
     
    ///////////////////////////////////////
    // Definition de la premiere methode //
    ///////////////////////////////////////
     
    #if IMPLEM_FUNC1==1
     
    int My_class::func1() {
        return 2+2;
    }
     
    #elif IMPLEM_FUNC1==2
     
    int My_class::func1() {
        return 2*2;
    }
     
    #endif
     
    ///////////////////////////////////////
    // Definition de la deuxieme methode //
    ///////////////////////////////////////
     
    #if IMPLEM_FUNC2==1
     
    int My_class::func2() {
        return 4*3;
    }
     
    #elif IMPLEM_FUNC2==2
     
    int My_class::func2() {
        return 4+4+4;
    }
     
    #endif
     
    ///////////////////////////////////////
     
    int main() {
        My_class my_class;
        std::cout << my_class.func1() << std::endl;
        std::cout << my_class.func2() << std::endl;
        return 0;
    }
    J'ai l'impression que ça fait un peu "bidouillage" mais je vais me contenter de ça pour l'instant et essayer de comprendre comment fonctionnent vos autres solutions.

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

Discussions similaires

  1. Plusieurs retours d'une méthode
    Par yanis97 dans le forum Langage
    Réponses: 10
    Dernier message: 15/11/2006, 17h18
  2. Réponses: 15
    Dernier message: 27/09/2006, 11h46
  3. Affichage sur plusieurs lignes d'une méthode toString
    Par Flophx dans le forum Interfaces Graphiques en Java
    Réponses: 9
    Dernier message: 24/05/2006, 16h30
  4. comment gérer plusieurs locks sur une table?
    Par charluber dans le forum Oracle
    Réponses: 4
    Dernier message: 18/04/2006, 21h28
  5. [VB.NET]Comment gérer plusieurs boutons en 1 méthode Click ?
    Par Cydreav dans le forum Windows Forms
    Réponses: 4
    Dernier message: 05/02/2006, 23h53

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