Sind Kurzbezeichnungen schlecht? [geschlossen]

26

Sind Kurzbezeichnungen schlecht? Wie korreliert die Länge des Bezeichners mit dem Codeverständnis? Welche anderen Faktoren (neben dem Codeverständnis) könnten bei der Benennung von Bezeichnern eine Rolle spielen?

Nur um zu versuchen , die Qualität der Antworten zu halten, beachten Sie bitte , dass es einige der Forschung zu diesem Thema bereits!

Bearbeiten

Neugierig, dass jeder der Meinung ist, dass die Länge nicht relevant ist oder größere Bezeichner bevorzugt, wenn beide von mir angegebenen Links auf schädliche Bezeichner hinweisen!

Defekter Link

Der Link unten zeigte auf eine Recherche zu diesem Thema, aber es ist jetzt kaputt. Ich habe anscheinend keine Kopie des Papiers bei mir und kann mich nicht erinnern, was es war. Ich lasse es hier für den Fall, dass jemand anderes es herausfindet.

Daniel C. Sobral
quelle
5
Datenpunkt. Meine Lieblingskurzkennung ist :, wie in :(){ :;:& };:- ich würde sagen, die meisten Leute denken, dass es ziemlich schlecht ist. ;)
@fennec: Gabelbomben neigen dazu.
Josh K
Überprüfen Sie diese Frage des Stapelüberlaufs, es gibt einen Kommentar über die Programmierpraxis eines Buches, das jeder Programmierer lesen sollte.
Slu
1
Nur weil längere Namen vermieden werden sollten, heißt das nicht, dass Sie sich extra Mühe geben sollten, sie aus Gründen der Kürze zu kürzen.
JeffO
1
@cessor Komisch, dass etwas, das über Forschung sein sollte, als meinungsbasiert geschlossen wurde. Leider stimme ich angesichts der erhaltenen Antworten zu.
Daniel C. Sobral

Antworten:

67

Die beste "Regel", die ich gehört habe, ist, dass die Namenslängen proportional zur Länge des Bereichs der Variablen sein sollten. Ein Index iist also in Ordnung, wenn der Körper der Schleife ein paar Zeilen lang ist, aber ich verwende gerne etwas Beschreibenderes, wenn er länger als 15 Zeilen wird.

Notiz an mich selbst - denke an einen Namen
quelle
6
Ich habe noch nie davon gehört, und ich glaube nicht, dass dieses Prinzip die Lesbarkeit von Code verbessern würde.
NimChimpsky
8
@Nim: Ich stimme zu. Selbst in einer kurzen forSchleife würde ich den Index nennen customerCounteroder so. Es erfordert nur minimalen zusätzlichen Aufwand und macht Ihren Code so viel besser. Die Verwendung kurzer Variablen für einen kurzen Bereich klingt nach einer Entschuldigung für die Faulheit.
Niemand
2
Hmm, es ist keine Regel oder Richtlinie für mich, sondern eine Möglichkeit, Sie über die Länge nachdenken zu lassen, und in diesem Zusammenhang macht es Sinn. Ich glaube nicht, dass es eine Entschuldigung für Faulheit ist (obwohl ich zustimmen werde, dass manche es als solches akzeptieren). Meine Bezeichner sind meistens lang (Anzeichen dafür, dass man sie pascal von Anfang an beibringt), außer jetzt, wenn ich zu Dingen wie linq-Abfragen und Lambda-Ausdrücken komme, bei denen mir Bezeichner mit 1, 2 oder 3 Zeichen (normalerweise Typinitialen) sinnvoll erscheinen .
Murph
33
+1 Ehrlich gesagt ist ein "beschreibender" Name nur Rauschen in einer fünfzeiligen for-Schleife; Ich denke, die meisten Leute haben ein ziemlich gutes Verständnis dafür, was Sie mit dem "i" machen. Ich habe beschreibende Namen in verschachtelten Schleifen verwendet, aber diese haben einen längeren Gültigkeitsbereich.
Jeremy
18
+1 - Verwenden iund jsind gebräuchliche Namen , mit denen jeder Entwickler IMO verstehen sollte.
TheCloudlessSky
48

