10
votes

Est-ce que je abuse `const`?

Ces dernières semaines, je me suis retrouvé en utilisant beaucoup de const code> partout. Non seulement dans les méthodes ou les déclarations d'arguments, mais même pour les variables temporaires.

Permettez-moi d'illustrer avec une fonction simple. P>

J'écris: P>

// A dummy function that sums some computation results
unsigned int sum_results(const Operation& p1, const Operation& p2)
{
  const unsigned int result1 = p1.computeResult();
  const unsigned int result2 = p2.computeResult();

  // Well this function could be in one single line but
  // assume it does more complex operations
  return result1 + result2;
}


1 commentaires

INT IN Unsigné Int ne fournit aucune information nouvelle ou utile, vous devez supprimer un bruit inutile.


7 Réponses :


22
votes

Utiliser const sur les variables locales améliore la clarté du code, c'est donc une bonne idée. Vous voyez const et vous savez immédiatement que la variable n'est jamais modifiée plus tard dans la portée. Il s'agit de la même série que de faire des fonctions courtes et retourner tôt .

Les développeurs sont paresseux - ils pensent souvent que c'est un mot inutile qui ne change rien. Imo ils sont faux.


4 commentaires

+1. Mettre la const sur les variables locales qui ne vont pas changer (ou ne devrait pas changer) capte des erreurs avant qu'elles ne se produisent (à l'heure de la compilation) et montre clairement votre intention du prochain programmeur qui doit examiner votre code.


Mais cela conduirait-il à une meilleure performance ou à une meilleure optimisation par le compilateur.


@DumbCoder: Peut-être, mais très improbable. Les compilateurs modernes sont très bons pour optimiser le code. Si l'on se soucie vraiment, ils devraient essayer les deux et inspecter le code de la machine émise.


@DumbCoder: extrêmement improbable, SLIG et GCC utilisent des représentations SSA et savent ainsi si une variable est jamais modifiée ou non. Cependant, cela indique l'intention envers le compilateur, de sorte que plus tard essayer d'y accéder provoque une erreur et oblige le développeur à penser s'il est approprié ou non.



5
votes

C'est effectivement la même raison pour laquelle les assertions sont rarement utilisées. const sur les interfaces est obligatoire, const dans la mise en œuvre est volontaire. Les programmeurs sont paresseux.

Edit: Juste au cas où il ne serait pas clair, votre approche est meilleure.


0 commentaires

1
votes

Il n'y a rien mal avec cela, mais vous utilisez Const d'enraciner le compilateur pour vous aider à appliquer une contrainte, lorsque vous connaissez un objet ne devriez pas être modifié. Si vous ne entre vous si l'objet est modifié, il est superflu.


2 commentaires

Même si cet exemple factice, ni résultat1 ou résultat2 sont destinés à être modifiés. Ils tiennent une valeur qui ne devrait pas changer. Cela ne me dérange pas d'avoir plus de coups de frappe chaque fois que je peux rendre mon code moins sujet d'erreur.


"ni résultat1 ou résultat2 ne sont destinés à être modifiés. Ils tiennent une valeur qui ne devrait pas changer" alors ils devraient être constitués. Mon point n'est que que vous le faites pour une raison, et si vous êtes au courant de cette raison, vous ne vous sentirez pas comme si vous abusez.



1
votes

en C ++, il s'agit d'une bonne approche pour constituer des variables de constituer si vous le pouvez. Mais cela a dit cela, cela a plus de sens dans les cas où une variable est transmise sous forme d'argument ou qu'elle est partagée entre différentes pièces de code (comme des variables de classe). L'idée principale est d'arrêter la modification accidentelle des variables par autre code qui ne sait pas que cette variable n'est pas censée être modifiée.

Par conséquent, à la lumière de ce qui précède, pour les variables locales à une fonction, les consensifiants est une sorte de surpuissance. Cependant, cela ne fait rien de mal.


0 commentaires

0
votes

Dans mon humble avis, vous devez profiter d'un compilateur de langue fortement tapée à chaque occasion. J'utilise const pour des variables locales temporaires, des références immuables, etc.

le Constitue C ++ FAQ pourrait avoir plus d'informations utiles .


0 commentaires

3
votes

Je ne pense pas qu'il soit purement un cas de programmeurs paresseux - est aussi une concision considération. Certaines personnes peuvent trouver int x; charge moins mentale que "const int x;" lors de l'examen des fonctions: ce petit espace supplémentaire pourrait les aider à mettre un commentaire à côté. Je mentionne que non pas comme une recommandation, mais parce que je pense qu'il est important de comprendre tous les « coûts » ce facteur dans l'attitude des gens, car il est vraiment déroutant que les gens n'utilisent pas systématiquement const ici.

Il est également intéressant de considérer que, à un moment donné à l'aide d'une variable dans une fonction, il peut être nécessaire de ruser. Par exemple, calculer quelque chose, mais vous allez dans quelques cas des déclarations et des choses et il y a certains cas limite où vous devez retirer un élément arrière d'une chaîne, gérer un problème hors par un, effacer la valeur etc .. Si vous aviez d'abord fait la const variable, votre flux de travail est interrompu plus de retour et supprimer const de la définition, puis revenir le curseur à l'endroit où vous travaillez. Contraire, cette habitude d'utiliser const, si possible, est un drapeau rouge que certains de ces réglages sont cachés dans le corps de la fonction, et très utile pour plus tard la compréhension et l'entretien.

Pourtant, je vous encourage activement à continuer à utiliser const: Je le font habituellement et considère les meilleures pratiques. Les raisons qui sont évidemment compris par vous, et ont été énumérés dans d'autres réponses.


0 commentaires

4
votes

Je dirais personnellement qu'il n'y a jamais trop de const , et je les utilise abondamment pour les variables locales. Le seul contexte où je pourrait ajouter un const mais n'est pas sur les paramètres de types intégrés:

void foo (const int);

Ici, je crois (mais c'est une question de goût personnel réellement) qu'il cloque inutilement l'interface.


0 commentaires