Verwenden von Unterstrichen in Java-Variablen und Methodennamen [geschlossen]

81

Noch heute sehe ich oft Unterstriche in Java-Variablen und -Methoden. Ein Beispiel sind Mitgliedsvariablen (wie "m_count" oder "_count"). Soweit ich mich erinnere, wird die Verwendung von Unterstrichen in diesen Fällen von Sun als schlechter Stil bezeichnet.

Der einzige Ort, an dem sie verwendet werden sollten, sind Konstanten (wie in "public final static int IS_OKAY = 1;"), da Konstanten nur in Großbuchstaben und nicht in Kamelbuchstaben geschrieben werden sollten. Hier sollte der Unterstrich den Code lesbarer machen.

Denken Sie, dass die Verwendung von Unterstrichen in Java ein schlechter Stil ist? Wenn ja (oder nicht), warum?

Georgi
quelle

Antworten:

146

Wenn Sie jetzt keinen Code verwenden, würde ich vorschlagen, diesen fortzusetzen. Wenn Ihre Codebasis es verwendet, fahren Sie damit fort.

Das Wichtigste am Codierungsstil ist die Konsistenz . Wenn Sie nichts zu beachten haben, sind die Empfehlungen des Sprachanbieters wahrscheinlich ein guter Ausgangspunkt.

Tanktalus
quelle
3
Wir verwenden Codierungskonventionen ohne Unterstriche. Wie auch immer, wenn ich mir Frameworks und älteren Code anschaue, sehe ich oft Unterstriche. Die Frage, dass Konsistenz über Konvention herrscht, ist eindeutig aus Gründen der Konsistenz zu beantworten, aber nicht der Punkt, an den ich beim Stellen der Frage gedacht habe.
Georgi
1
Die fortgesetzte Verwendung des Zeichens '_' wäre eine schlechte Praxis. Diese Arbeitsweise verursacht zusätzliche Wartungskosten und Sie müssten diese außergewöhnlichen Konventionen jedem neuen Entwickler mitteilen, der dem Team beitritt.
Halil
1
Dies ist wie die Benennung von Schnittstellen folgendermaßen: ReadableInterface- absolut redundant. In modernen IDEs müssen Sie weder den Variablentyp noch dessen Bereich angeben - Färbung und schnelles Springen erledigen die ganze Arbeit für Sie. IMO ist dies also ein schlechter Stil, da Sie redundante Zeichen eingeben und die Leute zwingen, ihn zu lesen / zu pflegen.
Kiedysktos
119
sunDoesNotRecommendUnderscoresBecauseJavaVariableAndFunctionNamesTendToBeLongEnoughAsItIs ();

as_others_have_said_consistency_is_the_important_thing_here_so_chose_whatever_you_think_is_more_readable ();
Anders Sandvig
quelle
Die Frage, dass Konsistenz über Konvention herrscht, ist eindeutig aus Gründen der Konsistenz zu beantworten, aber nicht der Punkt, an den ich beim Stellen der Frage gedacht habe. Wie auch immer, es gibt Zeiten, in denen Sie alte Spuren hinterlassen sollten, oder?
Georgi
2
Wenn bereits eine "widersprüchliche" Namenskonvention verwendet wird, hängt dies meiner Meinung nach davon ab, über wie viel Code wir sprechen. Ich würde nicht empfehlen, Tausende von Codezeilen neu zu schreiben, um von old_convention zu newConvention zu wechseln, da die alte Konvention konsistent verwendet wird.
Anders Sandvig
LOL! Wenn Code in Editoren mit Rechtschreibprüfung eingefügt wird, werden die falsch geschriebenen Wörter unterstrichen, wodurch der Unterstrich verdeckt wird. Dies ist ein guter Grund, keine Unterstriche zu verwenden. Auch Kamel Fall ist kürzer. Schließlich ist die Umschalttaste für Buchstaben einfacher zu verwenden als für die obere Reihe (dh Umschaltstrich '-').
Tihamer
@Tihamer Andere würden argumentieren, dass das snake_caseFormular leichter zu lesen ist. Besonders bei kurzen Wörtern (1-2 Buchstaben) würde ich definitiv argumentieren, dass dies der Fall ist. Was "schwer zu tippen" betrifft, ist es auch nicht gerade praktisch, ein Wort mit lotOfMixedCaseWithinIt einzugeben. Ich würde befürworten, dass es darum geht, was Sie gewohnt sind. In Java sage ich jedoch "benutze die gemeinsame Form", wie von JLS / etc. Empfohlen. Verwenden Sie in Ruby / Python / C die Groß- und Kleinschreibung. Und so weiter ...
Per Lundberg
37