Jede Variable sollte eine Bedeutung haben und ihr Name ist Teil dieser Bedeutung. Und ein sehr wichtiger Teil, da er dem Leser hilft, zu verstehen, wofür er da ist, ohne tiefer in den Algorithmus einzusteigen. i, jsind offensichtlich als Indizes zu verwenden, sie sind kurz, aber sehr informativ. bntist hässlich closeoder closeButtonsinnvoll. Kurz oder lang zu sein, ist also nicht das wichtigste Kriterium für den Variablennamen, es sollte aussagekräftig sein. Die Aussagekraft hängt stark vom Kontext ab. Sie können beispielsweise nder lokalen Zeichenfolgenvariablen einen sehr kurzen Namen geben , der in einem kleinen Codeblock mit beispielsweise 10 Zeilen verwendet wird und sich auf den Namen einer Eigenschaft bezieht ( vdenn value ist ein anderes Beispiel).

So Variablennamen sollten informativ sein und es spielt keine Rolle , sie kurz oder lang .

Duros
quelle
2
+1 und nur zu beachten, close und closeButton sind auch nicht gleichbedeutend. Close ist ein Verb und sollte daher der Name einer Funktion oder Methode sein. Dabei ist closeButton ein Substantiv und sollte natürlich der Name der Schaltfläche sein, die die Schließfunktion auslöst.
CaffGeek
close ist ein Adjektiv, zB close = true;)
Armand
13

Ich werde einen Bezeichner verwenden, der die Variable unabhängig von der Länge beschreibt.

Die Fälle von i, j und k sind an sich so allgegenwärtig, dass sie sich selbst beschreiben. Sie wissen automatisch, dass es sich um Schleifenindizes handelt. Das gleiche könnte man auch sagen für:

foreach loop (Strings s : myString)

Allerdings bieten IDEs jetzt Tools zur Code-Vervollständigung, sodass der einzige negative Nebeneffekt von sehr langen und beschreibenden Bezeichnern entfernt wurde.

Gerne füge ich einem Bezeichner ein zusätzliches Wort hinzu, wenn dies erforderlich ist, um den Zweck der Variablen zu erläutern.

NimChimpsky
quelle
3
Übrigens geht die Verwendung von i, j und k für Schleifenindizes mehr als 50 Jahre auf FORTRAN zurück. Variablen, die mit den Buchstaben I bis N beginnen, haben standardmäßig den Typ INTEGER. Variablen, die mit einem anderen Buchstaben beginnen, sind standardmäßig REALs. Dies führte natürlich zur Verwendung von I, J und K für for-Loop-Indizes. (Die FORTRAN-Konvention ist wahrscheinlich auf die Verwendung dieser Variablen zurückzuführen, die zuvor in mathematischen Gleichungen verwendet wurden.)
tcrosley
2
Der zweite Artikel, den ich verlinkt habe, hat gezeigt, dass sehr lange beschreibende Bezeichner die Fähigkeit beeinträchtigen, den Code zu verstehen, was der Bemerkung "nur negative Nebeneffekte" widerspricht.
Daniel C. Sobral
3
Der eigentliche negative Nebeneffekt sehr langer Bezeichner liegt in der Lesbarkeit. Auf einen Blick ist es schwierig zu erkennen, ob zwei sehr lange Bezeichner gleich oder verschieden sind, und es kann schwierig sein, alle Elemente eines Ausdrucks mit sehr langen Bezeichnern herauszusuchen.
David Thornley
tcrosley - Ich würde hinzufügen, dass nur, weil es aus Fortran kommt, kein Grund ist, eine solche Praxis fortzusetzen. Ich rate nachdrücklich von der Verwendung von Iterator- / Schleifenzählern mit den Bezeichnungen "i", "j", "k" usw. ab. Es ist reine intellektuelle Faulheit. Allgegenwärtig <> gut.
quick_now
9

Sie sind nicht so schlecht wie die irreführenden Kennungen. Es macht mir nichts aus, Code zu debuggen, bei dem die Bezeichner nur ein Buchstabe sind, aber in dem Moment, in dem unterschiedliche Namenskonventionen in das Bild kommen, wird es ärgerlich. Wenn Sie z. B. irgendwo sehen strPersonIDund dann woanders s_EmployeeID, ist es verwirrend zu sagen, ob es sich um diese beiden Zeichenfolgen handelt und ob es einen Unterschied gibt. Auch wenn die Variablen kopiert ( pmapIntString = new std::map<int,int>) und völlig falsch sind, mache ich mir Sorgen.

