Absichtliche Rechtschreibfehler, um reservierte Wörter zu vermeiden

45

Ich sehe oft Code, der absichtliche Rechtschreibfehler gebräuchlicher Wörter enthält, die zu guten oder schlechten Wörtern geworden sind:

  • klassoder clazzfür den Unterricht :Class clazz = ThisClass.class
  • kountfür die Zählung in SQL:count(*) AS kount

Persönlich finde ich, dass dies die Lesbarkeit verringert. In meiner eigenen Praxis habe ich nicht allzu viele Fälle gefunden, in denen ein besserer Name nicht hätte verwendet werden können - itemClassoder recordTotal.

Ein Beispiel aus den JavaDocs for Class zeigt dies in den Parametern:

 public <U> Class<? extends U> asSubclass(Class<U> clazz)

Zeigt dies einen vernünftigen Anwendungsfall?

Nicole
quelle
9
Für den Datensatz: In Python clsist dies ein gebräuchlicher (in der Tat der eine idiomatische) Name für Variablen / Argumente, die tatsächliche Klassen enthalten (die, die Sie mit dem classSchlüsselwort deklarieren und für die alles eine Instanz ist).
14
Magst du nicht typedef char ínt?
Jeff
14
@muntoo Du hast recht. Ich bekomme auch Compilerfehler für iñt. Da ist mein Plan für die Weltherrschaft.
Jeff
1
Ich habe diese Regel gebrochen ... und jetzt schäme ich mich.
JMQ
3
Tu es nicht. Ich kann ehrlich sagen, dass ich das noch nie gesehen habe, und wenn ich das getan hätte, würde ich es sofort umbenennen. Abkürzen nur , wenn Sie haben ein nicht-beschreibenden Variablennamen verwenden ( Class c).
Cody Grey

Antworten:

63

IMHO, das ist eine sehr schlechte Idee. Reservierte Wörter sind aus einem bestimmten Grund reserviert. Dadurch wird die Lesbarkeit beeinträchtigt.

Auch Ihrem zweiten Punkt stimme ich voll und ganz zu. Eine Variable zu classbenennen, selbst wenn Sie es könnten, wäre genauso schlecht wie sie tmpoder zu benennen a. Was für eine Klasse? Eine Klasse von was? Namen sollten beschreibend sein.

Dima
quelle
15
"Reservierte Wörter sind aus einem bestimmten Grund reserviert". (Was ironischerweise reserviert ist.)
Fang am
16
+1 weil du recht hast. Aber wenn Sie Unterrichtsplanungssoftware oder
ähnliches geschrieben
8
Meh. " Reservierte Wörter sind aus einem bestimmten Grund reserviert ", was bedeutet, dass Sprachdesigner faul sind. Es gibt einige hoch entwickelte Sprachen, in denen Wörter nur an den spezifischen Stellen reserviert sind, an denen sie verwendet werden. Aber Ritchie begann diesen Trend, als er einen kompakten Compiler für C brauchte, und die meisten Sprachdesigner haben ihn von dort gelernt.
Ross Patterson
14
Nein, Ross, es liegt daran, dass Programmierer (und Leser im Allgemeinen) erwarten, dass die Dinge eine einigermaßen eindeutige Bedeutung haben (weshalb das Erlernen von Fremdsprachen oft so schwierig ist, all die Dinge mit doppelter Bedeutung oder einer anderen Bedeutung als die Sprache, in der Sie aufgewachsen sind) in der Kindheit, in der Sie diese Unklarheiten nie bemerken, weil sie Teil Ihres kulturellen Erbes sind).
7.
3
@AlexanderMorou Nein, und keiner von beiden hat die meisten Sprachdesigner, sie fangen einfach mit dem Design eines anderen an. Aber schauen Sie sich Algol, Fortran, PL / I, Rexx und andere Sprachen an, die nicht auf C basieren, und Sie werden sehen, dass Grammatiken ohne reservierte Wörter sicherlich möglich sind, nur schwieriger. Ritchie hatte einen guten Grund: Die Unix-Leute hielten jeden Tastendruck für wichtig, und auf einem PDP-11 war jeder CPU-Zyklus von Bedeutung. Heute? Nicht so viel.
Ross Patterson
21

Pythons Style Guide weist auf dieses Problem hin und schlägt Folgendes vor:

Wenn Ihr öffentlicher Attributname mit einem reservierten Schlüsselwort kollidiert, fügen Sie einen einzelnen nachgestellten Unterstrich an Ihren Attributnamen an. Dies ist einer Abkürzung oder fehlerhaften Schreibweise vorzuziehen.

Dies scheint eine ziemlich gute allgemeine Regel zu sein, vorausgesetzt, sie widerspricht nicht der Semantik einer bestimmten Sprache.

Ryan
quelle
7
Ich halte das für einen wirklich schlechten Rat von einem Styleguide. Wenn Ihr Attributname so nahe an einem Schlüsselwort liegt, sollten Sie einen besseren Namen finden. Das einfache Anbringen eines Unterstrichs am Ende fügt keine Bedeutung hinzu und macht es wahrscheinlich, dass der nächste Typ, der den Code liest, verwirrt wird.
Wayne Johnston
18
@ Wayne: Wie werden Sie die Union-Operation in einer Union-Find-Struktur benennen, wenn uniones sich um ein Schlüsselwort handelt (wie in C)? Wirst du es nennen, foonur weil es nicht so aussehen sollte union?
Fred Foo
OTOH clsist der Standardargumentname für die Klassenmethode. Auch zum Beispiel in Django haben Objekte .idAttribute, die natürlich mit der ideingebauten Funktion in Konflikt stehen .
Vartec
1
@GoloRoden Ich habe noch nie jemanden sagen hören, dass er beim Berechnen der Gewerkschaft zwei Sets "vereint". Es gehört einfach nicht zum Jargon. "Zusammenführen" wäre besser, aber für eine mergeMethode wäre noch eine Dokumentation erforderlich, in der ausdrücklich angegeben wird, dass sie die Gewerkschaft implementiert und aus rein technischen Gründen umbenannt wurde.
Fred Foo
2
@GoloRoden Laut Merriam-Webster ist es kein Verb, aber siehe diese Antwort .
Maaartinus
18

Code-Geruch.

string stringVariable = "";

Der obige Code sagt mir nichts über die beabsichtigte Verwendung der Variablen.

class Klass

Gleiches Problem

string UserNameString = "bmackey"

Für den obigen Code sollte keine an den Variablennamen angehängte Schlüsselwortzeichenfolge erforderlich sein. Wenn Sie Typen anhand des Variablennamens identifizieren müssen, ist Ihr Code zu lang. Kondens-Refaktor.

P. Brian Mackey
quelle
Es sagt Ihnen nichts, weil es kein "Code" ist, sondern eine isolierte Variablendeklaration. Eine "Klasse" oder "klass" kann Ihnen alles sagen, was Sie wissen müssen. Beispielsweise kann eine generische Methode einen Class<T>Parameter erhalten, und dies kann sinnvoll sein. Ich bin nicht einverstanden, dass es ein Codegeruch ist.
Andres F.
5

Persönlich denke ich, dass es eine vollkommen gültige Option für Ihren Codestil ist.

Es handelt sich um reservierte Wörter, damit der Compiler nicht entscheiden muss, ob Sie den Sprachmechaniker oder Ihre Variable gemeint haben. In diesem Sinne impliziert dies, dass erwartet wird , dass Menschen eine Variable wie ein reserviertes Wort benötigen.

In der mit JDK 1.6 R21 gebündelten Quelle finde ich 917 Vorkommen von "clazz". Anscheinend hielten sie es für einen akzeptablen Stil.

Wie fühlt sich Ihr Team dabei? Wenn du denkst, dass es schlecht ist, aber die anderen 9 Jungs in deinem Team denken, dass es gut ist, dann musst du die Kugel beißen und akzeptieren. Solange es Kommunikation darüber gibt, was in Ordnung ist und was nicht, und Sie Probleme ansprechen, die Sie sehen, wenn Sie sie sehen, sollte es in Ordnung sein.

Wie Ihr Team den Code-Stil bewertet, ist wichtiger als meine Meinung oder die Meinung anderer in diesem Beitrag . Dies gilt auch für alle anderen Entscheidungen zum Codestil.

