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 :
Donc
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; }
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
Partager