Wenn es um mich geht, füge ich dem Code Kommentare für die verwendeten wichtigen Variablen hinzu und versuche, den in der Entwicklungsrichtlinie angegebenen Standard beizubehalten. Wenn es keinen Standard gibt, versuche ich, die gleiche Namenskonvention im gesamten Code beizubehalten.

Manoj R
quelle
5

Ich habe Probleme...

Ich benutze immer beschreibende Namen als Bezeichner, aber in letzter Zeit habe ich sehr kurze Bezeichner verwendet.

Ich denke, es hängt vom Kontext des Codes ab:

  • Wenn Sie komplexe Funktionen (Algorithmen) schreiben, verwenden Sie IMMER kurze Bezeichner (einzelne Zeichen sind am besten).
  • Verwenden Sie beim Schreiben von Parameterwerten für Funktionen beschreibende Namen.

Ich denke, es hängt auch davon ab, wie dicht der Code ist. Manchmal ist es schwieriger zu lesen, wenn man Namen hat.

Manchmal ohne Namen ist es total kryptisch!

Darknight
quelle
1
Wenn Sie jedoch komplexe Algorithmen schreiben, möchten Sie nicht, dass die Bezeichner für Personen, die Ihren Code zum ersten Mal betrachten, aussagekräftiger sind?
Maxpm
Wann ist eine einzelne Zeichenkennung überhaupt angebracht?
Amir Afghani
1
Früher habe ich das auch gedacht, aber ich habe tatsächlich festgestellt, dass dies nicht der Fall ist, versuchen Sie es selbst. Nehmen Sie einen komplexen Algorithmus und versuchen Sie es mit beschreibenden Namen im Vergleich zu Variablen mit einem Buchstaben.
Darknight
1
Ich bin damit einverstanden, aber nur für längere komplexe Formeln, da diese zu lang werden und Sie sogar dann Funktionen (Funktionsnamen) verwenden könnten, um zu beschreiben, welche Teile dieser Formel sind.
Emile Vrijdags
1
Wenn es so komplex ist und Muster hat, sollten diese Muster in Funktionen aufgeteilt werden
CaffGeek
3

Ich denke, dass sie an sich nicht schlecht sind, aber sie sind nicht informativ, es sei denn, sie sind sehr standardisiert.

Daher sind die Schleifenvariablen i, j und k so üblich, dass es keinen Grund gibt, sie nicht zu verwenden, wenn Sie eine indizierte Schleife erstellen.

Die andere Stelle, an der ich einen sehr kurzen Bezeichner verwende, ist die Deklaration einer temporären Variablen, die in wenigen Zeilen den Gültigkeitsbereich verlässt - beispielsweise die temporäre Variable aus einer foreach-Schleife. Wenn nicht auf irgendwo anders verwiesen wird, kann jeder, der den Code liest, die Deklaration leicht einsehen und nachvollziehen, wofür sie verwendet wird. Wenn es jedoch für mehr als fünf oder sechs Zeilen verwendet wird, werde ich versuchen, ihm einen klareren Namen zu geben.

Darüber hinaus versuche ich, informative Längenkennungen zu verwenden - insbesondere auf Klassenebene möchte ich eine Kennung, die Sie lesen können, um eine Vorstellung davon zu bekommen, wozu die Variable dient. Wenn sie zu lang werden (und ich sehe manchmal Code mit vier oder fünf Wörtern, die als Bezeichner aneinandergereiht sind), neige ich dazu, das als Codegeruch zu betrachten. Wenn ich so viel Text zur Unterscheidung meiner Variablen benötige, sind sie tatsächlich eine Gruppe, könnte besser in einer Hashmap oder Liste gespeichert werden? Könnte ich ein Objekt erstellen, um diese Daten genauer zu modellieren? Manchmal kann man das nicht, aber ein sehr langer Bezeichner ist ein Indikator dafür, dass es sich hier um etwas handelt, das es wert ist, angeschaut zu werden.

Glenatron
quelle
3

