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 :

Éviter une série de if/else


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 Éviter une série de if/else
    Bonsoir,

    Disons que j'ai un vecteur non mutable d'objets contenant pas mal de propriétés.
    Je dois parcourir consécutivement cette liste d'objets, et faire des traitements en fonction de la suite d'objets de ce vecteur.
    Le résultat de ces traitement produit un unique objet résultat, qui va éventuellement être "augmenté" lors du parcours de chaque objet.
    En parallèle de la mise à jour de cet objet, des variables d'état du traitement, extérieures au vecteur d'entrée et à l'objet résultat, seront mises à jour par la consultation des objets et le traitement en question.

    Ce traitement n'est pas du tout parallélisable, car les traitements pour un objets donné dépendront de la valeur des objets qui le précèdent (pas de tous, mais des quelques précédents).

    C'est donc plus ou moins équivalent à une fonction du type (c'est conceptuel, à la louche) :

    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
    Result maFonction(const std::vector<Objet>& sequence)
    {
        Result r;
     
        int a, b, c, d;    // variables d'état
        const Objet* previousElem = nullptr;
     
        for (const auto& elem : sequence)
        {
              // lecture de certaines données de elem
     
              // énorme quantité de if/else, avec :
              // - utilisation de previousElem
              // - utilisation des états
              // - mise à jour des états
              // - mise à jour de r
     
              objet = &elem;
        }
     
        return r;
    }
    Un bête codage impératif m'amènerait à un complexe arbre de décision (pas tant lié au nombre d'objets qu'aux nombreuses propriétés de chacun), avec des if/else en pagaille.

    Il me faut donc sortir des paradigmes habituels, dont on a tous une vague connaissance, mais qu'on a peu souvent exploré : programmation logique (Haskell ?), détournement d'une machine à états...

    Les traitements sont algorithmiquement primitifs, et la complexité se résume en fait à ces if/else, qu'on peut voir comme des règles. Idéalement, il serait apprécié qu'elles puissent être définies dans un fichier externe, et dans un langage simple.

    Qu'auriez-vous à me suggérer ?

    Il n'est pas du tout sûr que le C++ soit le langage le plus à même de répondre à mon besoin (malheureusement).

  2. #2
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 476
    Points
    11 476
    Billets dans le blog
    11
    Par défaut
    Est-ce que le Design Pattern Visitor conviendrait?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    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,

    Des solutions, il y en a en pagaille, et ca va d'une fonction récursive au patron de conception visiteur en passant par solutions bien plus complexes comme le duck-typing associé à un patron de conception proche du chain of responsability, par la mise en place d'un système proche de la manière dont on implémenterait AST ou l'utilisation d'un système proche d'un ECS, j'en passe et de meilleures.

    Le problème, c'est que, sans avoir plus de précision, il nous sera totalement impossible de t'aider à choisir une solution plutôt qu'une autre, "simplement" parce que toutes les techniques envisageables n'ont pas forcément les mêmes finalités ni les mêmes contraintes.

    Dés lors, si tu pouvais nous donner un exemple des données que tu dois traiter (en tout cas, des propriétés qui t'intéressent pour ces données) et du genre décision que tu dois prendre, cela nous aiderait surement énormément à t'orienter dans "la bonne voie"
    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

  4. #4
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Je dois parcourir cette liste d'objets, et faire des traitements en fonction de la suite d'objets de ce vecteur. Ce traitement n'est pas du tout parallélisable, car les traitements pour un objets donné dépendront de la valeur des objets qui le précèdent (pas de tous, mais des quelques précédents).
    Comme le dit Koala, ta description est bien abstraite. De ce que tu dis: traitements non parallélisables dépendant des traitements précédents, je pense tout de suite aux expressions régulières. Il y a bien des façons de s'y attaquer. J'avais trouvé un article qui traitait le sujet en profondeur: https://swtch.com/~rsc/regexp/regexp1.html. L'auteur fait une analyse intéressante des machines à état, en particulier leurs variantes déterministes/non déterministes.

    Dans un style beaucoup plus léger, il y a le premier chapitre de Beautiful code où Kernighan développe une approche récursive très élégante, avec quelques limites. Le chapitre est disponible sous forme d'article sur le site de Princeton: http://www.cs.princeton.edu/courses/...beautiful.html

    Normalement ton problème devrait être plus simple car si le traitement ne dépend que des éléments précédents et pas des éléments futurs, tu ne devrais pas être forcé au back-tracking.

    Il me faut donc sortir des paradigmes habituels, dont on a tous une vague connaissance, mais qu'on a peu souvent exploré : programmation logique (Haskell ?), détournement d'une machine à états...

    Qu'auriez-vous à me suggérer ?

    Il n'est pas du tout sûr que le C++ soit le langage le plus à même de répondre à mon besoin (malheureusement).
    Je ne sais pas si j'aurais classé Haskell du côté "programmation logique" (je ne sais pas si le terme est réservé mais je l'aurais employé plutôt pour la famille Prolog) mais certaines particularités des langages fonctionnels permettent de réduire la complexité liée à un arbre de décision. Pour un exemple plus ou moins pertinent selon les données concrètes de ton problème, tu peux jeter un oeil aux red-black trees d'Okasaki. Le pattern-matching y est utilisé de façon très ingénieuse.

  5. #5
    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
    Citation Envoyé par koala01 Voir le message
    Dés lors, si tu pouvais nous donner un exemple des données que tu dois traiter (en tout cas, des propriétés qui t'intéressent pour ces données) et du genre décision que tu dois prendre, cela nous aiderait sûrement énormément à t'orienter dans "la bonne voie"
    Ce n'est pas évident, car c'est très métier et complexe. J'essaye de trouver un en exemple équivalent, mais ce n'est pas évident.
    J'espère que la modification de mon message initial pourra t'éclairer.
    Mais je vais essayer de gamberger pour trouver un exemple parlant.

    Citation Envoyé par koala01 Voir le message
    Des solutions, il y en a en pagaille, et ca va d'une fonction récursive au patron de conception visiteur en passant par solutions bien plus complexes comme le duck-typing associé à un patron de conception proche du chain of responsability, par la mise en place d'un système proche de la manière dont on implémenterait AST ou l'utilisation d'un système proche d'un ECS, j'en passe et de meilleures.
    Pour le visiteur, ça ne me parait pas adapté. On n'est pas dans la problématique ouvert/fermé.
    Pour la chaîne de responsabilité, à moins de créer des objets matérialisant les "choix", et qui se renvoient la balle, je ne vois pas trop. Mais je n'ai pas une assez bonne connaissance des design patterns (mes employeurs me découragent toujours d'en utiliser : trop compliqué pour la maintenance...pfff). Mais l'AST pourrait être un solution.
    L'ECS, je ne sais pas ce que c'est.

    @stendhal666 : je vais prendre le temps de lire tes liens, et je te répondrai au plus tard ce soir !

  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
    Citation Envoyé par oodini Voir le message
    Ce n'est pas évident, car c'est très métier et complexe. J'essaye de trouver un en exemple équivalent, mais ce n'est pas évident.
    J'espère que la modification de mon message initial pourra t'éclairer.
    Mais je vais essayer de gamberger pour trouver un exemple parlant.
    Oui, je sais ce que c'est... c'est parfois pas évident d'extraire une partie métier pour en donner un exemple précis

    Pour le visiteur, ça ne me parait pas adapté. On n'est pas dans la problématique ouvert/fermé.
    Ce n'était qu'un exemple de solution, pour bien montrer qu'il y en avait en masse
    Pour la chaîne de responsabilité, à moins de créer des objets matérialisant les "choix", et qui se renvoient la balle, je ne vois pas trop. Mais je n'ai pas une assez bonne connaissance des design patterns
    j'ai dit "proche du DP" Je veux dire par là que, si tu peux déterminer les conditions dans lesquelles chaque traitement est observé, tu peux assez facilement faire en sorte de tester une condition d'exécution du traitement à la fois et, si tu n'est pas dans les bonnes conditions, tu passes la main
    Tu pourrais d'ailleurs aussi envisager d'avoir un tableau de std::function dont chaque élément "pointerait" vers un traitement spécifique et de boucler sur tous ces éléments "tant que le dit élément n'a pas dit qu'il a pris le traitement en charge".

    (mes employeurs me découragent toujours d'en utiliser : trop compliqué pour la maintenance...pfff).
    Hein c'est quoi ces conneries... Ils peuvent aussi te décourager d'utiliser boost ou la SL, tant qu'il y sont !!!
    Mais l'AST pourrait être un solution.
    Peut être, mais attention, sa mise en place ne sera peut-être pas si évidente que cela
    L'ECS, je ne sais pas ce que c'est.
    recherche entity component system sur internet, cela te donnera une bonne idée de ce que c'est
    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

  7. #7
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 476
    Points
    11 476
    Billets dans le blog
    11
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Ils peuvent aussi te décourager d'utiliser boost ou la SL, tant qu'il y sont !!!
    Dans ma précédente boîte ils ne voulaient pas voir ça, mais demandaient l'utilisation de ATL/MFC...
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

Discussions similaires

  1. Code pour éviter une longue série
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/11/2008, 07h40
  2. Réponses: 15
    Dernier message: 26/06/2005, 15h53
  3. Réponses: 7
    Dernier message: 03/12/2004, 10h15
  4. Compression d'une série d'images jpeg
    Par Tchello dans le forum Langage
    Réponses: 3
    Dernier message: 31/08/2003, 19h59
  5. Créer une série dans un chart
    Par cyrose dans le forum C++Builder
    Réponses: 5
    Dernier message: 28/11/2002, 11h37

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