Nach 15 Jahren C ++ habe ich immer noch nicht gelernt, const zu lieben. Ich verstehe, dass es nützlich ist, aber ich war noch nie in einer Situation, in der das Problem, mit dem ich konfrontiert war, vermieden worden wäre , wenn ich die richtigen Konstanten hatte.
Wie sind Sie dazu gekommen, die Vorteile von Consts zu lieben?
Antworten:
Nun, ich war nicht überzeugt, bis ich versuchte, die Philosophie anzunehmen.
Zunächst habe ich
const
mich an schreibgeschützte Member meiner grundlegendsten Argumente für Klassenmember und Memberfunktionen gewandt.Von dort konnte ich nicht mehr kompilieren. Dann ging ich beharrlich mit diesen Basisklassen in den Code und überprüfte, ob die zuvor vorgenommenen
const
Ergänzungen im Vergleich zu meiner Verwendung wirklich legitim waren. Es hat mir geholfen, einige Fehler auf dem Weg zu beheben, als ich anderen Teilen des Codes Konstanz verlieh.Es ist ansteckend. Der Großteil des Codes wurde noch konsistenter und ich fand es einfacher, ihn zu debuggen, da Sie sicher sind, dass der Compiler Sie anhält, wenn Sie etwas ändern, das Sie nicht sollten.
Sobald ich die Anwendung wieder zum Laufen brachte, war sie schneller (ich musste einige Algorithmen ändern, von denen ich herausgefunden habe, dass sie nicht für den Job geeignet sind), mit viel weniger Fehlern und einfacher zu verstehen, wenn ich den Code lese.
Ich war überzeugt.
Jetzt denke ich, dass es noch besser ist, wenn Sie neben der Konstanz auch viele andere Behauptungen verwenden, da Sie sich sicher fühlen, wenn Sie neuen Code schreiben oder den aktuellen Code ändern müssen. Sie wissen, dass der Compiler Sie bei Bedarf anhält. Sie müssen nicht mehr alles überprüfen, was Sie nicht ändern sollten, und haben dann mehr Bedenkzeit für mehr geschäftsspezifisches Denken oder architektonisches Denken.
quelle
const
auch für lokale Variablen, von denen ich weiß, dass sie nicht geändert werden müssen. Auf diese Weise kann ich beim Lesen von Code einif
oder einfor
oder was auch immer überfliegen: Meine Variable ist eine Konstante, ich Weiß, es wird sich nicht ändern! Ich könnte mich nicht weniger um Optimierungen kümmern, aber ich habe ein begrenztes Gehirn, und ein paar Einrückungen + Konstanten-Korrektheit helfen sehr!Ich war noch nie ein Befürworter der objektorientierten Programmierung, und wenn überhaupt, bin ich umso weniger gewachsen, je mehr ich über das Programmieren im Allgemeinen lerne. Als ich mich mit verschiedenen Programmierparadigmen befasst habe, wurde mir klar, dass Unveränderlichkeit eines der zentralen Konzepte des Programmdesigns ist, das sich auf Software auswirkt, die nach einer beliebigen Philosophie geschrieben wurde. Dies ist bei der funktionalen Programmierung von enormer Bedeutung. Dies hat Auswirkungen auf die Optimierung und die Parallelität, zusätzlich zu den einfachen Sicherheitsgarantien.
Grundsätzlich sollte alles, was unveränderlich sein kann, wahrscheinlich sein, es sei denn, Sie haben einen guten Grund für einen veränderlichen Zustand. Meiner Erfahrung nach führt das Schreiben von Programmen in einer beliebigen Sprache, um dieses Ziel zu erreichen, zu sichererem und besserem Code. Sie haben nichts zu verlieren, wenn Sie es verwenden
const
- die Unveränderlichkeit ist kostenlos!(Im Übrigen habe ich mit der Idee gespielt, einen Fork von GCC für einen Dialekt von C ++ zu erstellen, in dem alle Typen verwendet werden, es
const
sei denn, dies wird ausdrücklich als qualifiziertmutable
. Wenn es Unterstützung für so etwas gibt, werde ich mich voll und ganz verpflichten, ihn zu pflegen und zu verwenden.)Vom OO-Standpunkt aus erzwingt die Unveränderlichkeit die Kapselung, indem ein uneingeschränkter Schreibzugriff verhindert wird. Dies verringert die Kopplung zwischen Klassen, da unveränderliche Objekte ihren eigenen Zustand vollständig verwalten und sich daher wie gewöhnliche Werte verhalten müssen. Die Konstanten-Korrektheit erleichtert den Nachweis der Programmkorrektheit erheblich, insbesondere im Zusammenhang mit der gleichzeitigen Programmierung. Mit der C ++ - Referenz- und der C ++ - R-Wert-Referenzsemantik können Sie unveränderliche Objekte verwenden, ohne sich Gedanken über den Aufwand machen zu müssen, sie überall zu kopieren. Darüber hinaus kann der Compiler einige erstaunliche Optimierungsmagie ausführen, wenn Sie mit größtenteils unveränderlichen Objekten arbeiten.
Ich weiß, es ist scheiße,
const
überall zu tippen , aber man gewöhnt sich schnell daran und die Vorteile werden im Laufe der Zeit in Bezug auf Zuverlässigkeit und Wartbarkeit deutlich. Ich bin kein brillanter Schriftsteller, und es scheint eine erwiesene schwierige Aufgabe zu sein, dafür einzutreten, aber ich weiß, dass die Konstanten-Korrektheit für mich als Entwickler beim Entwerfen und Implementieren von Programmen immens hilfreich war, und ich denke, dass dies Erfahrung ist der beste Lehrer in dieser Hinsicht.quelle
mutable
, da es eine klare Bedeutung in Bezug auf die Konstanten-Korrektheit hat. Dies bedeutet, dass sich dieses Datenobjekt auf eine Weise ändern kann, die sich nicht auf das Objektverhalten auswirkt, und Dinge wie das Zwischenspeichern von Antworten ermöglicht. Machen Sie ein anderes Schlüsselwort.mutable
ist die logische Wahl.void alter(mutable Point&)
Sinn macht, wiemutable int foo
für eine lokale Variable, und keiner dieser Konflikte mit der vorhandenen Sprache oder der vorhandenen Verwendung vonmutable
. AuchObject mutable* mutable
sieht unheimlich genug , um eine Warnung vor zu sein , ob es notwendig ist oder nicht vollständig entsprechen.Der Vorteil der konstanten Korrektheit besteht darin, dass dem Programm Disziplin auferlegt wird und es einfacher ist, über Teile des Programms nachzudenken.
Die Disziplin ist, dass Sie wissen müssen, wo sich etwas ändern könnte. Der entsprechende Vorteil besteht darin, dass Sie leichter erkennen können, was ein Codeteil bewirkt, wenn Sie erkennen, was den Status möglicherweise ändert.
quelle
Als const die Richtigkeit der Konstruktion richtig betont , die ich in der Nähe zu einem ähnlichen Problem zu behandeln, die nicht Guss Operatoren; Verwenden Sie also kein Cast und stellen Sie sicher, dass die Konstanten korrekt sind, und verwenden Sie nur wenig Mutables. All dies sind Hinweise, um zu messen, wie gut das Design ist, aber nicht die tatsächlichen Tools, um das vorliegende Gesamtproblem zu lösen.
PS: Ich war total überzeugt,
const
als ich die Korrektheit des Gebrauchs verstanden habe;)quelle
Ich sehe zwei Hauptgründe für das Schreiben von const-korrekten Code. Zum einen ist der Compiler Ihr Freund, und mit const können Sie sich vor möglichen Fehlern warnen lassen. Der zweite Grund ist, dass durch die Konstanten-Korrektheit der Code besser lesbar wird. Beispielsweise wissen Sie immer, welche Funktionsargumente Eingaben und welche Ausgaben sind. Sie wissen auch, welche Elementfunktionen das Objekt ändern und welche nicht. Sie kennen diese Dinge sofort, ohne den Code durchlesen zu müssen. Dies setzt natürlich eine sehr umsichtige Verwendung voraus
const_cast
.quelle
Ich war ein Konvertit, sobald ich wusste, dass es möglich war. Vom Standpunkt eines „guten Programmierstils“ aus machte es für mich Sinn. Es gibt verschiedene Gründe, warum es eine gute Praxis ist, konstant zu sein:
quelle
So fassen Sie zwei Punkte zusammen, die in anderen Antworten behandelt wurden, und fügen Sie einen neuen hinzu:
const
dokumentiert den Code für Benutzer Ihrer API. Es bildet einen Vertrag zwischen einer Funktion und ihrem Aufrufer, dass die Funktion ihre Parameter nicht ändert. (Bitte beachten Sie, dassconst_cast
eine Funktion nicht in der Lage ist, ihren Parameter zu ändern, sondern diesen Parameter an andere Funktionen weitergibt, die ihre Parameter nicht ändern, aber dieconst
Annotation vergessen haben .) Dies ist auch innerhalb von functions / loop / etc nützlich, da es das Verständnis der Parameter erheblich erleichtert genauso wie eine Schleife invariant.const
dokumentiert dem Compiler Ihre Absicht. Fehler beim Kompilieren zu finden ist immer besser, als darauf zu warten, dass der Code ausgeführt wird.const
ist notwendig für typsicheren Polymorphismus. Zeiger (in all ihren Formen, nicht nur rohe Zeiger) sind nur dann kovariant, wenn sie es sindconst
(Anmerkung: nicht dasselbe wie "Zeiger auf const"). Covarianz erfordert eine Nur-Lese-Schnittstelle, und Contravarianz erfordert eine Nur-Schreib-Schnittstelle.Die zweite habe ich zuerst gelernt. Ich begann
const
nur mit dem Ziel von Zeiger- und Referenzparametern, bis ich die Vorteile des Erfassens von Fehlern früher erkannte und anfing, sie bei Einheimischen usw. zu verwenden.Dann habe ich gelernt, dass die meisten
#define
s (in C ++) durch globale Konstanten ersetzt werden können, mit zusätzlichen Vorteilen der Typensicherheit. Also habe ich es dort auch benutzt.Schließlich nahm ich an einem Kurs über Typsysteme und Lambda-Berechnung teil und lernte, dass
const
und Nicht-const
Typen sich grundlegend unterscheiden (da sie unterschiedliche Operationen unterstützen), und seitdem habe ich noch nie darüber nachgedacht, C ++ - Code ohne viel Einsatz von zu schreibenconst
.quelle
Hier sind meine 5 Cent von dem, was ich noch nicht erwähnt habe. Wenn Sie Variablen übergeben, möchten Sie nicht als Wert übergeben, es sei denn, Sie müssen dies wirklich tun, um zusätzliche Konstruktionen, Destruktionen und Kopien zu vermeiden. Wenn Sie also nicht wirklich nach Wert übergeben müssen und Referenzen überall verwenden, bedeutet dies eine erhebliche Leistungssteigerung, auch wenn Sie nicht beabsichtigen, den übergebenen Wert zu ändern. Aus diesem Grund müssen Sie dem Aufrufer mitteilen, was die Funktion nicht ändern wird, wenn Funktionen Verweise auf alle ihre Argumente enthalten.
Es ist das gleiche Prinzip, aber ich wollte nur einen praktischen Grund für die Verwendung von const hinzufügen.
quelle