Ich stimme den anderen Antworten hier sehr zu, möchte jedoch auf einen weiteren Faktor hinweisen, der meiner Meinung nach häufig übersehen wird. Ein guter Name ist oft ein Name, der für den Code typisch ist. Dies kann auf Sprachebene, Algorithmusebene oder einigen internen Redewendungen für die vorliegende Codebasis erfolgen. Der Punkt ist, dass der Name zwar für jemanden, der die Domäne des Codes nicht kennt, nichts bedeutet, aber dennoch der beste Name im gegebenen Kontext sein kann.

harald
quelle
3

Die Benennung einer Variablen ist immer eine Übung, um Eindeutigkeit und Verständlichkeit in Einklang zu bringen. Die Länge des Namens hängt auf unterschiedliche Weise mit beiden zusammen. Längere Namen lassen sich leichter eindeutig machen. Namen mittlerer Länge sind in der Regel verständlicher als zu kurze oder zu lange Namen.

Eine sehr kurze Variablennamen ist nur sinnvoll , wenn es eine Geschichte hat , die es verständlich macht ( zum Beispiel i, j& kfür Indizes, dxfür einen Abstand entlang einer Achse) oder einem Rahmen, der klein genug für alle Referenzen zu sein auf einmal sichtbar (zB , temp). Die schlimmsten Variablennamen der Welt sind solche t47. ("Was bedeutet das und warum unterscheidet es sich von t46?") Gott sei Dank ging dieser Namensstil meistens mit FORTRAN aus, aber hier wurzelt der Wunsch nach längeren Variablennamen.

Wie Ihre Originalarbeit gezeigt hat, sind auch zu lange Namen schwer zu lesen, da beim Betrachten des Codes subtile interne Unterschiede übersehen werden können. (Der Unterschied zwischen DistanceBetweenXAxisAbscissae& DistanceBetweenYAxisAbscissaeist wirklich schwer zu erkennen.)

Wie NoteToSelf bereits erwähnt hat, hängen die Anforderungen an die Eindeutigkeit eines Namens in erster Linie vom Umfang ab, über den der Name eindeutig sein muss. Der Index einer 5-Zeilen-Schleife kann sein i; Ein Index eines aktiven Datensatzes, der von Funktion zu Funktion weitergegeben wird, sollte einen aussagekräftigeren Namen haben.

Eine Variable lokal zu einer Funktion kann einen kleinen beschreibenden Namen haben, wie deltaXohne Problem. Eine statische Delta-X-Variable in einem Modul muss einen Namen haben, der dieses DeltaX von anderen DeltaX-Variablen im selben Modul unterscheidet, wodurch es länger wird. Und eine globale Delta X-Variable muss für alle Module und alle möglichen anderen Module, die erstellt werden können, eindeutig sein, möglicherweise durch Verketten des Modulnamens mit dem anderen beschreibenden Namen. Dies ist eines der vielen Probleme mit Globals; um sinnvoll eindeutig zu sein, müssen die Namen lang genug sein, um sie schwer lesbar zu machen.

Erik Johnson
quelle
2

Im Gegenteil, ich denke, lange Bezeichner sind schlechter als kurze Bezeichner (es sei denn, Sie haben es mit Konstanten zu tun). Durch TheVariableThatHoldsTheCapacityOfMyContainerClassdie Verwendung von wird Ihr Code wesentlich fehleranfälliger als durch die Verwendung von Capacity.

Maxpm
quelle
1
Sie wären froh zu wissen, dass eine der von mir verknüpften Recherchen Ihre Argumentation stützt, wenn auch nicht aus den gleichen Gründen. ;-)
Daniel C. Sobral
1
Es ist auch sehr einfach, sehr lange Bezeichner falsch zu lesen, möglicherweise zu verwirren oder möglicherweise nicht zu erkennen, dass zwei von ihnen gleich sind.
David Thornley
2
DieVariableThatHoldsTheCapacityOfMyContainerClass ist größer als ich es für "lang" halten würde - zehn Wörter sind zu lang für CamelCase, um zu helfen; Sie benötigen Leerzeichen, um dies lesbar zu machen.
Richard Gadsden
1
Klar, aber das ist ein Strohmann. Ihr Beispiel für einen langen Namen fügt ein Wort, aber keine Informationen hinzu. Stellen Sie sich den Fall vor, dass Sie mehrere Variablen haben, die sich auf verschiedene Kapazitätsformen beziehen. Dann möchten Sie vielleicht wirklich Namen, die die Zwecke unterscheiden, wie initalCapacity oder finalCapacity.
Charles E. Grant
2
@Maxpm, var total = Capacity + Capacity2; Was Capacityenthält und was Capacity2enthält? Wofür werden sie verwendet? Nach Kontext-Hinweisen suchen zu müssen, verschwendet Zeit. Wenn es so geschrieben ist, wie var totalStorageCapacity = truckCapacity + trailerCapacity;ich weiß, wovon wir sprechen.
CaffGeek
2

