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 :

TAD - methodes de consultation modifiantes


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut TAD - methodes de consultation modifiantes
    Salux,

    Premierement, jme suis heurté à un dilemme (jpense que j'ai la reponse maintenant, mais j'en parle au cas où) : si j'ai une methode "get_next" qui renvoie le "prochain element" et fait avancer un pointeur interne, est-ce qu'il s'agit d'une methode de consultation ou de modification?
    Je ne fais que recupérer une valeur (que je compte pas modifier), et pourtant je modifie l'état interne de mon objet (puisque le prochain get_next renverra l'element suivant).
    Actuellement je pense que c'est une methode de modification puisque meme l'utilisateur de l'objet sait que ça va modifier quelquechose dans l'objet.

    Seulement, j'ai un 2eme dilemme avec un autre genre de methode, ce qui m'a amené à penser à une bidouille expliquée plus loin.
    Et bien, j'ai une methode "get_value" qui necessite un certain travail, et on voudrait pouvoir mettre en cache le resultat. Ca ne peut se faire qu'en modifiant l'objet, mais semantiquement il s'agit vraiment d'une methode de consultation. Alors j'ai pensé à ceci :

    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
     
    /* .h */
    struct _MonTad;
    typedef struct _MonTad MonTad;
     
    /* .c */
    struct my_cache
    {
      int a;
      char * b;
      char * c;
    };
     
    struct _MonTad
    {
      int a;
      int b;
      char * c;
      struct my_cache * the_cache;
    };
     
    MonTad * mt_create(void)
    {
      MonTad * mt;
      mt = calloc (1, sizeof *mt);
      mt->the_cache = calloc(1, sizeof (struct my_cache));
     
      return mt;
    }
     
    /* ... */
     
     
    const char * mt_get_value(const MonTad * mt, const char * param)
    {
      const char * ret;
      if (mt->the_cache->b != NULL && !strcmp(mt->the_cache->b, param))
      {
        ret = mt->the_cache->c;
      }
      else
      {
        /*... */
        mt->the_cache->c = strdup(param); /* mt->the_cache est const mais pas *(mt->the_cache) */
        ret = mt->the_cache->c;
      }
     
      return ret;
    }
    Donc
    1) vous en pensez quoi?
    2) ce serait trop crade d'utiliser cette technique pour le premier probleme?
    3) vos experiences avec le premier probleme?

    Mercix

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Gruik
    1) vous en pensez quoi?
    On a introduit mutable en C++ pour ce probleme. Utiliser une indirection est un moyen de faire la meme chose en C.

    3) vos experiences avec le premier probleme?
    * get_next modifie reellement, ce n'est pas un probleme.
    * Il ne faut pas faire deux choses a la fois.
    * Avoir un iterateur externe est generalement plus utile qu'un iterateur interne.

  3. #3
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    D'acc merci

    Les iterateurs se traduisent par un tad dans le meme source que le tad concerné? c'est pas un peu lourd?

    Et quid de la technique suivante?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef void (*fonction_parcours)(const char * data_element_courant, void* user_data);
     
    void mt_parcours(const MonTad * mt, fonction_parcours f);
    C'est encore plus lourd non?

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Gruik
    C'est encore plus lourd non?
    Les iterateurs actifs ont une utilité plus restreinte, en particulier a cause du manque de fonctions locales en C.

  5. #5
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Fonctions locales

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Gruik
    Fonctions locales
    Des fonctions dont la portee est restreinte a bloc (comme les variables locales) et qui ont acces aux variables locales de ce bloc definies avant la fonction. L'ideal quand on a des iterateurs actifs, c'est d'en plus avoir des fonctions "lambda", anonymes et definies au moment ou on les utilises (donc ici, a l'appel de mt_parcours)

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

Discussions similaires

  1. Merci de consulter le support Microsoft
    Par Community Management dans le forum Windows
    Réponses: 5
    Dernier message: 01/09/2014, 00h31
  2. [METHODE] -> Détection de virus ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 11/02/2004, 17h04
  3. [DROIT] Consultant indépendant et Assedics
    Par BuLma dans le forum Licenciement
    Réponses: 12
    Dernier message: 14/12/2003, 01h25
  4. Passage de variable par methode post ?
    Par oazar dans le forum Flash
    Réponses: 33
    Dernier message: 16/10/2003, 17h03
  5. Methode de drcherche a l,interieur de basse de donner texte
    Par philippe V dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 03/12/2002, 10h20

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