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

Algorithmes et structures de données Discussion :

Avis sur une structure de programme


Sujet :

Algorithmes et structures de données

  1. #1
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut Avis sur une structure de programme
    Bonjour tout le monde !

    Dans un code, je viens de trouver une structure de l'algorithme qui me semble assez peu efficace...
    Qu'en pensez-vous ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    do
    {
      if(!ma_fonction1(arg1)) break;
      if(!ma_fonction2(arg2)) break;
      //etc...
    }while(0)
    ma_fonction1 et ma_fonction2 vont mettre en forme arg1 dans une classe par exemple, et retourner un false en cas d'erreur.

    Je trouve cela commode, mais inefficace...
    Qu'en est-il ?

    Merci d'avance !
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par progfou Voir le message
    Bonjour tout le monde !

    Dans un code, je viens de trouver une structure de l'algorithme qui me semble assez peu efficace...
    Qu'en pensez-vous ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    do
    {
      if(!ma_fonction1(arg1)) break;
      if(!ma_fonction2(arg2)) break;
      //etc...
    }while(0)
    ma_fonction1 et ma_fonction2 vont mettre en forme arg1 dans une classe par exemple, et retourner un false en cas d'erreur.

    Je trouve cela commode, mais inefficace...
    Qu'en est-il ?

    Merci d'avance !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while(mafonction1(arg1) && mafonction2(arg2));
    avec évaluation paresseuse des booléens ?
    Je ne répondrai à aucune question technique en privé

  3. #3
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Et dans le cas où ce ne sont pas deux mais 20 ou 30 fonctions (ce qui est le cas) ?
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Encore plus sale:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ma_fonction1(arg1) && ma_fonction2(arg2) && ma_fonction3(arg3);
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Oui, ok pour quelques fonctions, mais est-ce que c'est bien de faire cela quand on a des dizaines de fonctions ?
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par progfou Voir le message
    Et dans le cas où ce ne sont pas deux mais 20 ou 30 fonctions (ce qui est le cas) ?
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(!ma_fonction1(arg1));
    else if(!ma_fonction2(arg2));
    else if(!ma_fonction1(arg3));
    /* ... */
    else if(!ma_fonction20(arg20));

    sinon il y a les pointeurs sur fonctions...
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  7. #7
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Qu'est-ce qui est le mieux ?
    Ce qui sera bien optimisé par le compilo, facile à lire, etc. ?
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 114
    Points : 139
    Points
    139
    Par défaut
    Bonjour,

    Pour reprendre l'idée de pseudocode, pourquoi ne pas construire une liste chainée de "fonctions" (une implémentation possible du design pattern "chaine de responsabilité") :
    Plus :
    - code compact (sauf l'initialisation de la liste)
    - code évolutif

    Moins :
    - pas très lisible, ou du moins compréhensible

  9. #9
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Lowelace Voir le message
    Pour reprendre l'idée de pseudocode, pourquoi ne pas construire une liste chainée de "fonctions" (une implémentation possible du design pattern "chaine de responsabilité")
    Si le langage utilisé est le C, l'idée de vouloir construire un DP objet me parrait étrange. Si c'est du C++, autant utiliser un bloc try/catch
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 114
    Points : 139
    Points
    139
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Si le langage utilisé est le C, l'idée de vouloir construire un DP objet me parrait étrange. Si c'est du C++, autant utiliser un bloc try/catch


    Un design pattern est certes fortement basé sur des concepts objet mais rien n'empêche d'utiliser le concept sous-jacent avec des langages non objets, ou d'en avoir une implémentation non-objet.

    Une liste de fonctions que l'on parcourt est une façon de faire qui reprend le concept de la chaine de responsabilité mais qui n'a rien d'objet dans son implémentation.

    Ce n'est peut-être pas non plus la solution optimale (en terme de performances), c'est une question de compromis.

  11. #11
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Lowelace Voir le message
    Une liste de fonctions que l'on parcourt est une facon de faire qui reprend le concept de la chaine de responsabilité mais qui n'a rien d'objet dans son implémentation.
    Parcourir une liste de fonctions et le DP chaine de responsabilité ce n'est quand meme pas pareil.

    De toutes facons, la contrainte d'utiliser des arguments identiques pour chaque appel de fonction ne semble pas être possible ici.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 114
    Points : 139
    Points
    139
    Par défaut
    Repris de la Wikipédia :
    En génie logiciel, le patron de conception Chaîne de responsabilité permet à un nombre quelconque de classes d'essayer de répondre à une requête sans connaître les possibilités des autres classes sur cette requête. Cela permet de diminuer le couplage entre objets. Le seul lien commun entre ces objets étant cette requête qui passe d'un objet à l'autre jusqu'à ce que l'un des objets puisse répondre.
    Pour moi, une liste de fonctions que l'on parcourt répond à cette définition, même si je te l'accorde, c'est une implémentation "préhistorique".

    Par contre, je suis aussi d'accord sur le fait que si les paramètres sont différents, çà complique les choses

  13. #13
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Lowelace Voir le message
    Pour moi, une liste de fonctions que l'on parcourt répond à cette définition, même si je te l'accorde, c'est une implémentation "préhistorique".
    Dans l'implémentation de référence du GoF, chaque handler ne connait que son successeur => implémentation en liste chainée (d'où le nom du pattern ).

    Utiliser une liste et un itérateur n'est pas pour moi une implémentation du pattern CoR.

    Par contre, je suis aussi d'accord sur le fait que si les paramètres sont différents, çà complique les choses
    Comme tu l'as dit toi même:

    En génie logiciel, le patron de conception Chaîne de responsabilité permet à un nombre quelconque de classes d'essayer de répondre à une requête sans connaître les possibilités des autres classes sur cette requête. Cela permet de diminuer le couplage entre objets. Le seul lien commun entre ces objets étant cette requête qui passe d'un objet à l'autre jusqu'à ce que l'un des objets puisse répondre.
    Si chaque handler doit gérer une requête différente, ca n'a plus rien a voir avec l'objectif du pattern.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 114
    Points : 139
    Points
    139
    Par défaut
    On n'est pas dans une implémentation stricto sensu du pattern, mais l'idée sous-jacente reste la même.

    C'est ce qui, à mon avis, est le plus important.

    progfou : quelles têtes ont les paramètres des fonctions ?

  15. #15
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    C'est très variable.
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  16. #16
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    je pense que ton approche de départ est la plus simple. Peut-etre en utilisant un autre type de bloc que le do/while, comme par exemple le switch.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    switch(0) { 
    case 0:
    	if(!ma_fonction1(arg1))  break;
    	if(!ma_fonction2(arg2))  break;
    	if(!ma_fonction3(arg3)) break;
    }

    Peut-etre également utiliser des #define pour simplifier la relecture...

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #define TRY_BEGIN  switch(0) {case 0:
    #define TRY(f) if (!f) break;
    #define TRY_END  }

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TRY_BEGIN {
    	TRY( ma_fonction1(arg1) );
    	TRY( ma_fonction2(arg2) );
    	TRY( ma_fonction3(arg3) );
    } TRY_END;
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

Discussions similaires

  1. [Modèle Relationnel] Avis sur la structure d'une table
    Par le_bono dans le forum Schéma
    Réponses: 4
    Dernier message: 28/07/2009, 05h39
  2. Avis sur la façon de programmer une équation
    Par feynman dans le forum Fortran
    Réponses: 1
    Dernier message: 24/04/2008, 13h59
  3. Avis sur la structure d'une base de données
    Par ange_dragon dans le forum Modélisation
    Réponses: 2
    Dernier message: 29/05/2007, 15h45
  4. avis sur une structure css
    Par sardo dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 13/03/2007, 17h19
  5. [Programmation distribuée] Votre avis sur une archi
    Par Acarp47 dans le forum Plateformes (Java EE, Jakarta EE, Spring) et Serveurs
    Réponses: 7
    Dernier message: 29/06/2005, 14h01

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