Dies ist eine große Enttäuschung über die Codebasis, in der ich gerade arbeite. Viele unserer Variablennamen sind kurz und nicht aussagekräftig. Ich bin der einzige Entwickler, der noch am Projekt beteiligt ist, und es gibt keine Dokumentation darüber, was die meisten von ihnen tun. Daher muss ich zusätzliche Zeit aufwenden, um herauszufinden, was sie darstellen.
Ich habe zum Beispiel einen Code gelesen, der die Definition einer optischen Oberfläche aktualisiert. Die am Anfang gesetzten Variablen waren wie folgt:
double dR, dCV, dK, dDin, dDout, dRin, dRout
dR = Convert.ToDouble(_tblAsphere.Rows[0].ItemArray.GetValue(1));
dCV = convert.ToDouble(_tblAsphere.Rows[1].ItemArray.GetValue(1));
... and so on
Vielleicht bin es nur ich, aber es sagte mir im Wesentlichen nichts darüber, was sie darstellten, was das Verständnis des Codes weiter unten schwierig machte. Ich wusste nur, dass es sich um eine Variable handelte, die irgendwo eine bestimmte Zeile aus einer bestimmten Tabelle auswertete. Nach einigem Suchen fand ich heraus, was sie bedeuteten:
dR = radius
dCV = curvature
dK = conic constant
dDin = inner aperture
dDout = outer aperture
dRin = inner radius
dRout = outer radius
Ich habe sie im Wesentlichen in das umbenannt, was ich dort oben habe. Es verlängert einige Zeilen, aber ich denke, das ist ein fairer Handel. Diese Art von Benennungsschema wird jedoch in einem Großteil des Codes verwendet. Ich bin mir nicht sicher, ob es ein Artefakt von Entwicklern ist, die durch die Arbeit mit älteren Systemen gelernt haben, oder ob es einen tieferen Grund dafür gibt. Gibt es einen guten Grund, Variablen so zu benennen, oder bin ich berechtigt, sie auf aussagekräftigere Namen zu aktualisieren, wenn ich auf sie stoße?
quelle
dK = conic constant
.Antworten:
Es scheint, dass diese Variablennamen auf den Abkürzungen basieren, die in einem Physiklehrbuch zu finden sind, in dem verschiedene optische Probleme behandelt werden. Dies ist eine der Situationen, in denen kurze Variablennamen häufig längeren Variablennamen vorgezogen werden. Wenn Sie Physiker haben (oder Leute, die es gewohnt sind, die Gleichungen von Hand zu erarbeiten), die gewohnt sind, gebräuchliche Abkürzungen wie Rin, Rout usw. zu verwenden, ist der Code mit diesen Abkürzungen viel klarer als mit längeren Variablennamen. Es macht es auch viel einfacher, Formeln aus Papieren und Lehrbüchern mit Code zu vergleichen, um sicherzustellen, dass der Code die Berechnungen tatsächlich ordnungsgemäß ausführt.
Jeder, der mit Optik vertraut ist, erkennt sofort etwas wie Rin als inneren Radius (in einem Physikpapier
in
würde das als Index wiedergegeben), Rout als äußeren Radius usw. Obwohl sie mit ziemlicher Sicherheit in der Lage wären, etwas mental zu übersetzen WieinnerRadius
bei der bekannteren Nomenklatur würde dies den Code für diese Person weniger klar machen. Dies würde es schwieriger machen, Fälle zu erkennen, in denen eine vertraute Formel falsch codiert wurde, und es würde schwieriger machen, Gleichungen im Code in und aus den Gleichungen zu übersetzen, die sie in einer Arbeit oder einem Lehrbuch finden würden.Wenn Sie die einzige Person sind, die sich jemals mit diesem Code befasst, müssen Sie niemals zwischen dem Code und einer Standardoptikgleichung übersetzen, und es ist unwahrscheinlich, dass ein Physiker in Zukunft jemals einen Blick auf den Code werfen muss, was möglicherweise der Fall ist Eine Umgestaltung ist sinnvoll, da der Nutzen der Abkürzungen die Kosten nicht mehr überwiegt. Wenn dies jedoch eine Neuentwicklung wäre, wäre es mit ziemlicher Sicherheit sinnvoll, die gleichen Abkürzungen im Code zu verwenden, die Sie in der Literatur finden würden.
quelle
column
in einem militärischen Strategiespiel genannt wird, bedeutet höchstwahrscheinlich etwas anderes als in einer Kartensoftware.Variablen mit kurzer Lebensdauer sollten kurz benannt werden. Zum Beispiel schreibst du nicht
for(int arrayCounter = 0; arrayCounter < 10; arrayCounter++) { ...
. Stattdessen verwenden Siefor(int i ...
.Generell kann man sagen, dass der Name umso kürzer sein sollte, je kürzer der Gültigkeitsbereich der Variablen ist. Schleifenzähler sind oft nur einzelne Buchstaben, sagen wir
i
,j
undk
. Lokale Variablen sind so etwas wiebase
oderfrom
undto
. Globale Variablen sind dann zum Beispiel etwas aufwendigerEntityTablePointer
.Vielleicht wird eine Regel wie diese bei der Codebasis, mit der Sie arbeiten, nicht befolgt. Es ist jedoch ein guter Grund für ein Refactoring!
quelle
i
,j
,k
, ich schreibe so etwas wiepersonPos
denn dann werde ich nicht vergessen , was ich Iterieren und was der Index.arrayCounter
. Erleichtert das Lesen des Codes und erspart Ihnen zumindest das Stapfen des gesamten äußeren Zählers, wenn Sie eine weitere Schleife in diese kopieren / einfügen.arrayCounter
, würde ich benutzenpersonIndex
oderrow
oder was auch immer beschrieben wird, was ich suche.i
. Sobald ich jedoch zu einer verschachtelten Schleife übergehe, lasse ich diei
Nomenklatur fallen. Der Grund dafür ist, dass ich wirklich nachverfolgen möchte, mit welcher Schleifenvariablen gearbeitet wird, und dassi
vsj
in dichtem Code ziemlich irreführend sein kann. Die Lesbarkeit zu verbessern und mehr Leerzeichen hinzuzufügen, ist für mich von Natur aus notwendig.Das Problem mit dem Code sind nicht die Kurznamen, sondern das Fehlen eines Kommentars, der die Abkürzungen erklären oder auf hilfreiche Materialien zu den Formeln verweisen würde, aus denen die Variablen abgeleitet werden.
Der Code setzt lediglich die Vertrautheit mit der Problemdomäne voraus.
Das ist in Ordnung, da eine Vertrautheit mit der Problemdomäne wahrscheinlich erforderlich ist, um den Code zu verstehen und zu pflegen, insbesondere in der Rolle einer Person, die ihn "besitzt".
Aber es wäre schön, wenn der Code einige Hinweise geben würde, die als Sprungbretter dienen könnten. Sogar ein Domain-Experte könnte vergessen, dass dies
dK
eine Kegelkonstante ist. Das Hinzufügen eines kleinen "Spickzettel" in einem Kommentarblock würde nicht schaden.quelle
Für bestimmte Variablen, die im Problembereich bekannt sind - wie hier - sind knappe Variablennamen sinnvoll. Wenn ich an einem Spiel arbeite, möchte ich, dass meine Spieleinheiten Positionsvariablen
x
undy
, nichthorizontalPosition
und habenverticalPosition
. Ebenso Schleifenzähler, die keine Semantik über Indizierung haben, erwarte ich , um zu seheni
,j
,k
.quelle
x
undy
, während gemeinsame, tragen keine implizite wichtige Aspekte wie , wo der Ursprung in.for (x,y) in list_of_coordinates: print x,y
: Der Ursprung spielt keine besondere Rolle, wenn Sie versuchen, den Code zu verstehen.Nach "Clean Code":
Variablennamen sollten:
Ausnahmen sind die sprichwörtlichen
i,j,k,m,n
for-Schleifen.Die Variablennamen, über die Sie sich zu Recht beschweren, haben nichts mit dem oben Gesagten zu tun. Diese Namen sind schlechte Namen.
Da jede Methode kurz sein muss , wird die Verwendung von Präfixen zur Angabe von Gültigkeitsbereich oder Typ nicht mehr verwendet.
Diese Namen sind besser:
Ein Kommentator sagt, dass dies mit langen Variablennamen zu komplex wäre:
Kurze Variablennamen machen es auch nicht einfach:
Die Antwort sind lange Namen und Zwischenergebnisse, bis Sie diese am Ende erhalten:
quelle
fnZR = (r^2/fnR(1+Math.sqrt((1+k)) * (r^2/R^2))) + a[1]*r^2 + a[1]*r^4 + a[1]*r^6 ...;
long_name
dasR
im Lehrbuch bezieht. Verwenden Sie Zwischenergebnisse, aber halten Sie Ihre komplexen Berechnungen so nah wie möglich an der Problemdomäne, damit Sie sie tatsächlich beibehalten können, wenn Sie eine Funktion hinzufügen müssen.Es gibt zwei gute Gründe, Variablen im Legacy-Code nicht umzubenennen.
(1) Wenn Sie kein automatisiertes Refactoring-Tool verwenden, ist die Wahrscheinlichkeit groß, dass Fehler auftreten. Also, "wenn es nicht kaputt ist, repariere es nicht"
(2) Sie werden den Vergleich aktueller Versionen mit früheren Versionen vornehmen, um festzustellen, was sich geändert hat. Dies erschwert die zukünftige Pflege des Codes.
quelle
Der Grund für die Verwendung kleinerer Namen liegt darin, dass der ursprüngliche Programmierer die Arbeit mit ihnen erleichtert. Vermutlich haben sie das Recht, dies festzustellen, und das Recht, nicht die persönlichen Vorlieben zu haben, die Sie haben. Persönlich würde ich finden ...
... wenn ich sie in langen, komplexen Berechnungen verwenden würde. Je kleiner der mathematische Ausdruck, desto einfacher ist es oft, das Ganze auf einmal zu sehen. Wäre dies der Fall, wären sie möglicherweise besser als dIn und dOut, sodass es kein sich wiederholendes D gab, das zu einem leichten Tippfehler führen könnte.
Wenn es Ihnen hingegen schwerer fällt, damit zu arbeiten, können Sie sich selbst aus dem Staub schlagen und dann in ihre längere Form umbenennen. Vor allem, wenn Sie für diesen Code verantwortlich sind.
quelle
d
ist ungarisch? Ich dachte, es sei ein Kalkül wie indx^2/dx = 2x
.dDinnerAperture
alleine sehen würde, würde ich es als "Dinner Aperture" lesen und mich fragen, ob es nur eine lustige Art ist, "deinen Mund" zu sagen. Ich war noch nie ein Fan des Großbuchstabens (gefolgt von Kleinbuchstaben). Manchmal sehr verwirrend.Ich bin der Meinung, dass die Regel dafür sein sollte, dass Sie extrem kurze Variablennamen verwenden können, wenn Sie wissen, dass Leute, die auf dem Gebiet Ihres speziellen Codes "erfahren" sind, die Referenz dieses Variablennamens sofort verstehen. (Sie haben ohnehin immer Kommentare für die Ausnahme dieses Falls), und dass die lokalisierte Verwendung der Variablen anhand des Kontextes ihrer Verwendung leicht erkannt werden kann.
Um dies zu erweitern, bedeutet dies, dass Sie sich nicht die Mühe machen sollten, Ihre Variablennamen zu verschleiern. Sie können jedoch Abkürzungen für Ihre Variablennamen verwenden, wenn Sie wissen, dass nur Personen wahrscheinlich sind, die das zugrunde liegende Konzept Ihres Codes verstehen es trotzdem zu lesen.
Um ein Beispiel aus der Praxis zu verwenden, habe ich kürzlich eine Javascript-Klasse erstellt, die einen gewissen Spielraum einnimmt und Ihnen die Menge an Sonnenlicht angibt, die Sie an einem bestimmten Datum erwarten würden.
Um diese Sonnenuhrklasse zu erstellen , habe ich auf ein halbes Dutzend Ressourcen, den Astronomie-Almanach und Ausschnitte aus anderen Sprachen (PHP, Java, C usw.) Bezug genommen.
In fast allen verwendeten sie ähnliche identische Abkürzungen, die auf den ersten Blick absolut nichts bedeuten.
K
,T
,EPS
,deltaPsi
,eot
,LM
,RA
Wenn Sie jedoch Kenntnisse in Physik haben, können Sie verstehen, was sie waren. Ich würde nicht erwarten, dass jemand anderen diesen Code berührt. Warum also ausführliche Variablennamen verwenden?
julianTime
,nutationOfEclipticalLongitudeExpressedInDegrees
,equationOfTime
,longitudeMean
,rightAscension
.Außerdem ist es häufig nicht sinnvoll, eine ausführliche Version zu verwenden, wenn Variablennamen vergänglich sind, dh wenn sie nur zur vorübergehenden Zuweisung von Werten verwendet werden, insbesondere wenn der Kontext der Variablen nicht eindeutig ist erklärt den Zweck.
quelle
Es gibt absolut; Oft genügt ein kurzer Variablenname.
In meinem Fall mache ich die Wegpunktnavigation in meiner Robotikklasse und wir programmieren unsere Roboter in KISS-C. Wir benötigen Variablen für aktuelle und Zielkoordinaten (x, y), (x, y) Abstände, aktuelle und Zielüberschriften sowie Drehwinkel.
Insbesondere bei x- und y-Koordinaten ist ein langer Variablenname völlig unnötig, und Namen wie xC (aktuelles x), yD (Ziel y) und pD (Ziel phi) sind ausreichend und am einfachsten zu verstehen in diesem Fall.
Sie könnten argumentieren, dass dies keine 'beschreibenden Variablennamen' sind, wie es das Programmiererprotokoll vorschreibt, aber da die Namen auf einem einfachen Code basieren (d = Ziel, c = aktuell), ist ein sehr einfacher Kommentar zu Beginn die ganze Beschreibung Sie benötigen.
quelle
In der Regel werden komplexe Algorithmen in matlab (oder einer ähnlichen Sprache) implementiert. Was ich gesehen habe, sind Leute, die nur den Variablennamen übernehmen. Auf diese Weise ist es einfach, Implementierungen zu vergleichen.
Alle anderen Antworten sind fast richtig. Diese Abkürzungen sind in Mathematik und Physik zu finden, mit der Ausnahme, dass sie nicht mit
d
(wie in Ihrem Beispiel) beginnen. Variablen, die mit d beginnen, werden normalerweise zur Darstellung der Differenzierung benannt .In allen normalen Codierungsanleitungen wird empfohlen, keine Variablen mit dem ersten Buchstaben zu benennen, der den Typ darstellt (wie in Ihrem Fall), da es in allen modernen IDEs so einfach ist, den Code zu durchsuchen.
quelle
Ich kann mir einen Grund vorstellen, warum Variablennamen ziemlich kurz sind.
Die Kurznamen sind leicht zu lesen, wenn der Abstand zwischen den Augen und damit die Aufmerksamkeit verringert wird.
Wenn ich mich zum Beispiel an die Tatsache gewöhnt habe, dass svdb "In der Datenbank speichern" bedeutet, verbessert sich die Scanrate des Quellcodes, da ich nur noch 4 Zeichen schnell scannen muss, anstatt SaveToDatabase (14 Zeichen) zu lesen für komplexere Operationsnamen). Ich sage "Scannen" statt "Lesen", da dies einen großen Teil der Analyse des Quellcodes ausmacht.
Beim Durchsuchen einer großen Menge an Quellcode kann dies zu einer guten Leistungssteigerung führen.
Außerdem hilft es dem faulen Programmierer nur, diese Kurznamen beim Schreiben von Code einzugeben.
Natürlich ist zu erwarten, dass alle diese "Shorthands" an einer Standardposition im Quellcode aufgeführt sind.
quelle
Um das, was @zxcdw gesagt hat, auf eine etwas andere Art und Weise zu fassen und es in Bezug auf die Herangehensweise zu erläutern:
Funktionen sollten rein , kurz und eine perfekte Verkapselung mancher Funktionalitäten: Black - Box - Logik für 40 Jahre , ob es gesessen unberührt, unabhängig davon, wird es weiterhin die Arbeit tun es für entworfen wurde, weil seine Schnittstelle (in und out) ist Ton, auch wenn Sie nichts über seine Interna wissen.
Dies ist die Art von Code, die Sie schreiben möchten: Dies ist Code, der Bestand hat und einfach zu portieren ist.
Verfassen Sie bei Bedarf Funktionen aus anderen (Inline-) Funktionsaufrufen , um den Code feinkörnig zu halten.
Mit einem entsprechend beschreibenden Funktionsnamen (wenn nötig ausführlich!) Minimieren wir jetzt die Wahrscheinlichkeit einer Fehlinterpretation dieser verkürzten Variablennamen, da der Gültigkeitsbereich so klein ist.
quelle
Variablennamen sollten so beschreibend wie möglich sein, um die Lesbarkeit des Programms zu verbessern. Sie haben es selbst erlebt: Sie hatten große Probleme zu identifizieren, was das Programm aufgrund der schlechten Benennung tat.
Es gibt keinen guten Grund, keinen aussagekräftigen Namen zu verwenden. Es wird Ihnen und allen anderen, die an dem Projekt arbeiten, helfen. Eigentlich gibt es eine einzige gültige Verwendung für Kurznamen: Schleifenzähler.
quelle
int dummy_variable_for_for_loops;
so beschreibend wie möglich ist.Sicher ist das, wofür // Kommentare sind?
Wenn die Aufgaben Kommentare enthalten, die beschreibend sind, erhalten Sie das Beste aus beiden Welten: Eine Beschreibung der Variablen und aller Gleichungen ist leicht mit ihrem Lehrbuchgegenstück vergleichbar.
quelle
Bei Interfaces (zB Methodensignaturen, Funktionssignaturen) löse ich dies in der Regel durch Annotieren der Parameterdeklarationen. Für C / C ++ werden sowohl die .h-Datei als auch der Code der Implementierung verziert.
Ich mache dasselbe für Variablendeklarationen, bei denen die Kenntnis der Verwendung der Variablen im Kontext und in der Benennung nicht offensichtlich ist. (Dies gilt auch für Sprachen, die keine gute Schreibweise haben.)
Es gibt viele Dinge, die den Variablennamen nicht verstopfen sollen. Ist der Winkel in Bogenmaß oder Grad, gibt es eine gewisse Toleranz für die Genauigkeit oder den Bereich usw. Die Informationen können wertvolle Aussagen über Eigenschaften liefern, die korrekt behandelt werden müssen.
Ich bin nicht religiös. Ich bin einfach nur an Klarheit interessiert und daran sicherzustellen, dass ich jetzt, was es ist, das nächste Mal, wenn mein vergessliches Ich den Code besucht. Und jeder, der über meine Schulter schaut, hat das, was er wissen muss, um zu sehen, wo etwas nicht stimmt, was wichtig ist (das letzte Kriterium für eine ordnungsgemäße Wartung).
quelle
Erstens: Die Benennung einer Variablen für Energie e bei der Berechnung von Formeln wie E = MC2 ist NICHT zu kurz. Die Verwendung von Symbolen als Argument für Kurznamen ist ungültig
Diese Frage war für mich ziemlich interessant, und ich kann mir nur eine Ausrede vorstellen, und das ist Geld.
Angenommen, Sie verdrahten Javascript für einen Client, der weiß, dass die Datei viele Male pro Sekunde heruntergeladen werden muss . Es wäre billiger und würde die Erfahrung der Benutzer verbessern, wenn die Datei (in Anzahl von Bytes) so klein wie möglich wäre.
(Um das Beispiel „realistisch“ zu halten, durften Sie kein Minifier-Tool verwenden. Warum? Sicherheitsprobleme, keine externen Tools, die die Codebasis berühren dürfen.)
quelle
Ich stelle fest, dass in den anderen Antworten die Verwendung der ungarischen Notation nicht erwähnt wird. Dies ist orthogonal zur Längendebatte, aber relevant für Benennungsschemata im Allgemeinen.
Das "d" am Anfang all dieser Variablen soll anzeigen, dass es sich um Doppelvariablen handelt. aber die Sprache erzwingt dies trotzdem. Trotz der Kürze dieser Namen sind sie zu 50% überflüssig !
Wenn wir eine Namenskonvention verwenden, um Fehler zu reduzieren, ist es besser, Informationen zu codieren, die nicht von der Sprache geprüft werden. Zum Beispiel wird sich
dK + dR
im obigen Code keine Sprache beschweren , obwohl es sinnlos ist, einer Länge eine dimensionslose Zahl hinzuzufügen.Eine gute Möglichkeit, solche Fehler zu vermeiden, besteht darin, stärkere Typen zu verwenden. Wenn wir jedoch Doubles verwenden wollen, könnte ein geeigneteres Benennungsschema sein:
Die Sprache erlaubt uns weiterhin zu schreiben
K + lR
, aber jetzt geben uns die Namen einen Hinweis, dass dies falsch sein könnte.Dies ist der Unterschied zwischen ungarischen Systemen (im Allgemeinen schlecht) und ungarischen Apps (möglicherweise gut).
http://en.wikipedia.org/wiki/Hungarian_notation
quelle
K + lR
wenn Sie Ihre Einheiten ordnungsgemäß deklarieren. Mit SI-Einheiten können Dimensionsprüfungen und Einheitenumrechnungen durchgeführt werden. Das Hinzufügen3_feet + 2_meter
sollte kein Problem sein, während2_meter+1_second
ein Fehler bei der Kompilierung auftreten sollte.Der einzige Fall, in dem unleserlich kurze Variablennamen in der modernen Softwareentwicklung akzeptabel sind, liegt vor, wenn sie in einem Skript vorhanden sind und der Durchsatz dieses Skripts (im Allgemeinen über ein Netzwerk) wichtig ist. Behalten Sie auch dann das Skript mit langen Namen in der Quellcodeverwaltung bei und minimieren Sie das Skript in der Produktion.
quelle
radius
wenn es den inneren Radius nicht versteht, ist das viel mehrdeutiger alsRin
). Und dann muss der Entwickler, der kein Experte ist, zwischen seiner eindeutigen Nomenklatur und der Nomenklatur, die das Unternehmen bei jeder Diskussion über Gleichungen versteht, übersetzen.