Regeln:

  1. Tun Sie, was der Code, den Sie bearbeiten, tut
  2. Wenn # 1 nicht zutrifft, verwenden Sie camelCase, keine Unterstriche
davetron5000
quelle
31

Ich denke nicht, dass die Verwendung von _ oder m_ zur Angabe von Mitgliedsvariablen in Java oder einer anderen Sprache schlecht ist. Meiner Meinung nach verbessert es die Lesbarkeit Ihres Codes, da Sie ein Snippet anzeigen und schnell alle Mitgliedsvariablen von Einheimischen identifizieren können.

Sie können dies auch erreichen, indem Sie Benutzer dazu zwingen, Instanzvariablen mit "this" voranzustellen, aber ich finde das etwas drakonisch. In vielerlei Hinsicht verstößt es gegen DRY, da es sich um eine Instanzvariable handelt. Warum sollte es zweimal qualifiziert werden?

Mein persönlicher Stil ist es, m_ anstelle von _ zu verwenden. Der Grund dafür ist, dass es auch globale und statische Variablen gibt. Der Vorteil von m _ / _ besteht darin, dass ein Variablenbereich unterschieden wird. Sie können _ also nicht für global oder statisch wiederverwenden, sondern ich wähle g_ bzw. s_.

JaredPar
quelle
1
Bei dieser Frage ging es darum, nach Java-Unterstrichen im Allgemeinen zu fragen, nicht nur nach Mitgliedsvariablen (obwohl dies ein Beispiel in der Frage war).
Georgi
10
Sie markieren mich also, weil ich eine Teilmenge der Frage kommentiert habe? Scheint ein bisschen extrem
JaredPar
1
@JaredPar - Sie sind der einzige, der einen guten alternativen Styling-Vorschlag macht. +1 dafür.
Djangofan
Das Schreiben von this.foo (oder this-> foo in C ++) wäre wahrscheinlich eine viel klarere Möglichkeit, Einheimische und Felder / Mitgliedsvariablen zu unterscheiden.
Kevin
7

"Bad Style" ist sehr subjektiv. Wenn eine bestimmte Konvention für Sie und Ihr Team funktioniert, wird dies meiner Meinung nach einen schlechten / guten Stil qualifizieren.

Um Ihre Frage zu beantworten: Ich benutze einen führenden Unterstrich, um private Variablen zu markieren. Ich finde es klar und kann den Code schnell durchsuchen und herausfinden, was los ist.

(Ich benutze "dies" jedoch fast nie, außer um einen Namenskonflikt zu verhindern.)

Christophe Herreman
quelle
Wie Sie sagten, ist Stil sehr subjektiv. Ich neige dazu this, eine Mitgliedsvariable recht großzügig anzugeben, wenn ich denke, dass sie darauf aufmerksam gemacht werden muss. Ich bin jedoch kein Eiferer.
Chris Cudmore
6

Die Verwendung von 'm_' oder '_' vor einer Variablen erleichtert das Erkennen von Elementvariablen in Methoden in einem Objekt.

Als Nebeneffekt bringt die Eingabe von 'm_' oder '_' dazu, dass Intellsense sie zuerst einblendet;)

Nicholas Mancuso
quelle
5
Wenn Sie Java programmieren, haben Sie höchstwahrscheinlich eine IDE, die Ihre Mitgliedsvariablen in einer anderen Farbe färbt. "m_" ist einfach böse.
JeeBee
Ich bevorzuge "sein", da es gut liest:if (itsEmail.equals(email))
davetron5000
7
Ich bevorzuge das. für Mitgliedsnamen. Absolut unverkennbar.
S.Lott
5
  • Ich mag es, führende Unterstriche für (private) Instanzvariablen zu führen, es scheint einfacher zu lesen und zu unterscheiden. Natürlich kann dieses Ding Sie in Schwierigkeiten mit Randfällen bringen (z. B. öffentliche Instanzvariablen (nicht üblich, ich weiß) - so oder so, wie Sie es nennen Sie brechen wohl Ihre Namenskonvention:
  • private int _my_int; public int myInt;? _my_int? )

