Pourquoi utiliser des constantes dans la programmation?

Je viens juste de revenir sur un peu d’étude en utilisant le livre Beginning C d’Ivor Horton. J’ai abordé le sujet de la déclaration de constantes qui semble se confondre avec des variables de la même phrase.

Juste pour clarifier, quelle est la différence en spécifiant des constantes et des variables en C, et vraiment, quand faut-il utiliser une constante au lieu d’une variable? Je sais que les gens recommandent d’utiliser une constante lorsque les informations ne changent pas lors de l’exécution du programme, mais je ne peux vraiment pas penser à un moment où une variable ne pourrait plus être utilisée.

Comme vous pouvez le deviner, une variable varie dans le temps. Si cela ne varie pas, il n’y a “pas de perte”. Lorsque vous indiquez au compilateur que la valeur ne changera pas, le compilateur peut procéder à de nombreuses optimisations, telles que l’ajout direct à la valeur et l’absence d’allocation d’espace pour la constante sur la stack.

Cependant, vous ne pouvez pas toujours compter sur votre compilateur pour être suffisamment intelligent pour pouvoir déterminer correctement si une valeur changera une fois définie. Dans toutes les situations où le compilateur est incapable de déterminer cela avec une confiance totale, le compilateur se trompera en matière de sécurité et assumera que cela pourrait changer. Cela peut avoir divers effets sur les performances, comme éviter l’alignement, ne pas optimiser certaines boucles et créer un code object moins favorable au parallélisme.

Pour cette raison, et étant donné que la lisibilité est également importante, vous devez vous efforcer d’utiliser une constante explicite chaque fois que possible et de laisser des variables pour les éléments susceptibles de changer.

Pour expliquer pourquoi les constantes sont utilisées à la place des nombres littéraux:

1) Cela rend le code plus lisible. Tout le monde sait ce qu’est 3.14 (espérons-le), mais tout le monde ne sait pas que 3,07 est le taux d’imposition sur le revenu en AP. Il s’agit d’un exemple de connaissance spécifique à un domaine. Tous ceux qui gèrent votre code à l’avenir (par exemple, un logiciel fiscal) ne le sauront pas.

2) Vous économisez du travail lorsque vous effectuez un changement. Changer chaque 3.07 à 3.18 si le taux d’imposition change à l’avenir sera ennuyant. Vous voulez toujours minimiser les changements et idéalement effectuer un seul changement. Plus vous devez effectuer de modifications simultanées, plus vous risquez d’oublier quelque chose, ce qui entraînerait des erreurs.

3) Vous évitez les erreurs risquées. Imaginons qu’il y avait deux États avec un taux d’imposition sur le revenu de 3,05, puis que l’un d’eux passe à 3,18 tandis que l’autre rest à 3,07. En vous contentant de les remplacer, vous pourriez vous retrouver avec de graves erreurs. Bien sûr, beaucoup de valeurs entières ou constantes sont plus courantes que “3.07”. Par exemple, le nombre 7 pourrait représenter le nombre de jours de la semaine et autre chose. Dans les grands programmes, il est très difficile de déterminer la signification de chaque valeur littérale.

4) Dans le cas du texte de chaîne, il est courant d’utiliser des noms symboliques pour les chaînes afin de permettre aux pools de chaînes de changer rapidement dans le cas de la prise en charge de plusieurs langues.

Notez qu’en plus des variables et des “variables constantes”, il existe également des langages avec énumération. Une énumération vous permet en fait de définir un type pour un petit groupe de constantes (par exemple, les valeurs renvoyées), de sorte que leur utilisation assurera la sécurité du type.

Par exemple, si j’ai un recensement pour les jours et les mois, je serai averti si je mets un mois dans une journée. Si j’utilise uniquement des constantes de nombre entier, il n’y aura aucun avertissement lorsque le jour 3 est affecté au mois 3. Vous voulez toujours la sécurité de type et cela améliore la lisibilité. Les énumérations sont également meilleures pour définir l’ordre. Imaginez que vous ayez des constantes pour les jours de la semaine et que vous souhaitiez maintenant que votre semaine commence le lundi plutôt que le dimanche.

L’utilisation de constantes est plus un moyen de programmation défensive, pour vous protéger de vous-même, de modifier accidentellement la valeur quelque part dans le code lorsque vous codez à 2 heures du matin ou avant d’avoir bu votre café.

Techniquement, oui, vous pouvez utiliser une variable à la place.

D’une part, l’optimisation des performances.

Plus important encore, ceci est destiné aux lecteurs humains. N’oubliez pas que votre public cible n’est pas uniquement le compilateur. Cela aide à vous exprimer en code et à éviter les commentaires.

const int spaceTimeDimensions = 4; if(gpsSattelitesAvailable >= spaceTimeDimensions) Good(); 

Les constantes ont plusieurs avantages sur les variables.

Les constantes fournissent une certaine garantie que le code ne peut pas changer la valeur sous-jacente. Ce n’est pas très important pour un projet plus petit, mais compte pour un projet plus grand avec plusieurs composants écrits par plusieurs auteurs.

Les constantes fournissent également un indice puissant au compilateur pour l’optimisation. Comme le compilateur sait que la valeur ne peut pas changer, il n’a pas besoin de charger la valeur à partir de la mémoire et peut optimiser le code pour qu’il ne fonctionne que pour la valeur exacte de la constante (par exemple, le compilateur peut utiliser des décalages pour la multiplication / division si le const est une puissance de 2.)

Les constantes sont également insortingnsèquement statiques – vous pouvez déclarer la constante et sa valeur dans un fichier d’en-tête, sans avoir à vous soucier de la définir exactement à un endroit.

Pour un langage de bas niveau tel que C, les constantes permettent plusieurs optimisations de compilation.

Pour un langage de programmation en général, vous n’en avez pas vraiment besoin. Les langages dynamics de haut niveau tels que Ruby et JavaScript ne les ont pas (ou du moins pas dans un vrai sens constant). Les variables sont utilisées à la place, comme vous l’avez suggéré.

Le mot-clé const est souvent utilisé dans les parameters de fonction, en particulier les pointeurs, pour suggérer que la mémoire vers laquelle le pointeur pointe ne sera pas modifiée par la fonction. Regardez la décélération de strcpy par exemple:

 char *strcpy(char *dest, const char *src); 

Sinon, par exemple, une déclaration telle que

 const int my_magic_no = 54321; 

pourrait être préféré à:

 #define MY_MAGIC_NO 54321 

pour des raisons de sécurité.

Constante, c’est quand vous voulez juste partager la mémoire, et cela ne change pas.

C’est un moyen très facile de piéger une certaine classe d’erreurs. Si vous déclarez une variable const et essayez accidentellement de la modifier, le compilateur vous appellera dessus.

Les constantes sont très nécessaires en ce qui concerne la déclaration et l’initialisation de la variable pour quelque fin que ce soit, par exemple au début de la boucle, pour vérifier la condition dans l’instruction if -else, etc.

Pour plus de références, n’hésitez pas à lire l’un des articles suivants:

  • Constantes dans le langage de programmation C
  • Variables en langage C

Ne pas utiliser const peut signifier que quelqu’un dans un projet d’équipe peut déclarer où int FORTY_TWO = 42 et le rendre égal à FORTY_TWO = 41 ailleurs par un autre membre de l’équipe. Par conséquent, la fin du monde arrive et vous perdez également la réponse à la vie. avec const bien que rien de tout cela ne se produise. Plus const est stocké ailleurs dans la mémoire, comparé au stockage de variables normales, et est plus efficace.