Was machen Sie, wenn Ihre Namenskonvention mit Ihrer Sprache in Konflikt gerät?


14

Okay, das ist eines dieser kleinen Dinge, die mich immer geärgert haben. Ich kürze normalerweise keine Bezeichner ab, und das einzige Mal, dass ich einen kurzen Bezeichner verwende (z. B. i), ist eine enge Schleife. Es irritiert mich also, wenn ich in C ++ arbeite und eine Variable habe, die benannt werden muss, operatoroder classund ich muss sie umgehen oder eine Abkürzung verwenden, weil sie herausragt. Vorsichtsmaßnahme: Dies kann mir unverhältnismäßig oft passieren, weil ich viel im Programmiersprachendesign arbeite, bei dem Domänenobjekte Konzepte in der Hostsprache widerspiegeln und versehentlich Konflikte verursachen können.

Wie würden Sie damit umgehen? Abkürzen? ( op) Tippfehler? ( klass) Noch etwas? ( operator_)


7
Abgesehen vom Namensraum sollten wir vielleicht überlegen, unsere Namenskonventionen zu ändern. Entschuldigung für die offensichtliche.
Chris

1
@ Chris: Man kann niemals einem Programmierer vertrauen, das Offensichtliche zu realisieren! (Allerdings habe ich in diesem Fall.)
Jon Purdy

7
Wenn es einen Grund gibt, die PHP- $varSyntax zu mögen , ist dies der Fall.
Joey Adams

3
@ Joey Adams: Ich lächelte kurz, als ich diese Frage sah und erinnerte mich an all die PHP-bashing-Fragen, die in SE herumschwirrten.
Chris

3
Ändern Sie natürlich den Sprachquellcode, um meine Namenskonventionen zuzulassen. Dies hat auch den Vorteil, dass mein Code "geschützt" wird, da er nur auf meinem Interpreter / Compiler ausgeführt / kompiliert wird.
Dietbuddha

Antworten:


21
  1. Akzeptieren Sie, dass Sie möglicherweise geringfügige Änderungen an Ihrer Namenskonvention vornehmen müssen, z. B. das Hinzufügen von Groß- und Kleinschreibung. Es ist besser, dies so schnell wie möglich zu akzeptieren, damit der gesamte nachfolgende Code konsistent ist.

  2. Erwägen Sie, genauer zu sein. Schlüsselwörter sind in der Regel ziemlich breit sein, so verengen classbis zu demonstrationClassnicht nur rund um die Themen arbeiten , sondern erhöhen auch die Lesbarkeit.


10

Es ist nicht etwas, auf das ich gestoßen bin, aber wenn ich in eine solche Situation gerate, würde ich versuchen, es mit den folgenden Optionen in der richtigen Reihenfolge zu lösen.

  1. Versuchen Sie ein Synonym zu finden.
  2. (besonders für Variablen) versuchen Sie ein Präfix oder Postfix zu finden
  3. (speziell für Klassen) Ändern Sie den ersten Buchstaben in Großbuchstaben und vergessen Sie die Kodierungsregel, dass Namen nicht nur für den Fall abweichen dürfen. Diese Option würde ich wahrscheinlich nur verwenden, wenn der Konflikt mit einem Schlüsselwort besteht.
  4. Verwenden Sie eine Abkürzung.

1
Ich sehe nicht, was falsch ist, wenn sich Namen nur in Groß- und Kleinschreibung unterscheiden, insbesondere in Argumentlisten, in denen der Parameter vom Typ const Foo&keinen anderen vernünftigen vollständigen Namen hat als foo. Zugegeben, es ist möglicherweise besser, Ihrem Namen Fooeinen aussagekräftigeren Namen zu geben, als foowenn er in einem Funktionskörper lebt und einem weniger speziellen Zweck dient.
Jon Purdy

