Namenskonventionen für Variablen? [geschlossen]

11

Ich habe gerade angefangen, ReSharper (für C #) zu verwenden, und ich mag es, wenn der Code nach Finder riecht. Er zeigt mir einige Dinge über mein Schreiben, die ich vor langer Zeit beheben wollte (hauptsächlich Konventionen für die Benennung von Variablen).

Es hat mich veranlasst, einige meiner Namenskonventionen für Methoden und Instanzvariablen zu überdenken. ReSharper schlägt vor, dass die Instanzvariable ein kleinerer Kamelfall ist und mit einem Unterstrich beginnt. Für eine Weile wollte ich alle meine lokalen Variablen kleiner machen, aber ist der Unterstrich notwendig? Finden Sie es bequem? Ich mag diese Konvention nicht, aber ich habe sie auch noch nicht ausprobiert. Wie ist Ihre Meinung dazu?

Das zweite, was mich zu einer Neubewertung veranlasste, waren meine Namenskonventionen für GUI-Ereignishandler. Normalerweise verwende ich den VS-Standard von ControlName_Action und meine Steuerelemente verwenden normalerweise die ungarische Notation (als Suffix, um im Code zu klären, was für den Benutzer sichtbar ist und was nicht, wenn es sich um ähnlich benannte Variablen handelt), sodass ich am Ende OK_btn_Click ( ), wie ist deine Meinung dazu? Sollte ich der ReSharper-Konvention erliegen oder gibt es andere gleichermaßen gültige Optionen?

Ziv
quelle

Antworten:

19

Sie können ReSharper so ändern, dass das von Ihnen verwendete Namenskonventionsschema verwendet wird. Es ist sehr flexibel, einschließlich der Anpassung von Ereignishandlern, Feldern, Eigenschaften, Methoden mit verschiedenen Eingabehilfen usw.

Lassen Sie das Tool Ihre Standards nicht definieren - verwenden Sie es, um Ihre eigenen durchzusetzen.

Update: Allerdings verwenden wir bei der Arbeit hauptsächlich Kleinbuchstaben für die meisten privaten Dinge - Variablen, Felder und Argumente. Großes Kamel für Methodennamen, Konstanten und Eigenschaften. Ereignishandler werden basierend auf der Aktion benannt, die sie darstellen, und nicht basierend auf dem Steuerelement - z. B. HandleCustomerContinue anstelle von HandleContinueButtonClick. Ich habe das ReSharper-Standardschema eine Weile ausprobiert und es macht mir eigentlich nichts aus, ich bin in keiner Weise aufgeregt.

mjhilton
quelle
Natürlich gefällt mir sehr, wie es mir hilft, meine lokalen Variablen in Schach zu halten, aber ich bin neugierig auf die Standards anderer Leute, insbesondere wenn es um Event-Handler geht.
Ziv
Fair genug, ich habe bearbeitet, um mehr persönliche Erfahrungsdetails zu geben.
Mjhilton
11
+1 für "Lassen Sie das Tool Ihre Standards nicht definieren"
techie007
"Lassen Sie das Tool Ihre Standards nicht definieren" ist zu einem meiner Lieblings-Programmierzitate aller Zeiten geworden.
Seggy
18

In Gedenken an

aber ist der unterstrich notwendig? findest du es bequem

Eine Sache, die ich an der Verwendung des Unterstrichs sehr mag, ist, dass sie die Verwendung von "this" drastisch reduziert.

Erwägen:

public void Invoke(int size) {
    _size = size;
}

ohne den Unterstrich müssten Sie schreiben:

public void Invoke(int size) {
    this.size = size;
}

was möglicherweise den subtilen Fehler einführt von:

public void Invoke(int size) {
    size = size;    // urgh ... no this! 
}

Darüber hinaus ist die Code-Vervollständigung sauberer, da Sie durch einfaches Binden des Unterstrichs nur eine Liste der privaten Felder erhalten, während Sie mit "this" eine Liste von allem erhalten.

In Gedenken an

Verwenden Sie normalerweise die ungarische Notation

In den Framework Design Guidelines: Konventionen, Idome und Muster für wiederverwendbare .NET-Bibliotheken heißt es:

Verwenden Sie KEINE ungarische Notation

Wenig Raum für Mehrdeutigkeiten lassen :)

