Früher haben wir ungarische Noten geschrieben. Das ist jetzt passé und ich benutze es größtenteils nicht mehr, aber ich finde immer noch Verwendung für das m_
Präfix, um Mitgliedsfelder anzugeben.
Für mich, wenn ich den Code einer anderen Person durchlese und Folgendes sehe:
count = 3;
Ich count
gehe davon aus, dass dies eine lokale Variable für diese Funktion ist, und mache etwas, das an anderer Stelle in der Funktion verwendet wird. wenn ich das sehe:
m_count = 3;
Mir wird sofort klar, dass ich den Status des Objekts aktualisiere.
Nach den Microsoft-Richtlinien ist dies die falsche Vorgehensweise. Ich soll meine nicht öffentlichen Felder genauso benennen wie temporäre Variablen, die in der Funktion definiert sind. Nein m_
, nicht einmal ein einfacher Unterstrich.
Ja, wir können unseren eigenen Codierungsstil definieren, aber dann muss ich mich mit verschiedenen statischen Codeanalyse-Tools herumschlagen, um sie davon zu überzeugen, dass unsere Vorgehensweise in Ordnung ist.
Ich bin glücklich, zum Microsoft-Stil zu wechseln, aber ich würde gerne wissen, warum die Dinge so sind, wie sie sind.
Warum wird es jetzt als schlecht angesehen, feststellen zu können, ob eine Variable eine lokale Funktion oder ein Member ist?
PS Dies ist sehr ähnlich zu Was ist die angesehenen aktuellen Best Practices in Bezug auf das Schlüsselwort "this" vor Feld und Methoden in c #? , aber ich frage nach m_
nichtthis.
PPS Siehe auch Warum hat Microsoft Parameter, lokale Variablen und private Felder mit der gleichen Namenskonvention versehen?
quelle
this
Schlüsselwort nicht? Könnten Sie nicht auf Mitglieder verweisen, die verwendenthis
, wiethis.count
?count
es nicht nur aus dem Nichts heraus erschien, da es in der Methode nicht deklariert wurde. Ehrlich gesagt ist das Argument "out of IDE" WIRKLICH schwach. Zumal es sogar Code-Review-Tools gibt, die in der IDE funktionieren.Antworten:
Als sie an der API für Windows arbeiteten, empfahl Microsoft die Verwendung der ungarischen Notation mit 'm_' sowie 'i', 'sz' usw. Zu dieser Zeit war dies nützlich, da die IDE nicht robust war genug, um Ihnen diese Informationen zu zeigen.
C # hingegen hat von Anfang an eine sehr robuste IDE.
Daher haben sie in den Microsoft-Namensrichtlinien für C # die folgenden Empfehlungen für öffentliche statische oder geschützte Felder gegeben:
Nachdem Sie mit der Maus darüber fahren oder STRG + K + W drücken und alle Informationen über das Mitglied abrufen können, hat Microsoft festgestellt, dass die Präfixe eine schlechte Form haben. Sie sind eine manuelle Lösung für ein bereits gelöstes Problem.
Private Felder sind ausdrücklich von den Richtlinien ausgenommen. Microsoft scheint jedoch zu dem Schluss gekommen zu sein, dass dies auch für private Felder gilt, die intern weiterentwickelt werden. Dies lässt sich feststellen, wenn Sie Resharper auf .NET 4.5 oder .NET Core verweisen.
Verwenden Sie Ihre Werkzeuge, nicht manuell.
quelle
C # hat keine globalen Variablen, so dass nur lokale Variablen und Klassenfelder übrig bleiben.
Und wenn Sie so viele lokale Variablen haben, dass Sie nicht mehr wissen, ob es sich bei einem Bezeichner um einen handelt, haben Sie mit größter Sicherheit gegen eine der Richtlinien zum Umgang mit Komplexität verstoßen.
Versuchen Sie, ein Parameter-Objekt zu extrahieren, versuchen Sie, Ihre Funktion in mehrere einfachere zu unterteilen. Sie sollten mit Sicherheit Ihren Code umgestalten, es sei denn, Sie möchten in Details und Komplexität ertrinken und haben keine Rücksicht auf die Wartbarkeit.
Nachdem wir festgestellt haben, dass der Zweck von "this-is-a-member" -Dekorationen nicht mehr besteht, da der Funktionsumfang zu klein sein sollte und der globale Geltungsbereich nicht existiert, gibt es einen Nachteil dieser Marker: Sie hemmen Verschieben von Argumenten / lokalen Variablen zu Mitgliedern oder umgekehrt.
quelle
Warum vermeiden Entwickler das Voranstellen von Namespaces mit der using-Namespace-Direktive?
System.DateTime()
ist viel expliziter alsDateTime()
. Es sagt mir genau, womit ich es zu tun habe. Liegt es nur daran, dass wir faule Schreibkräfte sind?Nein, wir sind faule Schreibkräfte, aber das ist nicht der Grund.
Wir bevorzugen Codierungsstile, mit denen wir Details ignorieren und uns auf Abstraktionen konzentrieren können. Das Erzwingen von Namen zur Übermittlung von Strukturdetails lenkt ab. Wenn ich an einem komplizierten Algorithmus arbeite, möchte ich keine Namen, die darauf bestehen, mich an jedes Detail der Sache zu erinnern, mit der ich arbeite. Ich brauche nur den Namen, um mich nicht zu verwirren
Timer
undDateTime
. Ich mache mir Sorgen, ob diese irgendwo anders kompatibel sind.Es ist der gleiche Grund, warum du nicht zwei Jungs in deinem Team namens Jon haben willst. Die Tatsache, dass sie Nachnamen haben, ist kein Grund, ihnen Präfixe oder Suffixe zu geben. Ich werde dich nur Skeet nennen. Alles andere ist ein totaler Schmerz.
quelle
Lassen Sie uns ein bisschen erweitern.
Es gibt drei gängige Präfixstile, die gelegentlich im c # -Code vorkommen:
Solche Präfixe werden üblicherweise bei der privaten Implementierung einer Klasse verwendet . Die Microsoft-Empfehlung bezieht sich hauptsächlich auf die exponierten Teile einer Klasse.
Der Vorteil der Verwendung von
m_
over_
ist, dass das Präfix in Ihrer gesamten Codebasis identisch sein kann, wenn Sie c # sowie Sprachen verwenden, in denen die Verwendung_
als Präfix nicht zulässig ist . * Der Vorteil vonm_
overthis.
ist, dass es kürzer ist und Sie nicht versehentlich vergiss das Präfix.Der Vorteil von
_
overm_
ist, dass es kürzer ist und dass alles, was oben mit dem Präfix beginnt, von einem Tool alphabetisch sortiert wird. Der Vorteil von_
overthis.
ist, dass es kürzer ist und Sie das Präfix nicht versehentlich vergessen.Der Vorteil von
this.
overm_
and_
ist, dass Sie es in einer Codebasis verwenden können, in der es sich um eine akzeptierte und universelle Konvention handelt_
oderm_
nicht. Das bedeutet auch, dass niemand etwas über die_
oderm_
Konvention wissen muss , was als Vereinfachung angesehen werden kann. Als Nachteil, da der Compiler sich nicht um dieses Präfix kümmert, wird dasthis.
Präfix gelegentlich fehlen und als solches nicht so zuverlässig wie ein Indikator sein.* Sobald Sie mit dem Zugriff auf C # -Klassen beginnen, die
_
über C ++ / CLI verwendet werden (was eigentlich eigentlich nicht verwendet werden sollte_
), werden Sie feststellen, dass die Vereinbarung eines gemeinsamen Präfix komplexer ist, als es sein sollte. Die Entscheidung, kein Präfix zu haben, beseitigt dieses Rauschen. Kombinieren Sie dies mit der Antwort von Deduplicator, die ich als "der Vorteil eines Präfixes ist fast vernachlässigbar" umschreibe und die uns ergibt: "Es gibt ein winziges Problem bei der Verwendung von Präfixen und einen winzigen Vorteil, daher ist es eine gültige Wahl, dies einfach nicht zu tun benutze sie".Es gibt eine ältere Frage zum Stackoverflow .
quelle
Es ist zu beachten, dass der MS-Styleguide nur öffentliche und geschützte Methoden und Variablen behandelt. Das heißt, die anderen Entwickler werden sehen, ob sie Ihre Bibliothek benutzen.
Die Idee ist, dass Microsoft-Bibliotheken Entwicklern, die sie nutzen, ein einheitliches Erscheinungsbild geben.
Sie können einen beliebigen Stil für Ihre privaten oder lokalen Variablen verwenden.
Allerdings wird von variablen Präfixen aus verschiedenen Gründen generell abgeraten
quelle
Und Sie werden absolut Recht haben, wenn Sie Quellcode lesen, der die Stilkonventionen von C # respektiert. In einem solchen Code:
Weist einem Feld einen Wert zu.
Weist einer lokalen Variablen einen Wert zu.
Daher sind die Stilkonventionen von C # klar und eindeutig. Sie zwingen Sie, kein Präfix zu verwenden, nur weil Sie keines benötigen.
Bezüglich des Quellcodes, für den die Autoren ihre persönlichen Konventionen verwenden, sollten Sie sie persönlich fragen , warum sie sich dafür entschieden haben. Wenn sie keine Präfixe wie Unterstriche verwenden, obwohl sie keine verwenden
this.
, führt dies effektiv nicht nur zu einer schwierigen Codelesung, sondern auch zu Fällen, in denen eine zusätzliche Konvention erforderlich wäre:Hier liegen Sie jedoch falsch.
Es ist typischer, wenn Sie Ihren Code in Notepad schreiben. Bei einer IDE mit automatischer Vervollständigung oder besser IntelliSense ist der Vergleich zwischen
this.count
undm_count
nicht so offensichtlich. Beachten Sie das Shift+ -, um den Unterstrich einzugeben.Was wiederum "leicht zu vergessen" betrifft, ist dies nur für die Benutzer von Notepad relevant. Nicht nur StyleCop und Resharper lassen Sie das Setzen
this.
bei Bedarf nicht vergessen , sondern nach ein paar Stunden Programmierzeit wird das Setzenthis.
bei Bedarf zur Gewohnheit.quelle
this
nur dann, wenn Sie es brauchen, zu einem wirklich inkonsistenten Gefühl führt und mich viel zu oft ablenkt. Wenn Siethis
anstelle eines Präfixes verwenden, sollten Sie es meines Erachtens immer verwenden. In diesem Fall wird es zu einem Präfix, das Sie genauso gut verwenden können_
.Mein Punkt ist die Erweiterung der Antworten von @CandiedOrange und @Ewan.
Präfixe erschweren das Refactoring
Während sich Ihr Code weiterentwickelt, können Variablen und Methoden ihren Gültigkeitsbereich ändern. Z.B. Sie können eine private Methode erstellen und später feststellen, dass sie auch anderen (neuen) Klassen zur Verfügung stehen sollte. Ähnliches kann bei Methodenparametern und lokalen Variablen vorkommen.
Angenommen, Sie erstellen einen Steuerrechner. Gemäß dem Prinzip des Sichtbarkeitsbereichs von Mietverträgen für Variablen beginnen Sie mit einer Methode, die sowohl den Steuersatz als auch den Basiswert als Parameter verwendet:
(Beispiel sieht möglicherweise Java-isch aus ...)
Als nächstes müssen Sie den umgekehrten Vorgang implementieren und laut TDD tun Sie dies mit dem geringsten Aufwand:
Als nächstes möchte TDD, dass Sie den Code überarbeiten, um ihn übersichtlicher zu gestalten, wodurch die Parameterliste beider Methoden reduziert wird.
(Ja, Sie würden zuerst die doppelte Berechnung extrahieren, aber lassen Sie mich meinen Punkt verstehen ...)
Die naheliegende Lösung besteht darin, den Steuersatz in eine Mitgliedsvariable zu ändern, indem Sie ihn als Konstruktorparameter übergeben.
Wie Sie sehen, mussten wir alle Zeilen unserer vorhandenen Methoden ändern (jede Zeile, die wir früher
p_TaxRateInpercent
genau angegeben haben).Das Problem ist, dass Sie keine Unterstützung von Ihrer IDE haben , um das Umbenennen in der gesamten Klasse durchzuführen. Die einzige Hilfe beim Suchen / Ersetzen, die auch den Konstruktor oder einen Teil ändert, der die Zeichenfolge versehentlich enthält
p_TaxRateInpercent
.Ihre IDE bietet möglicherweise eine Änderung an ... Refactoring für nicht definierte Variablennamen an, dies kann jedoch auf den Umfang der Methode beschränkt sein
Ohne das Präfix hätten sich nur die Methodensignaturen geändert. Es wäre überhaupt keine Umbenennung erforderlich gewesen.
Präfixe überladen den SCM-Verlauf, wenn sie geändert werden
Auch der SCM zeichnet die Änderung des Präfixes als Änderungen in der Logik auf, obwohl sich die Logik nicht geändert hat! Die Geschichte der SCMs ist durch diesen technischen Wandel geprägt, der das Wesentliche verbirgt und das Risiko von Konflikten mit den (realen logischen) Veränderungen anderer erhöht.
quelle
Ich benutze _ Präfix für alle Mitgliedsvariablen. Ich hasse 'dieses' Präfix, weil es, während einige behaupten, die richtige Vorgehensweise ist, Ihrer Codebasis viel Lärm / Unordnung hinzufügt. Ein einzelner Unterstrich ist auch in Microsoft-Beispielen üblich.
In Ihrem Beispiel hätte ich also:
quelle