Wie benenne ich etwas, wenn die logische Option ein reserviertes Schlüsselwort ist? [geschlossen]

64

Gelegentlich ist der logischste Name für etwas (z. B. eine Variable) ein reserviertes Schlüsselwort in der Sprache oder Umgebung Ihrer Wahl. Wenn es kein gleichwertiges Synonym gibt, wie nennt man es?

Ich stelle mir vor, es gibt Best-Practice-Heuristiken für dieses Problem. Diese können von den Erstellern oder Verwaltern von Programmiersprachen und -umgebungen bereitgestellt werden. Wenn zum Beispiel python.org (oder Guido van Rossum) sagt, wie man damit in Python umgeht, wäre das eine gute Richtlinie in meinem Buch. Ein MSDN-Link zum Umgang in C # wäre ebenfalls gut.
Alternativ sollten auch die Richtlinien wichtiger Einflussnehmer in der Softwareentwicklung von Nutzen sein. Vielleicht hat Google / Alphabet einen netten Styleguide, der uns den Umgang damit lehrt?

Hier ist nur ein Beispiel: In der C # -Sprache ist "default" ein reserviertes Schlüsselwort. Wenn ich eine Aufzählung verwende, möchte ich möglicherweise den Standardwert "default" (analog zu "switch" -Anweisungen) angeben, kann dies jedoch nicht.
(C # unterscheidet zwischen Groß- und Kleinschreibung, und Aufzählungskonstanten sollten
großgeschrieben werden. Daher ist "Standard" die naheliegende Wahl. Nehmen wir jedoch an, dass in unserer aktuellen Stilrichtlinie alle Aufzählungskonstanten in Kleinbuchstaben angegeben sind.) Wir könnten das Wort "defaultus" in Betracht ziehen ", aber dies entspricht nicht dem Grundsatz des geringsten Erstaunens . Wir sollten auch "standard" und "initial" berücksichtigen, aber leider ist "default" das Wort, das genau seinen Zweck in dieser Situation wiedergibt.

Beschützer eins
quelle
15
Ich würde so etwas wie "default_value" verwenden. Die Bedeutung bleibt gleich, Sie müssen jedoch noch einige Zeichen eingeben.
Mael
26
@ Darkhogg Wenn ich eines davon in meinem Code finden würde, würde ich es sofort ändern. Rechtschreibfehler oder Verstöße gegen Namenskonventionen sind nicht zulässig.
MetaFight
26
@MetaFight - mit der Ausnahme, dass in Java das Aufrufen einer Variablen, die eine Klasse enthält, clazzpraktisch ein De-facto-Standard ist. Es im Wesentlichen ist Teil der Plattform Namenskonvention. Alles andere wäre eine Verletzung der Erwartungen, die andere möglicherweise daran haben, Ihren Code zu lesen. Dies sollte nur dann erfolgen, wenn dies unbedingt erforderlich ist.
Periata Breatta
6
Standard als Aufzählungswert scheint kontraproduktiv. Es sollte ein domänenspezifischer Name sein, der den Standard beschreibt. Es sollte jedoch eine Methode geben, um den Standardwert zurückzugeben.
qwerty_so
18
@AndresF. Ich stimme dir nicht zu. Ich finde es oft sehr einfach , gegen die Designer von Java zu argumentieren. Ich halte es aber nicht gegen sie. Sie arbeiteten im wilden Westen.
MetaFight

Antworten:

63

Für eine Aufzählungsoption sollten Sie die Groß- und Kleinschreibung verwenden Default. Da bei C # die Groß- und Kleinschreibung beachtet wird, kollidiert es nicht mit dem reservierten Schlüsselwort. Siehe .net-Benennungsrichtlinien .

Da alle öffentlichen Mitglieder in .net in Groß- und Kleinschreibung geschrieben sein sollten und alle reservierten Namen in Kleinschreibung geschrieben sind, sollte dies nur bei lokalen Variablen (einschließlich Parametern) auftreten. Und Einheimische haben normalerweise Substantive oder Phrasen als Namen, so dass es ziemlich selten vorkommt, dass der natürlichste Name mit einem Schlüsselwort kollidiert. Z.B. defaultValuewäre in der Regel ein natürlicherer Name als default. In der Praxis ist dies also kein großes Problem.

In C # können Sie das @Präfix " " verwenden, um reservierte Schlüsselwörter zu " " entziehen und sie als Bezeichner (wie @default) zu verwenden. Dies sollte jedoch nur verwendet werden, wenn Sie wirklich keine andere Option haben, dh wenn Sie eine Schnittstelle zu einer Drittanbieter-Bibliothek herstellen, die reservierte Schlüsselwörter als Bezeichner verwendet.


