Beim Schreiben einiger Funktionen habe ich in Parametern wie diesen ein const-Schlüsselwort gefunden:
void MyClass::myFunction(const MyObject& obj,const string& s1,const string& s2,const string& s3){
}
verursacht in IDE oder vim häufig das Teilen einer Zeile in zwei Zeilen. Daher möchte ich alle const-Schlüsselwörter in den Parametern entfernen:
void MyClass::myFunction(MyObject& obj,string& s1,string& s2,string& s3){
}
ist das ein triftiger grund, const nicht zu verwenden? Ist es wartbar, die Parameterobjekte manuell unverändert zu lassen?
c++
coding-style
const
ggrr
quelle
quelle
const
, haben Sie einen starken Hinweis darauf, dass Sie sich nicht darum kümmern müssen, wie es in der Funktion geändert werden könnte.Antworten:
Die Lesbarkeit ist ein wichtiger Grund, um die Verwendung von Leerzeichen zu erlernen:
Dort werden die Parameter nicht mit dem Funktionsumfang verwechselt. Wenn Sie sie in einer anderen Zeile suchen, müssen Sie sie nicht neu positionieren, wenn Sie den Namen
myFunction
in einen aussagekräftigeren Namen ändern . Die Position der Parameter nicht zu ändern, wenn sie nicht geändert wurden, ist etwas, das Benutzer von Versionsverwaltungs-Diff-Tools zu schätzen wissen.const
bedeutet etwas. Wirf es nicht raus, nur weil dir der Raum und die Ideen ausgehen. Lesbarkeit ist das A und O, aber Dinge in ihrem Namen zu brechen, gibt einfach auf.quelle
(
, und wenn dies der Fall ist, müssen Sie sie möglicherweise neu positionieren sie, wenn sich die Länge des Klasse + Funktionsnamens um mehr als ungefähr 4 Zeichen ändert. Wenn Sie dies nicht tun müssen, fügen Sie eine feste Anzahl von Einrückungsstufen hinzu, nicht eine Zahl, die von der Länge des Funktionsnamens abhängt. Ich würde 1 Stufe empfehlen, diese Antwort verwendet 6, aber jede feste Zahl erreicht das angegebene Ziel :-)Tatsächlich geht das Problem der Lesbarkeit definitiv in die andere Richtung. Erstens können Sie Ihre Run-On-Linie mithilfe von Leerzeichen trivial lösen . Durch das Entfernen
const
wird die Zeile jedoch nicht nur kürzer, sondern die Bedeutung des Programms wird vollständig geändert.Herb Sutter bezeichnet den
const
in Bezug aufconst
als den wichtigsten,const
weil ein Verweisconst
auf eine vorübergehende binden und seine Lebensdauer verlängern kann. Für einen Wertverweis auf non-const
cannot benötigen Sie eine separate Variable.Für die Benutzerfreundlichkeit bedeutet dies, dass Sie alle diese temporären Variablen einführen müssen, um Ihre Funktion aufrufen zu können. Das ist für die Lesbarkeit nicht besonders gut, da diese Variablen bedeutungslos sind und nur existieren, weil Ihre Signatur falsch ist.
quelle
const
es sich umconst
einen anderen handeltconst
und wasconst
in der Tat der wichtigste istconst
const&
anstatt dort alsconst
Nomen (-phrase) zuEinfache Antwort ist "nein".
Die lange Antwort lautet, dass das
const
Schlüsselwort Teil des Vertrags ist, den die Funktion anbietet. es sagt Ihnen, dass das Argument nicht geändert wird. In dem Moment, in dem Sie dieconst
Garantie entfernen , erlischt das Fenster. Denken Sie daran , dass Sie die Konstantheit vernünftigerweise nicht halten können (oder jede andere Eigenschaft) von etwas mit Dokumentation, Konventionen oder Richtlinien - wenn die Konstantheit nicht durch den Compiler erzwungen wird, jemand wird denken , dass sie ihre Arbeit erleichtern können , wenn sie Geige mit der Parameter "nur ein bisschen". Erwägen:Abgesehen von der Tatsache, dass die letztere Version prägnanter ist, bietet sie auch einen stärkeren Vertrag und lässt den Compiler Ihnen helfen, Ihre Absichten aufrechtzuerhalten. Ersteres hindert die
fna(Foo&)
Funktion nicht daran, den übergebenen Parameter zu ändern.Wie in @CandiedOrange answer können Sie den Code mit Leerzeichen auslegen und die Lesbarkeit verbessern.
quelle
Durch das Entfernen des
const
Schlüsselworts wird die Lesbarkeit beeinträchtigt, daconst
Informationen an den Reader und den Compiler übermittelt werden.Die horizontale Länge des Codes zu reduzieren ist gut (niemand mag es, seitwärts zu scrollen), aber es gibt mehr
const
als nur Text. Sie könnten es umschreiben:Das ändert den Vertrag nicht, erfüllt aber die Notwendigkeit, die Leitungslänge zu reduzieren. Wahrlich, ich würde das obige Snippet als weniger lesbar betrachten und mich dafür entscheiden, mehr Leerzeichen zu verwenden, wie bereits in CandiedOranges Antwort erwähnt.
const
ist eine Funktionalität des Codes selbst. Sie würden die Funktion nicht als Nichtmitglied festlegen, um denMyClass::
Abschnitt der Deklaration zu entfernen. Entfernen Sie also nicht dieconst
quelle
MObj
und wasstr
es ist, und zieht mit Sicherheit die Augenbrauen hoch. Es ist besonders seltsam für Arten , deren Namen Sie bereits Kontrolle über: ZB Warum haben Sie nicht nur NamenMyObject
wieMObj
zu beginnen?Nein. Das Weglassen
const
kann die Funktionalität ändern, den Schutz verlierenconst
und möglicherweise weniger effizienten Code erstellen.Anstatt Zeit damit zu verbringen, Code manuell zu formatieren
Verwenden Sie automatische Formatierungswerkzeuge . Schreiben Sie die Funktion gemäß den funktionalen Anforderungen und lassen Sie die Präsentation automatisch formatieren. Das manuelle Anpassen der Formatierung ist nicht so effizient wie das Verwenden der automatischen Formatierung und das Verwenden der gespeicherten Zeit, um andere Aspekte des Codes zu verbessern.
quelle
So lange wie möglich ist es besser, const sichtbar zu halten. Es verbessert die Codewartung erheblich (es ist kein Rätselraten, ob diese Methode meine Argumente ändert).
Wenn eine Methode viele Argumente enthält, muss ich über die Erstellung eines projektbasierten Jarons (Matrix, Employee, Rectangle, Account) nachdenken, der viel kürzer und verständlicher ist (wodurch eine lange Liste von Argumenten für Methoden entfällt).
quelle
typedef Point * LPPOINT
undtypedef const Point * LPCPOINT
, während Super widerwärtig, trägt immer noch eine implizite Bedeutung, weil es mit sofortigen Erwartungen konsistent ist im Zusammenhang. Aber niemals im allgemeinen Fall; Es ist nur eine seltsame Ausnahme, die ich mir vorstellen kann.