Il y a plusieurs raisons pour lesquelles je n'aime pas l'auto à usage général:
- Vous pouvez refactoriser le code sans le modifier. Oui, c’est l’un des avantages souvent mentionnés de l’utilisation de l’auto. Il suffit de changer le type de retour d'une fonction et si tout le code qui l'appelle utilise auto, aucun effort supplémentaire n'est requis! Vous appuyez sur Compile, cela crée - 0 avertissements, 0 erreurs - et vous ne faites que vérifier votre code sans avoir à gérer le fouillis lié à la recherche et à la modification éventuelle des 80 emplacements utilisés par la fonction.
Mais attendez, est-ce vraiment une bonne idée? Et si le type importait dans une demi-douzaine de ces cas d'utilisation, et que ce code se comporte réellement différemment? Cela peut aussi implicitement rompre l’encapsulation, en modifiant non seulement les valeurs d’entrée, mais également le comportement de l’implémentation privée d’autres classes qui appellent la fonction.
1a. Je crois au concept de "code auto-documenté". La raison derrière le code auto-documenté est que les commentaires ont tendance à devenir obsolètes, ne reflétant plus ce que fait le code, alors que le code lui-même - s'il est écrit de manière explicite - est explicite, reste toujours à jour sur son intention, et ne vous laissera pas confus avec des commentaires obsolètes. Si les types peuvent être modifiés sans avoir à modifier le code lui-même, le code / les variables elles-mêmes peuvent devenir obsolètes. Par exemple:
auto bThreadOK = CheckThreadHealth ();
Sauf que le problème est que CheckThreadHealth () a été refactored à un moment donné pour renvoyer une valeur enum indiquant le statut d'erreur, le cas échéant, au lieu d'une valeur booléenne. Mais la personne qui a effectué cette modification a manqué d'inspecter cette ligne de code et le compilateur n'a pas aidé, car elle a été compilée sans avertissements ni erreurs.
- Vous pouvez ne jamais savoir quels sont les types réels. Ceci est également souvent mentionné comme un "avantage" principal de auto. Pourquoi apprendre ce qu'une fonction vous donne, quand vous pouvez simplement dire: "Qui est-ce qui compte? Ça compile!"
Cela fonctionne même, probablement. Je dis un peu ça marche, parce que même si vous faites une copie d'une structure de 500 octets pour chaque itération de boucle, de sorte que vous puissiez inspecter une seule valeur dessus, le code est toujours complètement fonctionnel. Ainsi, même vos tests unitaires ne vous aident pas à vous rendre compte que le mauvais code se cache derrière cette auto simple et innocente. La plupart des autres personnes parcourant le fichier ne le remarqueront pas non plus à première vue.
Cela peut également être aggravé si vous ne connaissez pas le type, mais que vous choisissez un nom de variable qui fait fausse hypothèse sur son contenu, obtenant en fait le même résultat que dans 1a, mais dès le début plutôt que post-refactor.
- Taper le code lors de la première écriture n’est pas la partie la plus longue de la programmation. Oui, auto rend l'écriture de code plus rapide au départ. En termes de non-responsabilité, je tape> 100 WPM, alors peut-être que ça ne me dérange pas autant que les autres. Mais si tout ce que j'avais à faire était d'écrire du nouveau code toute la journée, je serais un campeur heureux. La partie la plus fastidieuse de la programmation est le diagnostic de bogues difficiles à reproduire dans le code, souvent dus à des problèmes subtils et non évidents - tels que le type de surutilisation de auto est susceptible d’introduire (référence signé vs non signé, float vs int, bool vs pointeur, etc.).
Il me semble évident que auto a été introduit principalement comme solution de contournement pour la syntaxe terrible avec les types de gabarit de bibliothèque standard. Plutôt que d'essayer de corriger la syntaxe de modèle que les gens connaissent déjà - ce qui peut aussi être presque impossible à faire à cause de tout le code existant qu'il pourrait endommager - ajoutez un mot-clé qui cache le problème. Essentiellement ce que vous pourriez appeler un "piratage".
En fait, je n’ai aucun désaccord avec l’utilisation de auto avec les conteneurs de bibliothèque standard. Il est évident que le mot clé a été créé et que les fonctions de la bibliothèque standard ne risquent pas de changer fondamentalement d’objet (ni de type, par conséquent), ce qui rend l’utilisation de l’auto relativement sûre. Mais je serais très prudent de l’utiliser avec votre propre code et des interfaces qui pourraient être beaucoup plus volatiles et potentiellement sujettes à des changements plus fondamentaux.
Une autre application utile de auto qui améliore les capacités du langage est la création de temporaires dans des macros indépendantes du type. C'est quelque chose que vous ne pouviez pas vraiment faire auparavant, mais vous pouvez le faire maintenant.
auto
peut souvent rendre les choses plus difficiles à lire quand elles sont déjà difficiles à lire, c’est-à-dire des fonctions trop longues, des variables mal nommées, etc. Sur des fonctions courtes avec des variables bien nommées, sachant que les types doivent être l’un des n ° 1 facile ou n ° 2 non pertinent.