@Jon - Ich stimme zu, obwohl ich persönlich eher zu den Präfixen "p_", "l_" und "m_" tendiere, als dass die Groß- und Kleinschreibung variiert. Ich habe diese Konvention aufgrund des Problems angenommen, dass alle denselben offensichtlichen Namen haben. Welche Konvention Sie verwenden, um damit umzugehen, ist natürlich weitgehend irrelevant, solange Sie sie konsequent in einem bestimmten Kontext verwenden - der Ansatz, bei dem die Groß- und Kleinschreibung variiert, wird mit Sicherheit so häufig verwendet, dass die meisten Entwickler ihn erkennen sollten.
Steve314

@ Jon - dieser Kommentar besagt, dass ich die Konvention nur dann selektiv anwenden würde, wenn ich das Problem mit den gleichen Namen habe, was nicht das ist, was ich gemeint habe. Das Kontextproblem bezieht sich auf Sprache, Projekt usw. Die Konventionen sind so konzipiert, dass das Problem immer dann kein Problem darstellt, wenn es auftritt (oder eher nicht) und nicht bei Bedarf selektiv angewendet wird.
Steve314

@ Steve314: Ich habe deine Bedeutung aus dem ersten Kommentar. Ich weiß nicht, solche Anhänge fühlten sich für meinen Komfort immer etwas zu nahe an Systems Hungarian.
Jon Purdy

@ Jon: Es ist keine Regel, die ich religiös anwende, aber ich finde, dass es einfacher ist, Fehler zu machen, wenn sich zwei Bezeichner nur in Groß- und Kleinschreibung unterscheiden. Einige dieser Fehler werden vom Compiler entdeckt, andere sind viel schwerer zu finden (insbesondere, wenn die beiden Bezeichner dasselbe bezeichnen). Ich bevorzuge eine allgemeine Regel, mit Ausnahmen von Fall zu Fall, als ein vollständiges Regelwerk, das alle möglichen Fälle abdeckt.
Bart van Ingen Schenau

6

Die Sprache gewinnt; Sie können den Compiler nicht überlisten (das Ignorieren von Abscheulichkeiten wie PL / 1 IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF END, aber PL / 1 würde Sie nicht dazu bringen, die Frage an erster Stelle zu stellen). Grundsätzlich müssen Sie die Regeln der Sprache befolgen und eine Alternative zu den Schlüsselwörtern der Sprache für Ihren eigenen Gebrauch finden - oder eine alternative Sprache.

Außer unter sehr ungewöhnlichen Umständen passen Sie sich also an die Sprache an und nicht umgekehrt.


5

Anstatt abzukürzen, wie wäre es mit einer Verlängerung? Wenn Sie ein Klassenkonstrukt in einer Foo-Sprache implementieren, wie wäre es dann mit FooClass und foo_class? (Modulo unabhängig von Ihren Vorlieben Gehäuse).


Würden Sie jedem Bezeichner, den Sie in Java-Code verwenden, das Präfix "java" voranstellen? Und lassen Sie uns nicht einmal die Probleme mit dem Präfix "C ++" auf jedem Bezeichner
erwähnen

@ Steve314, Sie würden das Präfix Java nicht in Java-Code verwenden, Sie würden das Präfix Java in dem C ++ - Code verwenden, der einen Java-Compiler implementiert. Außerdem würden Sie es nur verwenden, wenn der Rest des Bezeichners ein Schlüsselwort wäre.
Winston Ewert

OK - Sie meinen das Verlängern im Allgemeinen, um genau zu sein, worauf sich der Bezeichner bezieht. Für verschiedene Anwendungen kann "class" in "class_taught" oder "class_of_animal" oder "classiness_value" oder was auch immer umbenannt werden. Ich stimme zu - ich fand gerade das compilerorientierte Beispiel verwirrend.
Steve314

5

Einige der Abkürzungen, für die ich je nach classHäufigkeit verwendet habe:

  • cls
  • clss
  • clazz
  • theClass
  • aClass

Wenn ich weiß, für welche Klasse die ClassInstanz steht, kann ich sie in den Variablennamen aufnehmen:

  • stringClass = Class.forName("java.lang.String");