- So sehr ich den _Style davon mag und denke, dass er lesbar ist, finde ich, dass es wohl mehr Probleme gibt als es wert ist, da es ungewöhnlich ist und wahrscheinlich mit nichts anderem in der von Ihnen verwendeten Codebasis übereinstimmt.

-automatisierte Codegenerierung (z. B. Eclipse generiert Getter, Setter) wird dies wahrscheinlich nicht verstehen, so dass Sie es von Hand reparieren oder mit Eclipse so viel Mist machen müssen, dass es erkannt wird.

Letztendlich gehen Sie gegen die übrigen (Java-) Weltpräferenzen vor und werden wahrscheinlich einige Belästigungen davon haben. Und wie bereits in früheren Postern erwähnt, übertrifft die Konsistenz in der Codebasis alle oben genannten Probleme.

Steve B.
quelle
3
Das Einrichten von Eclipse, um Ihre Präfix- (oder Suffix-) Einstellungen zu verstehen, ist ziemlich einfach. Unter Einstellungen-> Java-> Codestil gibt es eine Tabelle, in der Sie die Variablennamenkonventionen für Felder, statische Felder, statische Endfelder , Parameter und lokale Variablen festlegen können. Alle Codegeneratoren scheinen diese Einstellungen zu berücksichtigen.
Metasim
5

Es gibt einen Grund, warum die Verwendung von Unterstrichen früher als schlechter Stil angesehen wurde. Wenn ein Laufzeit-Compiler unerschwinglich war und Monitore mit einer erstaunlichen Auflösung von 320 x 240 Pixel ausgestattet waren, war es oft nicht einfach, zwischen _nameund zu unterscheiden __name.

Vladimir Miller
quelle
Aus diesem Grund würde OCaml niemals auf alten Maschinen laufen.
David Tonhofer
4

Es ist schön, etwas zu haben, um private von öffentlichen Variablen zu unterscheiden, aber ich mag '_' in der allgemeinen Codierung nicht. Wenn ich in neuem Code helfen kann, vermeide ich deren Verwendung.

Braten
quelle
4

Hier ist ein Link zu den Empfehlungen von Sun für Java. Nicht, dass Sie diese verwenden müssen oder dass ihr Bibliothekscode allen folgt, aber es ist ein guter Anfang, wenn Sie von vorne anfangen. Tools wie Eclipse verfügen über integrierte Formatierer und Bereinigungstools, mit denen Sie diese Konventionen (oder andere von Ihnen definierte) einhalten können.

Für mich sind '_' zu schwer zu tippen :)

Matt
quelle
3

Es ist eine Mischung aus Codierungsstilen. Eine Denkrichtung besteht darin, privaten Mitgliedern einen Unterstrich zu geben, um sie zu unterscheiden.

setBar( int bar)
{
   _bar = bar;
}

anstatt

setBar( int bar)
{
   this.bar = bar;
}

Andere verwenden Unterstriche, um eine temporäre lokale Variable anzugeben, die am Ende des Methodenaufrufs den Gültigkeitsbereich verlässt. (Ich finde das ziemlich nutzlos - eine gute Methode sollte nicht so lange dauern, und die Erklärung ist genau dort! Ich weiß, dass sie außerhalb des Geltungsbereichs liegt.) Bearbeiten: Gott bewahre, dass ein Programmierer dieser Schule und ein Programmierer der memberData-Schule zusammenarbeiten ! Es wäre die Hölle.

Manchmal wird generierter Code Variablen mit _ oder __ vorangestellt. Die Idee ist, dass kein Mensch dies jemals tun würde, also ist es sicher.