An und für sich sind Kurzbezeichnungen nicht schlecht. Der Zweck der Auswahl guter Namen (kurz oder lang) dient der Code-Klarheit. Die Auswahl von Kennungen im Dienste der Code-Klarheit ist wichtiger als die Einhaltung einer Mindestlängenanforderung. Im Allgemeinen bedeutet dies, etwas längere aussagekräftige Namen zu schreiben.

dietbuddha
quelle
+1 du hast es sehr sehr gut gesagt, ich konnte meine Worte nicht finden, als ich die Antwort geschrieben habe :-)
ComputerSaysNo
1

Eine Beobachtung, die ich im Laufe der Jahre gemacht habe und die heute weniger ist als vor 10 oder 15 Jahren. Programmierer, die nicht tippen können, sind diejenigen, die sich über die Benennung von Variablen hinwegsetzen. Sie sind diejenigen mit allen 1-3 Buchstaben Variablennamen.

Mein Rat ist also, einen aussagekräftigen Namen zu verwenden, wie viele Kommentatoren gesagt haben, und dann das Tippen zu lernen. Ich habe darüber nachgedacht, Interviews mit einem Tipptest zu versehen, nur um zu sehen, wo sich die Leute befinden, aber ich beginne, viel weniger Nicht-Tipper zu sehen, da Computer ein größerer Teil der Gesellschaft werden.

Bill Leeper
quelle
2
Ich habe tatsächlich keine solche Korrelation gesehen. Wenn es so aussieht, als würden Personen aus OO-Sprachen lange Bezeichner und Personen aus funktionalen Sprachen kurze verwenden. Es stellt die Behauptung in Frage, dass OO bei der Modellierung hilft. :-)
Daniel C. Sobral
Vergessen Sie nicht, dass die Namen nicht nur eingegeben, sondern auch gelesen werden müssen. Die Verwendung zu langer Bezeichner kann die Lesbarkeit erheblich beeinträchtigen. Alles andere als iin einer Schleife zu benutzen, for (int i=0; i<dst.size(); ++i) dst[i] += src[i]sollte gesetzlich verboten sein.
Maaartinus
1

Das erste Papier, auf das Sie verlinken, sieht interessant aus, aber die Schlussfolgerung lautet, dass sie keinen signifikanten Beweis für oder gegen die Hypothese gefunden haben, dass "Erdungshinweise", einschließlich aussagekräftiger Variablennamen, beim Codeverständnis helfen. Der verwendete Blick verweilt als Proxy für das Codeverständnis, was interessant ist, aber kein Slam Dunk.

Ich fürchte, ich fand die zweite Zeitung nur albern. Das erste Problem ist, dass die Beispiele für lange Namen, die sie bereitstellen, unbegründet lang sind und keine zusätzlichen Informationen enthalten. Ich denke, wir sind uns alle einig, dass es dumm ist, einen Variablennamen länger zu machen, nur um ihn länger zu machen. Ihr Beispiel für die Benennung einer Variablen distance_between_abscissae anstelle von dx ist ein Strohmann.

Noch wichtiger ist, dass ihr Experiment eher ein Test für das einfache Auswendiglernen als für das Verstehen ist. Es testet die Fähigkeit von Probanden, fehlende Teile eines Variablennamens einzufügen, wenn diese in einer Liste ohne Kontext dargestellt werden. Ja, längere Namen sind schwerer zu merken, aber wenn ich codiere, merke ich mir keine Variablennamen. Ich benutze sie, um den Kontext bereitzustellen. Ich nehme an, Sie könnten argumentieren, dass die Schwierigkeit, sich lange Variablen zu merken, das Schreiben von Code erschwert, aber Code wird weitaus häufiger gelesen als geschrieben. Welche Aktivität sollte optimiert werden?