Natürlich haben andere Sprachen andere Syntax und Schlüsselwörter und daher unterschiedliche Lösungen für dieses Problem.

SQL hat eine ganze Reihe von Schlüsselwörtern, aber es ist sehr üblich, Bezeichner wie einfach zu maskieren [Table]. Einige tun dies sogar für alle Bezeichner, unabhängig davon, ob sie mit einem Schlüsselwort in Konflikt stehen oder nicht. (Immerhin könnte in Zukunft ein zusammenstoßendes Schlüsselwort eingeführt werden!)

Powershell (und eine Reihe anderer Skriptsprachen) stellt allen Variablen ein Siegel wie $ voran, was bedeutet, dass sie niemals mit Schlüsselwörtern kollidieren.

Lisp hat überhaupt keine Schlüsselwörter, zumindest nicht im herkömmlichen Sinne.

Python hat in PEP-8 eine offiziell anerkannte Konvention :

Verwenden Sie immer cls als erstes Argument für Klassenmethoden.

Wenn der Name eines Funktionsarguments mit einem reservierten Schlüsselwort in Konflikt steht, ist es im Allgemeinen besser, einen einzelnen nachgestellten Unterstrich anzufügen, als eine Abkürzung oder eine Rechtschreibkorruption zu verwenden. Daher ist class_ besser als clss. (Vielleicht ist es besser, solche Konflikte mit einem Synonym zu vermeiden.)

Einige Sprachen wie Brainfuck oder Whitespace vermeiden die Definition von Wörtern und umgehen das Problem auf elegante Weise.

Kurz gesagt, es gibt keine sprachunabhängige Antwort auf Ihre Frage, da diese stark von der Syntax und den Konventionen der jeweiligen Sprache abhängt.

JacquesB
quelle
2
Sie sollten sich jedoch nicht nur auf die Groß- und Kleinschreibung verlassen. Während es in der Praxis wahrscheinlich kein Problem ist, wird bei nicht allen .NET-Sprachen zwischen Groß- und Kleinschreibung unterschieden, sodass Sie möglicherweise irgendwann auf unerwartete Probleme stoßen.
Vivelin
6
@ Vivelin: Sie sollten keine öffentlichen Mitglieder oder Typnamen haben, die sich nur für den Fall unterscheiden, da dies zu Problemen für andere Sprachen führen kann. Dies hat jedoch nichts mit dem zu tun, was ich vorschlage, da Schlüsselwörter keine Bezeichner sind (und andere Sprachen andere Schlüsselwörter haben).
JacquesB
Auch wenn die @ -Syntax verfügbar ist, ist sie am besten für Szenarien reserviert, in denen mit Bibliotheken interagiert werden muss, deren geschriebene Sprachen unterschiedliche Schlüsselwörter haben. Ich denke, dass es auch dort besser gewesen wäre, ein Sprachmerkmal zu haben #define, aber der rechte Operand würde immer als ein Identifikator interpretiert, bei dem die Groß- und Kleinschreibung beachtet wird. Auf diese Weise könnten viele Arten von Namenskonflikten gelöst werden (einschließlich des Imports von Symbolen, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird, mit Ausnahme von Groß- und Kleinschreibung).
Superkatze
@ Vivelin Nicht bei allen .NET-Sprachen wird zwischen Groß- und Kleinschreibung unterschieden. Ich kenne VB.NET und Powershell. gibt es noch andere
Zev Spitz
@ZevSpitz das OP speziell C # genannt, weshalb ich denke, dass Vivelin es als sein Beispiel verwendete, aber wie Sie sagen, VB.NET ist nicht case-sensitive, so wie üblich würde ich denken, dass es auf einer Pro-Sprache-Basis kommen würde . Nicht alle Sprachen haben die gleichen reservierten Wörter
Shaggy13spe
22

Ich würde einen Unterstrich anhängen (default_)

Vorteile:

  • einfach
  • offensichtlich (warum sollten Sie sonst einen Unterstrich anhängen?)
  • konsistent
  • Einfach zu verwenden
  • funktioniert in allen modernen Sprachen, die ich kenne
  • der logischen Option am nächsten

Warum ich andere Lösungen nicht mag:

Synonym:

  • schwer zu finden
  • oft nicht die exakt gleiche Bedeutung (Nuancen)

Wort anhängen / voranstellen:

  • inkonsistent (defaultValue, defaultItem)
  • erhöhte Ausführlichkeit ohne erhöhte Lesbarkeit

Buchstaben ändern (klausel statt klasse):

  • inkonsistent (clazz, klass, klazz)

Nummer anhängen (default1):

  • wirft die Frage nach default2 auf

Brief anhängen / voranstellen:

  • nicht offensichtlich (Programmierer muss erraten, dass es für die Namenskollision verwendet wurde und keine Abkürzung für etwas anderes)