Dakotah Nord
quelle
Streng genommen heißt es, wenn Sie die Framework Design Guidelines befolgen, dass Variablen, die an öffentliche Methoden übergeben werden, zusätzlich zu den Methodennamen auch in Großbuchstaben angegeben werden sollten :)
Surgical Coder
pzycoman ... kannst du mich bitte darauf hinweisen, wo es heißt. Ein kurzer Blick und ich konnte keinen Hinweis auf die Verwendung von Großbuchstaben in Variablen finden, die an öffentliche Methoden übergeben werden. Auf P 118 der zweiten Ausgabe gibt es beispielsweise ein Beispiel dafür, wo öffentliche Methoden keine Großbuchstaben, sondern Kleinbuchstaben verwenden. "public void Write (uint value);"
Dakotah North
10
Bei Namenskonflikten würde ich sagen, das this.sizeist weitaus klarer als _size. Die Verwendung des unterstrichenen Namens verhindert den subtilen Fehler nicht. Sie können sich dennoch eine Größe zuweisen, obwohl Ihr Compiler dies Ihnen hoffentlich mitteilen wird.
edA-qa mort-ora-y
2
Sicher, Sie können sich immer etwas zuweisen. Der Hauptunterschied zwischen this.sizeund _sizeist die Konsistenz. Mit this.sizeist, dass es optional ist. Wenn zum Beispiel ein anderes privates Feld aufgerufen wurde name, muss es nicht this.nameim Code verwendet werden, ich könnte es genauso einfach nameohne Konflikte verwenden. Weil thismanchmal verwendet werden kann und nicht zu anderen Zeiten, ist die Verwendung thisminderwertig. Auf der anderen Seite gibt es keine Unklarheiten mit _...
Dakotah North
2
Ugh ... warum verwenden die Leute den Unterstrich immer noch in Sprachen, die einen besseren Weg bieten.
Rig
8

Konsistenz ist wirklich der Schlüssel. Das und Klarheit, dh seien Sie nicht kryptisch oder versuchen Sie, das Tippen zu sparen, indem Sie alles abkürzen. Intellisense ist Ihr Tipp-Sparer, keine kryptischen (aber kurzen!) Namen.

Richard
quelle
2
+1: Wähle eine Konvention und halte dich daran. Alles wird funktionieren (außer Systems Hungarian).
Donal Fellows
Konsistenz ist nicht das einzige. Zum Beispiel kann jemand eine konsistente Namenskonvention für seinen eigenen Code auswählen. Wenn sich diese Konvention jedoch stark von anderen Namenskonventionen unterscheidet, treten bei Verwendung anderer Bibliotheken zwangsläufig Inkonsistenzen auf. Wenn ich beispielsweise Eigenschaftsbenennungskonventionen aus C # in Java verwende, stimmt dies nicht mit der Schreibweise von Code in allen anderen Systemen überein. Ich könnte schreiben order.Size()(im Gegensatz zu order.getSize()), aber da andere Bibliotheken Getter und Setter verwenden, ist mein Code nicht konsistent.
Dakotah North
Natürlich sollte hinter den Konventionen, für die sich eine Person entscheidet, ein intelligenter Gedanke stehen, aber Konsistenz ist das Wichtigste.
Richard
@ DakotahNorth - es ist sinnvoll, einen Hausstil zu haben, aber darüber hinaus ist Konsistenz das Hauptkriterium. Solange die Konvention nicht zu weit von der Wand entfernt ist, kann sie leicht von externen / neuen Entwicklern aufgegriffen werden. In der Tat lohnt es sich, den Hausstil zu veröffentlichen, um Unsicherheiten zu beseitigen.
cjmUK
7

In C # ist das Starten eines geschützten oder öffentlichen Namens mit einem Unterstrich gegen die Common Language Specification. Es ist nur bei privaten Mitgliedern richtig.

Von MSDN:

Um unabhängig von der Sprache, in der sie implementiert wurden, vollständig mit anderen Objekten interagieren zu können, müssen Objekte den Anrufern nur die Funktionen zur Verfügung stellen, die allen Sprachen gemeinsam sind, mit denen sie zusammenarbeiten müssen. Aus diesem Grund wurde die Common Language Specification (CLS) definiert, eine Reihe grundlegender Sprachfunktionen, die von vielen Anwendungen benötigt werden.

Siehe: http://msdn.microsoft.com/en-us/library/12a7a7h3.aspx

Hier können Sie die Warnung zum Unterstrich lesen:

Elementnamen, die mit einem Unterstrich (_) beginnen, sind nicht Teil der Common Language Specification (CLS), sodass CLS-kompatibler Code keine Komponente verwenden kann, die solche Namen definiert. Ein Unterstrich an einer anderen Position in einem Elementnamen ist jedoch CLS-kompatibel.

Siehe: http://msdn.microsoft.com/en-us/library/81ed9a62.aspx

Geschützte Mitglieder sind problematisch, da Sie von Klassen erben können, die in einer anderen Sprache geschrieben sind.

Aber vielleicht ist es in Ihrem Fall kein Problem, wenn Sie keinen CLS-kompatiblen Code benötigen.

psur
quelle
4

Ich mag die Unterstriche. Sie wissen auf den ersten Blick, dass die Variable ein Klassenmitglied und privat ist.

Sicher, die IDE kann Ihnen das sagen, wenn Sie mit der Maus darüber fahren, aber der "erste Blick" ist nicht zu übertreffen. Sie wissen, was eine lokale Variable ist und was eine Mitgliedsvariable ist, nur mit Ihren Augen. Kein Scrollen oder Bewegen der Maus erforderlich.

