Es gibt mehrere Gründe, warum ich Auto für den allgemeinen Gebrauch nicht mag:
- Sie können den Code umgestalten, ohne ihn zu ändern. Ja, dies ist eines der Dinge, die häufig als Vorteil der Verwendung von auto aufgeführt werden. Ändern Sie einfach den Rückgabetyp einer Funktion, und wenn der gesamte aufgerufene Code auto verwendet, ist kein zusätzlicher Aufwand erforderlich! Wenn Sie auf compile klicken, wird es erstellt - 0 Warnungen, 0 Fehler - und Sie checken einfach Ihren Code ein, ohne sich mit dem Durchsuchen und potenziellen Ändern der 80 Stellen befassen zu müssen, an denen die Funktion verwendet wird.
Aber warte, ist das wirklich eine gute Idee? Was wäre, wenn der Typ in einem halben Dutzend dieser Anwendungsfälle eine Rolle spielen würde und sich dieser Code nun tatsächlich anders verhält? Dies kann auch implizit die Kapselung unterbrechen, indem nicht nur die Eingabewerte, sondern auch das Verhalten der privaten Implementierung anderer Klassen, die die Funktion aufrufen, geändert werden.
1a. Ich glaube an das Konzept des "selbstdokumentierenden Codes". Der Grund für den selbstdokumentierenden Code ist, dass Kommentare dazu neigen, nicht mehr aktuell zu sein, was der Code tut, während der Code selbst - wenn er explizit geschrieben ist - selbsterklärend ist und immer auf dem neuesten Stand bleibt auf seine Absicht und wird Sie nicht mit abgestandenen Kommentaren verwechseln lassen. Wenn Typen geändert werden können, ohne dass der Code selbst geändert werden muss, können der Code / die Variablen selbst veralten. Zum Beispiel:
auto bThreadOK = CheckThreadHealth ();
Das Problem besteht jedoch darin, dass CheckThreadHealth () zu einem bestimmten Zeitpunkt überarbeitet wurde, um anstelle eines Bools einen Aufzählungswert zurückzugeben, der den Fehlerstatus angibt, sofern vorhanden. Die Person, die diese Änderung vorgenommen hat, hat es jedoch versäumt, diese bestimmte Codezeile zu überprüfen, und der Compiler war nicht hilfreich, da er ohne Warnungen oder Fehler kompiliert wurde.
- Sie können nie wissen, was die tatsächlichen Typen sind. Dies wird auch häufig als primärer "Vorteil" von auto aufgeführt. Warum lernen Sie, was eine Funktion Ihnen gibt, wenn Sie einfach sagen können: "Wen interessiert das? Sie kompiliert!"
Es funktioniert wahrscheinlich sogar irgendwie. Ich sage Art von Arbeit, denn obwohl Sie eine Kopie einer 500-Byte-Struktur für jede Schleifeniteration erstellen, können Sie einen einzelnen Wert darauf überprüfen, der Code ist dennoch voll funktionsfähig. Selbst Ihre Komponententests helfen Ihnen nicht zu erkennen, dass sich hinter diesem einfachen und unschuldig aussehenden Auto schlechter Code verbirgt. Die meisten anderen Personen, die die Datei durchsuchen, bemerken dies auch nicht auf den ersten Blick.
Dies kann auch noch schlimmer gemacht werden, wenn Sie den Typ nicht kennen, aber einen Variablennamen wählen, der eine falsche Annahme darüber macht, was er ist, und tatsächlich dasselbe Ergebnis wie in 1a erzielt, jedoch nicht von Anfang an Post-Refactor.
- Das Eingeben des Codes beim ersten Schreiben ist nicht der zeitaufwändigste Teil der Programmierung. Ja, Auto beschleunigt anfangs das Schreiben von Code. Als Haftungsausschluss gebe ich> 100 WPM ein. Vielleicht stört es mich nicht so sehr wie andere. Aber wenn ich nur den ganzen Tag neuen Code schreiben müsste, wäre ich ein glücklicher Camper. Der zeitaufwändigste Teil der Programmierung besteht in der Diagnose schwer reproduzierbarer Fehler in Groß- und Kleinschreibung im Code, die häufig auf subtile, nicht offensichtliche Probleme zurückzuführen sind, wie z. signiert vs. unsigniert, float vs. int, bool vs. pointer, etc.).
Es scheint mir offensichtlich, dass auto in erster Linie als Problemumgehung für schreckliche Syntax mit Standardvorlagentypen für Bibliotheken eingeführt wurde. Anstatt zu versuchen, die Schablonensyntax zu korrigieren, mit der die Benutzer bereits vertraut sind - was aufgrund des vorhandenen Codes, der möglicherweise beschädigt wird, auch fast unmöglich ist -, fügen Sie ein Schlüsselwort hinzu, das das Problem im Grunde verbirgt. Im Wesentlichen, was man als "Hack" bezeichnen könnte.
Ich bin mit der Verwendung von auto für Standard-Bibliothekscontainer eigentlich nicht einverstanden. Es ist offensichtlich, wofür das Schlüsselwort erstellt wurde, und es ist unwahrscheinlich, dass Funktionen in der Standardbibliothek ihren Zweck (oder Typ) grundlegend ändern, was die Verwendung von auto relativ sicher macht. Ich wäre jedoch sehr vorsichtig, wenn ich es mit Ihrem eigenen Code und Ihren Schnittstellen verwenden würde, die möglicherweise sehr viel unbeständiger sind und möglicherweise grundlegenderen Änderungen unterliegen.
Eine weitere nützliche Anwendung von auto, mit der die Sprachfunktionen verbessert werden, ist das Erstellen von Temporären in typunabhängigen Makros. Das ist etwas, was du vorher nicht wirklich tun konntest, aber du kannst es jetzt tun.
auto
kann die Lesbarkeit von Objekten oft erschweren, wenn sie bereits schwer lesbar sind, z. B. zu lange Funktionen, schlecht benannte Variablen usw. Bei kurzen Funktionen mit anständig benannten Variablen sollte die Kenntnis der Typen eine der Kategorien # 1 easy oder # 2 irrelevant sein.