corsiKa
quelle
1
Richtig, aber irgendwann wird sich Ihr Team ändern. Viele Jahre später wird es einen armen Kerl geben, der Ihren Code voller Klassifizierungen und Klauseln betrachtet und "WTF!" Sagt.
MrFox
4
Wenn Sie beide verwenden klassund clazzdas ist eine schlechte Sache. Sie müssen konsequent sein, damit sie es nur einmal lernen müssen. Und im Idealfall ist dies auch in den Richtlinien für den Teamstil festgelegt, so dass es keine große Überraschung ist.
CorsiKa
Code wurde nicht nur für die Mitarbeiter Ihres Teams geschrieben, sondern auch für den Rest der Welt. Wenn Ihr Team alle in einem Bus sitzt, der über eine Klippe fährt, beginnt jemand anderes, den Code zu lesen. Verwenden Sie Namen, die vollständig und präzise beschreiben, was die Variable ist, nicht wie sie dargestellt wird.
Rob K
1
Nein, einfach nein. Es ist weitaus wahrscheinlicher, dass Ihr Team die Mitglieder im Laufe der Zeit langsam wechselt. Sie können planen, dass eine Person von einem Bus angefahren wird, aber Sie können nicht planen, dass Ihr gesamtes Team von einem Bus angefahren wird. Der meiste Code wurde für etwa ein Dutzend Personen geschrieben, die ihn jemals lesen mussten, die Hälfte davon während der Codeüberprüfung.
corsiKa
4

Vorsätzliche Rechtschreibfehler, um reservierte Wörter zu vermeiden, sind keine gute Idee.

  • Rechtschreibfehler sind schwer von der korrekten Schreibweise zu unterscheiden und erschweren daher die Lesbarkeit des Codes.

  • Rechtschreibfehler sind schwer zu merken, so dass mehrere inkonsistente Rechtschreibfehler wahrscheinlich im Code konkurrieren, was das Schreiben und Lesen von Code erschwert.

  • Reservierte Wörter beziehen sich auf die Sprache, die zur Lösung des Problems verwendet wird, nicht auf das Problem selbst. Ein Variablenname sollte auf ein Konzept verweisen, das mit dem Problem zusammenhängt.

Es ist daher besser, einen alternativen, beschreibenden Namen zu wählen oder das reservierte Wort wie folgt zu qualifizieren , wenn es keine zufriedenstellende Alternative gibt :

public static Method findBenchmarkMethod(BenchmarkRecord benchmark) {
    Class<?> benchmarkedClass = ClassUtils.loadClass(benchmark.generatedClass());
    return findBenchmarkMethod(benchmarkedClass, benchmark.generatedMethod());
}
user40989
quelle
3

Class clazzriecht nach "Ich habe nicht versucht, einen guten Namen zu finden". Eine Variable repräsentiert immer etwas, und ein guter Name beschreibt das. Ich lehne es ab, mir vorzustellen, dass clazzzum Beispiel unter keinen Umständen der bestmögliche Name ist. Handelt es sich um eine Referenz auf eine Klasse -> Klassenreferenz, handelt es sich um eine Kopie eines Klassenobjekts -> class_copy usw. Eventuell wird auch "class" verworfen und nur das beschreibende Wort verwendet, z

java.lang.SecurityManager.checkMemberAccess(Class<?> clazz, int which)
Parameters
    clazz -- the class that reflection is to be performed on.

Hier ist clazz die Zielklasse, für die die Prüfung durchgeführt werden soll

checkMemberAccess(Class<?> target, int which)

würde viel besser beschreiben, wofür der Parameter verwendet wird, als es clazz jemals tun wird.

hlovdal
quelle
IMHO ist es nicht besser, man könnte es "classToBeAccessed" oder was auch immer nennen, aber jeder aussagekräftigere Name zeigt nur das Offensichtliche. Ich mag lange Namen nur, wenn sie nützliche Informationen liefern.
Maaartinus
1
classToBeAccessedist in der Tat ein guter Name ( classToBeCheckedwäre vielleicht noch besser).
hlovdal
1

Wenn sie einen reservierten Namen für eine Variable verwenden, handelt es sich um eine Variable mit schlechtem Namen. Auch wenn es sich um einen legitimen Namen handelt, z. B. Class für Classroom-Software.

Schlecht benannte Variablen sind ein Zeichen für schlecht durchdachten oder zufälligen Code. Achten Sie auf andere Fallstricke in der von Ihnen verwalteten Software.

donnerstagswoche
quelle
0

Ich halte absichtliche Rechtschreibfehler oder Abkürzungen für eine gute Idee, wenn sie sorgfältig und konsequent verwendet werden .