Sie können das Schlüsselwort "this" verwenden, aber _ ist kürzer, um die horizontale Scanbarkeit zu verbessern. Beschreibende Namen sind normalerweise erwünscht, aber wenn etwas eine etablierte Konvention ist, ist es besser, 1 Zeichen zu haben. Verwenden Sie beispielsweise den Buchstaben i als Index, wenn Sie ein Array durchlaufen. Da es eine etablierte Konvention ist, dass i ein Index ist, profitieren Sie von der Scanbarkeit, ohne sich zu fragen, was "i" bedeutet.

mike30
quelle
1

Ich stimme im Allgemeinen dem zu, was von anderen gesagt wird, aber wenn es um Werkzeuge und Werkzeugketten geht, bin ich faul und mag ein einfaches Leben. Ich finde, das Leben ist oft einfacher, es einfach so zu machen, wie sie es vorschlagen. Die Gründe sind

  • Es ist einfacher zu installieren (gehen Sie einfach mit den Standardeinstellungen, sogar ich kann 20 Mal die Eingabetaste drücken und es in Gang bringen)
  • Die Fehler wurden normalerweise aus den Standardeinstellungen herausgearbeitet. Oft ist es die von mir eingerichtete esoterische Konfiguration, die zum ersten Mal einen Fehler aufdeckt
  • Der Hersteller der Werkzeugkette weiß wahrscheinlich mehr darüber als ich, deshalb haben sie es aus einem bestimmten Grund so gemacht. Wer bin ich, um zu entscheiden, dass die Experten falsch sind (ich betrachte sie als Experten, weil ich ihr Werkzeug gekauft habe)
  • Sie müssen niemals die Wahl des Anbieters durch einen Manager verteidigen - "Es ist das, was sie empfehlen"
  • Der neue Typ wird dich nicht mit "warum" und "es ist besser so" nerven - wenn jede Antwort lautet "weil sie entschieden haben ..."

Ich nehme also an, wenn Sie einen gültigen Grund finden, die Tools, für die Sie gerade ein Vermögen ausgegeben haben, neu zu konfigurieren, tun Sie dies auf jeden Fall. Wenn Sie die Änderung nicht rechtfertigen können, tun Sie dies nicht.

Denken Sie daran, dass jede Änderung laufende Kosten (real und versteckt) verursacht. Je weniger es gibt, desto geringer sind die Kosten. Zum Beispiel - dieser neue Typ, den ich erwähnt habe - bedeutet keine Änderung, dass er ihr Handbuch lesen kann. Neu konfigurieren - Sie müssen das Addendum schreiben, es mit anderen Sachen aufbewahren, es zurückziehen und ihn dazu bringen, es zu lesen, nachdem Sie das Handbuch gelesen haben. Vielleicht kein Problem für einen 2-Mann-Laden, aber was ist mit einem 100-Mann-Laden?

mattnz
quelle
1

Die beiden Regeln, nach denen Sie fragen, werden am Anfang der privaten Feldnamen und Methodennamen unterstrichen und in C # -Entwicklungskreisen allgemein als Norm angesehen. Durch die Anpassung an diese Konventionen wird Ihr Code für andere Entwickler sofort verständlicher, da dies die Einstellung ist, in der sie gewohnt sind, zu arbeiten.

Das Suffix von Label, RadioButton usw. für Ihre Steuerelemente wird im Allgemeinen ebenfalls als Norm angesehen. Für ein einzelnes Konzept (z. B. ein Label und eine TextBox) sind häufig mehrere Steuerelemente vorhanden, und dieses Suffix ist sehr nützlich. Die wahre ungarische Notation wurde vor langer Zeit aufgegeben, weil sie in etwas verfälscht wurde, das ihre ursprüngliche Absicht nicht ausdrückt. Dies war der Kontext über die Variable, nicht welcher Typ, welche Größe usw.

Charles Lambert
quelle
1

In meinem Fall hilft die Verwendung von Camelcase und Unterstrichen bei der Beschreibung (read: long) von Variablennamen und der Code-Vervollständigung. Ich bin mir nicht ganz sicher, wie die automatische Vervollständigung von Visual Studio funktioniert, aber in QtCreator und in geringerem Maße in Eclipse kann man beispielsweise tippen

sDI

und habe es erweitert auf

someDescriptiveIdentifier

Spart ein bisschen Tippen, falls Sie Namen wie haben

someDescriptiveName, someOtherDescriptiveName, someOtherButNotTheSameDescriptiveName

was ich im "beschreibenden Namensmodus" tendenziell produziere.

Mithilfe von Unterstrichen kann ich bestimmen, welcher Name automatisch vervollständigt werden soll

someDescriptiveIdentifier

oder

_someDescriptiveClassMember

Hoffe meine Erklärung ist klar genug :)

Manjabes
quelle