Usage de 'static'...
2 participants
Page 1 sur 1
Usage de 'static'...
Bonjour,
http://www.bien-programmer.fr/notes.php#static
En lisant ceci j'ai vu qu'il était indiqué déviter d'utiliser static devant un objet défini dans un bloc et surtout dans une bibliothèque.
Il est dit :
J'ai essayé de me renseigner sur diverses FAQ comme celle de developpez.com mais j'ai rien trouvé.
On pourrai m'en dire plus svp ?
Merci d'avance !
http://www.bien-programmer.fr/notes.php#static
En lisant ceci j'ai vu qu'il était indiqué déviter d'utiliser static devant un objet défini dans un bloc et surtout dans une bibliothèque.
Il est dit :
Je ne comprends pas en quoi c'est sale et pourquoi c'est à éviter ?
Place la variable dans la mémoire statique, la rendant persistante. Usage rarissime (quick'n dirty).
A éviter, surtout pour du code réutilisable (bibliothèque).
J'ai essayé de me renseigner sur diverses FAQ comme celle de developpez.com mais j'ai rien trouvé.
On pourrai m'en dire plus svp ?
Merci d'avance !
QG- Bavard
- Messages : 11
Date d'inscription : 19/10/2010
Re: Usage de 'static'...
C'est à éviter, car l'espace mémoire ainsi implémenté est unique. La fonction ne peut donc traiter qu'une seule implémentation de l'objet. Comme je l'ai dit, le cas où de telles variables sont utiles sont rarissimes (compteurs de debug, d'erreurs, d'appels de fonction ou générateur pseudo aléatoire ...).
Dans tous les autres cas, on a intérêt à écrire une fonction (ou une famille de fonctions) traitant un nombre quelconque d'objets définis à l'extérieur (programmation orientée objet ...)
http://www.bien-programmer.fr/tad.htm
Dans tous les autres cas, on a intérêt à écrire une fonction (ou une famille de fonctions) traitant un nombre quelconque d'objets définis à l'extérieur (programmation orientée objet ...)
http://www.bien-programmer.fr/tad.htm
Re: Usage de 'static'...
C'est donc à éviter pour les fonctions qui seront potentiellement utilisées dans un contexte multithread si je comprends bien ?
Après oui je sais que l'on utilise rarement ce genre de variable mais leur simple utilisation dans une fonction qui compte les appels de fonction par exemple n'est pas un réel problème, non ? Ce n'est pas du "vite fait mal fait" ?
Après oui je sais que l'on utilise rarement ce genre de variable mais leur simple utilisation dans une fonction qui compte les appels de fonction par exemple n'est pas un réel problème, non ? Ce n'est pas du "vite fait mal fait" ?
QG- Bavard
- Messages : 11
Date d'inscription : 19/10/2010
Re: Usage de 'static'...
Je n'ai pas évoqué le problème du multithreading, mais oui, bien sûr, il peut se poser si il y a des accès en écriture à la variable. Mais même en monothread, c'est une pratique peu recommandable en dehors des cas que j'ai évoqué, car ça 'plombe' la fonction, en lui interdisant toute réutilisation intelligente (à cause l'absence de séparation code/données, qui est la base de la Bonne Programmation).
Quelle application exacte veux-tu faire ?
Quelle application exacte veux-tu faire ?
Re: Usage de 'static'...
Oh je ne veux rien écrire de particulier, je me suis juste interrogé quand j'ai vu l'article.
Mais je ne comprends pas où tu veux en venir en disant qu'en utilisant ce genre de variable il n'y a pas de séparation code/données et donc que cela empêcherai la réutilisation intelligente de la fonction.
Mais je ne comprends pas où tu veux en venir en disant qu'en utilisant ce genre de variable il n'y a pas de séparation code/données et donc que cela empêcherai la réutilisation intelligente de la fonction.
QG- Bavard
- Messages : 11
Date d'inscription : 19/10/2010
Re: Usage de 'static'...
C'est parce que tu manques d'expérience ... As-tu lu mon article sur les ADT ?
Re: Usage de 'static'...
Oui j'ai déjà lu l'article et je viens de le relire et je ne comprends toujours pas en quoi l'utilisation de static fait qu'il n'y a plus de séparation code/données
Tu n'aurais pas un exemple pour être plus explicite et pour que cela soit plus clair pour moi ?
Tu n'aurais pas un exemple pour être plus explicite et pour que cela soit plus clair pour moi ?
QG- Bavard
- Messages : 11
Date d'inscription : 19/10/2010
Re: Usage de 'static'...
Tout simplement parce que ce type de mauvaise conception fait que les données font partie intégrante de la fonction (donc du code). Elles ne peuvent être instanciées qu'une seule fois. Si on veut traiter une deuxième instance des données, on doit copier la fonction (et donc créer une nouvelle variable statique) et changer son nom ... Absurde. On multiplie la taille du code, alors que si on conçoit correctement, on ne doit écrire le code qu'une seule fois. Il sert pour n'importe quel nombre d'instanciations des données traitées.
Par exemple, soit une fonction qui fait un compteur :
avec une variable 'static' :
Utilisation :
Évidemment, non. Mauvaise conception.
La Bonne Conception, c'est de séparer le code et les données.
Code écrit directement dans la réponse. Rien n'a été testé.
Par exemple, soit une fonction qui fait un compteur :
avec une variable 'static' :
- Code:
int count(void)
{
static int n; /* 0 par défaut à l'initialisation */
n++;
return n;
}
Utilisation :
- Code:
#include <stdio.h>
int main (void)
{
int n;
n = count();
printf("n = %d\n"); /* 1 */
n = count();
printf("n = %d\n"); /* 2 */
return 0;
}
Évidemment, non. Mauvaise conception.
La Bonne Conception, c'est de séparer le code et les données.
- Code:
/* code pur : pas de données. */
int compteur (int *pn)
{
int n = -1; /* erreur : pointeur NULL : retourne le code d'erreur -1. */
if (p != NULL)
{
n = *p; /* récupérer la valeur */
n++; /* l'incrémenter */
*p = n; /* sauvegarder la valeur */
}
return n;
}
- Code:
#include <stdio.h>
int main (void)
{
int n = 0; /* les données sont crées et gérées dans l’application
et non dans la fonction de traitement qui est unique ... */
n = count(&n);
printf("n = %d\n"); /* 1 */
n = count(&n);
printf("n = %d\n"); /* 2 */
return 0;
}
Code écrit directement dans la réponse. Rien n'a été testé.
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|