Betrachten Sie in Java:

class X { public X() { } }
X x = new X();
x.getClass;  // Wha?  How does "get" help anything?
x.class;     // Best, but requires more lexer/parser work
x.klass;     // At least as good as getClass
x.clazz;     // Same

Bei der Verwendung von Rechtschreibfehlern ist das reservierte Wort eindeutig das beste Wort für den Job. Es gibt zwei Stellen , an denen Sie Rechtschreibfehler vermeiden können.

  1. Sie haben keine Lust, an einen guten Namen zu denken
  2. Sie möchten nur eine Dummy-Variable, für die kein beschreibender Name erforderlich ist

Im ersten Fall ist es ziemlich offensichtlich, dass Faulheit selten eine gute Richtlinie für die Erstellung von Qualitätscode ist. Wählen Sie im zweiten Fall eine wirklich kurze Variable. Das tun Mathematiker ständig und Programmierer für Indizes. Es gibt keinen Grund, sich darauf zu beschränken, dies für Indizes zu tun, wenn es sich wirklich nur um eine Dummy-Variable handelt:

boolean isMyName(String testName) { return myName.equals(testName); }
boolean isMyName(String s) { return myName.equals(s); }

Date nextMeeting(Klass klass) { return /* something */ }
Date nextMeeting(Klass k) { return /* something */ }

Sie verlieren nichts mit kurzen Variablennamen, wenn die Methode oder die Struktur des Codes Ihnen sagt, was da sein muss.

Rex Kerr
quelle
2
Es tut mir leid, ich kann nicht zustimmen. Wie funktioniert nextMeeting genau? Die Logik ist dunkel. Sie zwingen mich, die Definition von Klass jedes Mal nachzuschlagen, wenn ich Ihren Code lese, weil der Name bedeutungslos ist. Wenn Sie stattdessen nextMeeting (MeetingRoom meetingRoom) hätten, hätte ich eine Klassendefinition weniger zu lesen und wäre dadurch produktiver. Code wird viel mehr gelesen als geschrieben.
MrFox
@suslik - nextMeeting(MeetingRoom r)ist reichlich. Was ist das meetingRoomSie es bekommen? Wenn ja, nextMeeting(int meetingRoom)würde ich verstehen, aber es geht darum, kurze Variablennamen zu verwenden, wenn die Informationen bereits aus anderen Quellen verfügbar sind .
Rex Kerr
In meinem Beitrag ging es mehr um die Existenz von Klass in der Codebasis. Ich stimme manchmal mit kurzen Variablennamen überein, aber wenn Ihre Methoden lang werden und Sie weiterarbeiten müssen, um sicherzustellen, dass "r" ein MeetingRoom ist, ist das auch nicht großartig. Ich bin gespannt, was der Nachteil von meetingRoom ist. Horizontaler Raum? Zu lange zu tippen?
MrFox
@suslik - Ja, Sie verlieren den horizontalen Kontext mit langen Variablennamen. Sie verlieren den vertikalen Kontext mit langen Methoden, deshalb ist es am besten, diese zu vermeiden (aber ich stimme zu, wenn Sie es trotzdem tun, möchten Sie wahrscheinlich, dass Ihre Variablennamen besser in Erinnerung bleiben). Klasswar eine Alternative, als es ein reserviertes Wort gab . Ich empfehle keine Rechtschreibfehler, wenn die ursprüngliche Schreibweise verfügbar ist!
Rex Kerr
0

Ich habe Class klassbeim Reflektieren legitime Verwendungen gesehen, bei denen Sie tatsächlich mit einer Instanz der ClassKlasse arbeiten.

Matthew
quelle
2
Die Frage ist nicht, ob es einen Fall gibt, in dem Sie eine Instanz haben, sondern ob Sie diese Schreibweise oder einen aussagekräftigeren Namen wie userClassoder eine andere Option verwenden sollten.
Nicole
2
In einem solchen Fall würde ich es vorziehen , classInstanceüber klass.
Konrad Morawski
2
@KonradMorawski: Aber alle Objekte, mit denen Sie arbeiten, sind Instanzen, also classInstanceziemlich redundant. Außerdem könnte ich mir sowas vorstellen class klass; Object classInstance = klass.newInstance;.
Maaartinus
0