Nie zuvor 'cls' dafür gesehen. Ich benutze meistens aClass.
Konstantin Petrukhnov

4

In C und C ++ werden Schlüsselwörter in Kleinbuchstaben geschrieben, und die Sprache unterscheidet zwischen Groß- und Kleinschreibung. Drücken Sie daher von Zeit zu Zeit die Umschalttaste, und viele Probleme werden behoben.

In Modula 2, sind Schlüsselwörter in Großbuchstaben geschrieben - aber so lange , wie Ihr Identifikatoren haben einige Kleinbuchstaben der Unterschied ist offensichtlich , und kollidiert unmöglich.

Absolute Namenskonventionen müssen zu einem gewissen Grad die normalen Konventionen der von Ihnen verwendeten Sprache widerspiegeln. Daher würde ich auf jeden Fall "myClass" in Java schreiben, wohingegen ich eher "My_Class" in C ++ schreiben würde.

Grundsätzlich schreiben Sie nicht nur für den Compiler, sondern was die Leute als lesbar betrachten, hängt in gewissem Maße vom Kontext und den damit verbundenen Erwartungen ab.


3
Selbst bei Sprachen, bei denen zwischen Groß- und Kleinschreibung unterschieden wird, habe ich das Gefühl, dass sie sich vermischt haben classund Classdie Lesbarkeit des Codes beeinträchtigen würden.
Karmastan

@Karmastan - Das hängt möglicherweise davon ab, wie viel Zeit Sie mit der Arbeit mit Sprachen und Konventionen verbracht haben, bei denen die Groß- und Kleinschreibung beachtet wird. Persönlich ist das "C" in Groß- und Kleinschreibung sehr offensichtlich - ich sehe die Verwendungsmuster von Groß- und Kleinschreibung für lange Bezeichner schneller als ich sie lesen kann.
Steve314

3

Ich stoße nicht oft auf dieses Problem, aber wenn ich es tue, ist es in der Regel kein Problem, da ich Delphi verwende und Sie dieses Problem umgehen können, indem Sie dem Bezeichner ein & voranstellen. "Class" ist also kein gültiger Bezeichner, "& class" jedoch.


Interessant. Ich habe ein Dienstprogramm zur Codegenerierung, mit dem Zeichenfolgenliterale überall dort verwendet werden können, wo ein Bezeichner verwendet werden kann. Ursprünglich wurden die meisten Bezeichner für generierten Code als String-Literale geschrieben, um das Risiko von Keyword-Konflikten mit einer wachsenden (und keyword-reichen) DSL zu vermeiden. Jetzt werden für die meisten Namen Bezeichner verwendet (es ist überraschend, wie viel lesbarer die Quelle auf diese Weise ist), aber String-Literale sind immer als Fallback verfügbar. Ich dachte, es sei gut für die Code-Generierung, aber Problemumgehungen durch Keyword-Überschneidungen wären in einer Allzwecksprache eine schlechte Idee - aber vielleicht irre ich mich.
Steve314

2

Ich würde dem Variablennamen eine Art Namensraum hinzufügen. Angenommen, Sie haben ein Modul mit dem Namen user, dann würde ich den Variablennamenoperator so ändern, dass er etwa user_operator oder userOperator lautet.


2
Verwenden Sie einfach nicht "smooth", "no" oder "my" als Präfix
Steven A. Lowe

2
Absolut. Ich wähle "Jon_Purdys_Carefully_Chosen_Identifier_Prefix_".
Steve314

1
@ Steven: Noch schlimmer ist , sehe ich a, anund theverwendet mit der Frequenz zu stören durch Anfänger CS Studenten.
Jon Purdy

1
@ Jon Purdy, es ist nicht unsere Schuld! Beschuldigen Sie den Professor, der beschlossen hat, die Instanz der Klasse People () zu nennen aPerson.
Ben L

@ Jon: Die Namenskonvention, an der ich arbeite, gibt an, dass lokale Variablen mit aAusnahme von Variablen mit enger Schleife beginnen sollen : /
Matthieu M.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.