Charles E. Grant
quelle
Beachten Sie, dass in der zweiten Veröffentlichung klar steht, dass "die acht Namen, die in den acht Fragen verwendet wurden, aus dem Produktionscode extrahiert wurden". Außerdem prüfen sie nicht nur das Auswendiglernen, sondern auch die Richtigkeit.
Daniel C. Sobral
1

Eine meiner wichtigsten Metriken zur Bestimmung, ob eine Codezeile lesbar ist oder nicht, ist, wie viel anderer Kontext aus anderen Zeilen gelesen werden muss, um wirklich sicherzugehen, dass Sie verstehen, was die Zeile tut.

Es ist leicht zu sagen, dass "jeder verstehen sollte, dass i, j und k Schleifenvariablen sind". Und meistens ist es wirklich offensichtlich. Trotzdem versuche ich demütig und professionell zu bleiben und gehe davon aus, dass es leicht ist, beim Programmieren Fehler zu machen. Wenn ich also ein Array von Grobbles durchlaufe, werde ich die Schleifenvariable grobbleIndex nennen. Ich könnte auch i als Abkürzung für index akzeptieren. Wenn Sie ij und k verwenden, ist es schwerer, Fehler zu erkennen, als wenn Sie den falschen Index mit dem falschen Array verwenden und so weiter. Und es wird noch schlimmer, wenn Sie eine innere Schleife haben.

PS. Zu der Zeit, als ich diese Antwort schrieb, programmierte ich Javascript auf einem 10 "Mini-Laptop mit vertikal geteiltem Bildschirm in vim und nahm mir trotzdem die Zeit, meine Schleifenvariablen rowIndex und columnIndex zu benennen.

Sam
quelle
0

In einigen Anwendungen kann eine kurze Variable die Daten in der Variablen einfach nicht erklären. Kurz oder lang ist irrelevant. Wenn Sie eine längere Variable verwenden, wird Ihr Code nicht langsamer. Sicherlich ist es mühsamer, einen langen Variablennamen einzugeben, aber zumindest die Person, die den Code 6 Monate später liest (was möglicherweise Sie sind), wird in der Lage sein, das Geschehen zu erkennen, ohne Spuren zu hinterlegen, sofern dies überhaupt möglich ist.

rsman
quelle
0

Ich denke, das Ideal ist, dass Namen beschreibend sein sollten, es sei denn ...

Die Idee, dass Namen kürzer sein können (vielleicht sollten) - und damit weniger aussagekräftig -, wenn sie einen begrenzten Geltungsbereich haben, ist nur eine Grund, vom Ideal abzuweichen.

Persönlich verwende ich häufig Kurznamen für eine kleine Anzahl von Entitäten, auf die wiederholt verwiesen wird. Zum Beispiel häufig aufgerufene app-spezifische Unterprogramme.

FumbleFingers
quelle
-2

Ich würde niemals Bezeichnernamen mit weniger als 4-5 Zeichen verwenden, zum Beispiel könnte eine Schleifenvariable Index oder jIndex oder kIndex sein, je nachdem, wie viele innere Schleifen ich für etwas benötige, aber für andere Namen würde ich einen "Schlüssel" verwenden "String LKey" oder "int LKey", "L" für local, wenn es sich um eine Methodenvariable handelt, oder "F" für private Klassenvariablen. Alle anderen Bezeichner wie die anderen, die vor mir erwähnt wurden, sollten den Grund für das Vorhandensein im Namen erläutern "Bezeichner" Bereich ist nutzlos, nicht wahr ?!

Computer sagt Nein
quelle
5
Welche zusätzlichen Informationen vermittelt "index", die "i" nicht vermittelt? Lange Variablennamen, die nichts aussagen, sind schlimmer als einzelne Zeichen.
Anon.
2
Nachdem ich kürzlich einige Sachen geschrieben hatte, die auf einem 3D-Gitter funktionierten, hatte ich viele Variablen mit den Namen x, y und z. Angesichts des Kontexts waren sie perfekt beschreibend.
Loren Pechtel