Ich sehe oft Code, der absichtliche Rechtschreibfehler gebräuchlicher Wörter enthält, die zu guten oder schlechten Wörtern geworden sind:

klass oder clazz für class: Class clazz = ThisClass.class

Anzahl für Anzahl in SQL: Anzahl (*) AS Anzahl

Persönlich finde ich, dass dies die Lesbarkeit verringert. In meiner eigenen Praxis habe ich nicht allzu viele Fälle gefunden, in denen kein besserer Name verwendet werden konnte - itemClass oder recordTotal.

Es ist jedoch so üblich, dass ich mich nur fragen muss, ob ich der einzige bin. Hat jemand einen Rat oder noch bessere, zitierte Empfehlungen von angesehenen Programmierern zu dieser Praxis?

Für lokale Variablen und formale Argumente spielt es keine Rolle.

Jeder Name ist in Ordnung, solange er nicht absichtlich irreführend oder störend ablenkt. In deinem Beispiel:

public static Method findBenchmarkMethod(BenchmarkRecord benchmark) {
    Class<?> clazz = ClassUtils.loadClass(benchmark.generatedClass());
    return findBenchmarkMethod(clazz, benchmark.generatedMethod());
}

Es spielt keine Rolle, ob die einzelne lokale Variable "clazz" oder "klass" oder "cls" oder einfach "c" ist. Ich würde wahrscheinlich nur den Ausdruck inline:

return findBenchmarkMethod(ClassUtils.loadClass(benchmark.generatedClass()),
                           benchmark.generatedMethod());

Die Länge eines Variablennamens sollte sich auf den Gültigkeitsbereich der Variablen beziehen. Für lokale Variablen in kurzen Methoden (und sie sollten alle kurz sein) sind sehr kurze Namen in Ordnung.

Kevin Cline
quelle
Ihre Inline sieht falsch aus ClassUtils.loadClass(benchmark.generatedClass())=> benchmark.generatedClass()- ClassUtils.loadClassauf dem Weg verloren
Mücke
0

Ich denke, Rechtschreibfehler sind immer eine schlechte Idee. Es ist einfach nicht schön für deine Leser. Ich würde mich fragen, ob ich etwas verpasst habe, wenn ich das Wort sehe klass. (Meinten sie class, oder meinten sie den Piraten?) Zumindest für mich sind alle Rechtschreibfehler, die ich erkenne, irritierend.

Für die sehr wenigen Fälle, in denen das reservierte Wort wirklich die einzige signifikante Sache ist, die über die Variable bekannt ist, würde ich die folgenden Alternativen verwenden:

  • Wenn es sich um ein Funktionsargument handelt, verwenden Sie aClassanstelle von class.

  • Wenn es sich um eine lokale oder Mitgliedsvariable handelt, verwenden Sie myClassanstelle von class.

  • Wenn es sich um einen Accessor handelt, verwenden Sie getClass()anstelle von class().

Natürlich ist das hinzugefügte Präfix ziemlich sinnlos und sollte daher immer nur als letzter Ausweg verwendet werden. Aber zumindest stört es nicht den mentalen Parser Ihres Lesers, und es ist eine ausfallsichere Möglichkeit, reservierte Wörter zu vermeiden.

cmaster
quelle
0

Ein Vorteil der kreativen Rechtschreibung ist die bessere Suchfähigkeit. Ich denke, es ist viel einfacher, eine vollständige Codesuche nach einzigartigen Dingen durchzuführen, als nach gebräuchlichen Wörtern, bei denen Sie zu oft alle falschen Dinge finden, und 1000 von ihnen. Als Beispiel hatte ich kzpg.com. Google das jetzt und du wirst nur ein paar Treffer sehen. Es ist einzigartig und daher sehr auffindbar.

Aber zu einem gewissen Grad denke ich, dass diese Frage eher der Meinung als der Substanz entspricht. Ich bin auf Forth aufgewachsen, wo es nur um Worte ging, und viele davon. Man lernte sehr kreativ zu werden, um die Finger zu retten. Am Ende hatte ich ungefähr 640.000 Zeichen, mehr oder weniger in meiner Quellenbasis. Daher war es wichtig, die Worte kurz zu halten, um die Arbeit zu erledigen.

Elliptische Ansicht
quelle
Diese Verbindung ist jetzt unterbrochen.
Peter Mortensen