Chris Cudmore
quelle
In Ihrem Fall verwende ich Folgendes: setBar (int aBar) {bar = aBar; } Lesbar, ohne dies. oder _bar ...
Georgi
Das ist fair genug, aber dann wird aBar in der Methodensignatur in der API angezeigt, und ich denke, es sieht chaotisch aus.
Chris Cudmore
1
Ich bin tatsächlich auf einen Fall gestoßen, in dem automatisch generierter Code mit einem der Sprachschlüsselwörter übereinstimmte. Der beste Weg, dies zu vermeiden, bestand darin, am Anfang ein _ voranzustellen.
Joe Plante
2

Ich denke, jeder Stil, der (ohne Grund) gegen die eigenen Stilrichtlinien einer Sprache verstößt, ist hässlich und daher "schlecht".

Zweifellos wurde der Code, den Sie gesehen haben, von jemandem geschrieben, der früher an einer Sprache gearbeitet hat, in der Unterstriche akzeptabel waren.

Einige Leute können sich einfach nicht an neue Codierungsstile anpassen ...

Joe Ratzer
quelle
Ich stimme größtenteils der Philosophie "Mach wie andere" beim Codieren zu, aber nicht als Absolutheit. Ich denke, es gibt ein sehr starkes Argument dafür, dass snake_cased_variables bei angemessenen Bezeichnerlängen leichter zu lesen sind als CamelCasedVariables. Meine Rechtfertigung ist, dass die visuelle Reduzierung der kognitiven Belastung eine kleine Sache ist, aber dennoch nützlich. Menschen schätzen Leerzeichen im Code, wenn sie Dokumente lesen und Musik hören. Ich denke, der Fall Kamel ist ein Affront gegen den Leerraum im Namen der „Effizienz“. Effizienz für wen?
David J.
2

Der Grund, warum Leute es tun (meiner Erfahrung nach), ist die Unterscheidung zwischen Mitgliedsvariablen und Funktionsparametern. In Java können Sie eine Klasse wie diese haben:

public class TestClass {
  int var1;

  public void func1(int var1) {
     System.out.println("Which one is it?: " + var1);
  }
}

Wenn Sie die Mitgliedsvariable _var1 oder m_var1 erstellt hätten, hätten Sie keine Mehrdeutigkeit in der Funktion.

Es ist also ein Stil, und ich würde es nicht schlecht nennen.


quelle
In diesem Szenario benenne ich den Parameter normalerweise in "aVar1" um. Im Gegensatz zu "the var1".
Lluis Martinez
1

Persönlich denke ich, dass eine Sprache keine Regeln für den Codierungsstil festlegen sollte . Es ist eine Frage der Vorlieben, der Verwendung, der Bequemlichkeit und des Konzepts der Lesbarkeit.
Nun wird ein Projekt muss festgelegte Regeln Codierung, für Konsistenz über Angebote. Sie sind möglicherweise nicht mit diesen Regeln einverstanden, sollten sich jedoch daran halten, wenn Sie einen Beitrag leisten möchten (oder in einem Team arbeiten möchten).

Zumindest sind IDEs wie Eclispe agnostisch und ermöglichen das Festlegen von Regeln wie variablen Präfixen oder Suffixen, verschiedenen Arten der Platzierung von Klammern und der Speicherverwaltung usw. Sie können sie also verwenden, um Code gemäß Ihren Richtlinien neu zu formatieren .

Hinweis: Ich gehöre zu denen, die ihre alten Gewohnheiten von C / C ++ fernhalten, Java mit m_-Präfixen für Mitgliedsvariablen (und s_ für statische) codieren, Booleschen mit einem Anfangsbuchstaben b voranstellen, einen Anfangsbuchstaben in Großbuchstaben für Funktionsnamen verwenden und geschweifte Klammern ausrichten. .. Der Horror für Java-Fundamentalisten! ;-)
Funnily, welche die Konventionen ist , wo ich arbeite ... wahrscheinlich , weil die Haupt ursprünglichen Entwickler kommt von MFC Welt! :-D

PhiLho
quelle
0

Es ist nur Ihr eigener Stil, nichts ein schlechter Stilcode und nichts ein guter Stilcode, nur unterscheiden Sie unseren Code von den anderen.


quelle