Schlüsselwort maskieren (@default (c #), `default` (scala))

  • nur in einigen Sprachen möglich
  • selten genutzte Funktion, hauptsächlich aus Gründen der Kompatibilität mit anderen Sprachen
  • erschwert die Verwendung für Benutzer Ihrer API (sie müssen wissen, wie es geht, und sich daran erinnern, wie es geht)

Wann würde ich es nicht benutzen:

  • bestehende, weit verbreitete andere Konvention
  • Ich kenne bereits ein passendes Synonym
  • in deinem speziellen enum Fall würde ich @JacquesB antworten
Siphor
quelle
7
Dies ist eine in Python häufig verwendete Lösung. Ich befürworte es nicht als das eleganteste, aber es funktioniert.
Fralau
1
@ fralau Python ist besonders schlecht - ich hasse Kennungen wie "Eingabe"
Christian Sauer
In vielen Sprachen sieht man klassnach einer Variablen, wo classein reserviertes Wort ist. Ich habe noch nie gesehen, defawltaber es ist die gleiche Idee. Ich würde es vorziehen default_(und wahrscheinlich, class_wenn ich damit nicht über etablierte Konventionen trete).
Nigel222
Sie haben die Option zum Ausblenden des Schlüsselworts nicht angegeben.
CodesInChaos
1
Sie machen gültige, vernünftige Argumente, obwohl ich nicht sicher bin, ob es "offensichtlich ist, warum der Unterstrich verwendet wurde". Ich habe selten mit froods gearbeitet, die alle Schlüsselwörter der Sprachen kennen, in denen sie arbeiten!
Beschützer ein
18

"Standard" ist wahrscheinlich kein hilfreicher Aufzählungswert. Es stellt ein Verhalten dar, das sich je nach Kontext, in dem es verwendet wird, ändern kann.

Wenn Ihre Sprache zwischen Groß- und Kleinschreibung unterscheidet, verwenden Sie eine andere Groß- und Kleinschreibung für das Wort. (Standard gegen Standard)

Oder noch besser: Geben Sie ein paar Buchstaben mehr ein und nennen Sie es DefaultValue.

Kent A.
quelle
3
Genau. "Standard" bietet keine Anzeige, wie hoch der Wert ist. Betrachten enum ErrorHandlingLevel { Default = 0, ... }vs enum ErrorHandlingLevel { None = 0, ... }. Im zweiten Beispiel kann die Tatsache, dass dies Noneder Standardwert ist, durch Festlegen des Enum-Werts auf 0 mithilfe von xmldoc oder explizit im Code bekannt gemacht werden. Sie erhalten den zusätzlichen Vorteil, zu wissen, was es bedeutet, wenn ein Objekt ErrorHandlingLeveleingestellt ist None. Vergleichen Sie dies mit dem Untersuchen eines Objekts mit ErrorHandlingLevelder Standardeinstellung.
Harrison Paine
9

Ich würde wärmstens empfehlen, die Namenskonvention NICHT lokal zu ändern (oder bedeutungslose Zeichen hinzuzufügen), um die Mehrdeutigkeit zu verbessern (wie in anderen Posts vorgeschlagen). Es schafft Verwirrung, wenn die Absicht nicht offensichtlich ist, und kann Fragen aufwerfen, warum sie so benannt wurde. Es kann ohne es gelöst werden.

In jedem Fall sollte es möglich sein, entweder ein Wort mit synonymer Bedeutung zu verwenden oder den Namen spezifischer (oder sogar ausführlicher) zu machen. Auch wenn es zu einer Wiederholung des Kontexts kommen kann, ist es möglicherweise eine bessere Lösung.

Nehmen wir beispielsweise an, Sie haben eine Aufzählung Mode, die einen Standardwert wie in Ihrem Fall verfügbar machen soll. Die Benennung default_modescheint aufgrund der Wiederholung nicht die beste zu sein, vermeidet jedoch Mehrdeutigkeiten, während die gewünschte Bedeutung vermittelt wird.

Sopel
quelle
Sie machen einen gültigen Punkt, aber ich bin mir immer noch unsicher, was mehr Verwirrung stiftet: ein konsistent angefügtes Fragment oder die Verwendung unterschiedlicher Wörter für jede Situation. Dies spricht natürlich gegen die frühere Option, dass die Situationen, in denen es überhaupt verwendet werden würde, (hoffentlich) so selten sind, dass aus dem vorhandenen Code keine Konsistenz abgeleitet werden kann.
Beschützer ein
3

Sie müssen andere oder geänderte Wörter verwenden, das ist klar.
Das bedeutet also normalerweise entweder

  • ein ganz anderes wort
  • ein Präfix
  • ein Suffix

Ein weiterer zu bestimmender Faktor ist die Art und Weise, wie die verschiedenen Wörter verbunden werden

  • alleEinwortnoseparatoren
  • wörter_mit_unterstrichenen-oder- strichen ( snake_case )
  • CapitalizationForClarityAndReadability ( CamelCase )

Mein Vorschlag ist, ein Präfix oder Suffix und Unterstriche / Bindestriche zu verwenden, z

local_default, my_default, a_default, domain_specific_default
default_local, default_me, default_a, default_domain_specific

local_defaulthat den Vorteil, dass alle Einheimischen ausgerichtet sind und somit schnell auffallen, aber den Nachteil, dass man immer zum zweiten Teil weiterlesen muss, um den eindeutigen Namen zu erhalten. default_localhat den umgekehrten Vorteil, dass der eindeutige Variablenname schnell erkannt wird, die Einheimischen jedoch nicht immer so einfach visuell gruppiert werden können.

Ein paar Beispiele für den domain_spezifischen Ansatz, den ich gesehen habe, sind: vehicle_modelStatt modeldessen war ein reserviertes Wort; room_tablefür eine SQL-Tabelle wie tableein reserviertes Wort.

Die anderen beiden Optionen, die ich bei der Verwendung von Sprachen oder Skripten gesehen habe, sind:

  • Anführungszeichen oder Backtips, um Variablennamen zu umgeben und damit die Verwendung reservierter Wörter zu ermöglichen. Ähnlich könnte ich mir vorstellen, dass in einigen Sprachen ein Sonderzeichen wie ein Backspace einem Namen entgehen kann.
  • Leerzeichen in Variablennamen.
Michael Durrant
quelle
Als kleine vielleicht interessante Randnotiz: Ich habe words_with_underscores-or-dashesmit zwei Namen bezeichnet gesehen - snake_casebei der Verwendung des Unterstrichs und kebab-casebei der Verwendung des Bindestrichs. Letzteres fand ich lustig.
VLAZ
2

Tun Sie natürlich, was Sie können, um diese Situation zu vermeiden. Ich schreibe seit den späten 1970er Jahren Software und die Zeit, in der ich wirklich, wirklich ein reserviertes Wort fummeln musste, ist weit unter zehn, wahrscheinlich näher an fünf.

Sie können viele Dinge tun, z. B. den ersten oder letzten Buchstaben verdoppeln ( reservedd) oder einen führenden oder nachfolgenden Unterstrich hinzufügen ( reserved_). Was angemessen ist, hängt stark von den verwendeten Konventionen ab, die Sie schreiben, insbesondere im Hinblick auf führende oder nachfolgende Unterstriche. Versuchen Sie auch, Dinge nicht mit Fällen zu tun, die von Menschen falsch verstanden werden könnten (z. B. mit, Reservedwenn sie von denen abweichen reserved).

Sobald Sie etwas ausgewählt haben, fügen Sie es in Ihre Kodierungsrichtlinien ein, und stellen Sie sicher, dass die Leute darüber Bescheid wissen und dass es konsequent verwendet wird. Ich gehe sogar so weit, einen Erinnerungskommentar hinzuzufügen, damit die Leser nicht glauben, dass es sich um einen Tippfehler handelt, und wissen, dass sie ihn wieder sehen werden:

int ccase;  // Name dodges a reserved word
Blrfl
quelle
10
Nicht der Downvoter, sondern der Vorschlag, "den ersten oder letzten Buchstaben zu verdoppeln", ließ mich erschaudern ...
Willem van Rumpt
@WillemvanRumpt Ich mache das auch nicht gerne, aber ab und zu kommt es darauf an, dass man die Wahl zwischen Gymnastik macht, um ein reserviertes Wort zu vermeiden, das viel Kopfkratzen hervorruft, oder einem seltsam aussehenden Bezeichner, der nur ein bisschen dazu auffordert .
Blrfl
6
Kein Urteil beabsichtigt, nur .... Schüttelfrost .... kalte ...;)
Willem van Rumpt
1
Das Nachtragen eines Unterstrichs ist besser als ein doppelter letzter Buchstabe. (Irgendwelche Stimmen für classs?)
Nigel222
1
Codierungsrichtlinien! Das wäre schön zu haben! Guter Punkt.
Beschützer ein
2

In C # können Sie dem Namen eines Bezeichners ein @ voranstellen . Dies weist den Compiler an, den Namen als Namen einer Kennung und nicht als mögliches Schlüsselwort zu behandeln.

enum @default {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; 
Robert Stiffler
quelle
3
frag du , wer würde schon machte diese „Antwort“ , die lediglich wiederholt Punkt stimmen (und viel besser dargestellt) in einem Top-Antwort stimmte einen Tag vor
gnat