2009-05-08 3 views
31

Ich weiß, dass es für C++ und Java eine gut etablierte Namenskonvention ist, dass Konstanten in Großbuchstaben geschrieben werden sollten, mit Unterstrichen, um Wörter zu trennen. Wie dieses (Java-Beispiel):Benennung: Warum sollten benannte Konstanten alle Großbuchstaben in C++/Java sein?

public final static Color BACKGROUND_COLOR = Color.WHITE; 
public final static Color TEXT_COLOR = Color.BLACK; 

Diese Namensgebung zu verstehen Konvention einfach ist und zu folgen, aber ich frage mich, warum wählt diese Namenskonvention über die normale Namens-Konvention für Variablen:

public final static Color backgroundColor = COLOR.WHITE; 
public final static Color textColor = COLOR.BLACK; 

Es scheint nicht nötig zu sein, das Aussehen von Konstanten zu ändern. Wenn wir ihnen einen Wert zuweisen wollen, wird der Compiler dies sowieso verhindern. Tatsächlich macht es Probleme, wenn später die Konstante in eine richtige Variable geändert wird (weil die Farben zum Beispiel konfigurierbar werden).

Also was ist der ultimative Grund, benannte Konstanten in Großbuchstaben zu schreiben? Historische Gründe?

+22

Es ist eigentlich keine gute Idee Konstanten in Großbuchstaben in C++ zu benennen. ALL_UPPER_CASE ist eine Konvention für Präprozessor-Makros. Daher können Ihre Konstanten mit Präprozessorsymbolen kollidieren und von ihnen überrumpelt werden. –

+1

Dies könnte am besten als Community-Wiki gedient werden – lothar

Antwort

1

Wahrscheinlich haben Sie Recht. Computer und Compiler (vor allem) waren nicht so schnell wie heute.

Joel Spolsky erwähnt in one of his essays wie beeindruckt er war mit Kompilierungszeit der neuen Version von Turbo Pascal.

Ich erinnere mich, als Zusammenstellung von nicht zu groß Programm (10-20KLOC) mit Overlays in Turbo Pascal 5.0 auf PC XT 10 MHz etwa 20 Minuten in Anspruch nahm ...

Ich nehme an, dass für die Kompilierung warten Fehler zu erkennen war nicht akzeptabel.

Und solche Konvention hilft, Fehler und verschwendete Zeit während der fehlerhaften Kompilierung zu vermeiden.

16

Ich kann mir vorstellen, dass zunächst zurück in den C Tage, würden die Leute symbolisch „Konstanten“ implementieren, die Pre-Prozessor:

typedef unsigned int Color; 
#define BACKGROUND_COLOR 0xffffff 

Solche „Konstanten“ sind nur prettified Literale, und als solche sind sie verhalten Sie sich nicht ganz so wie Variablen. Sie können zum Beispiel nicht, nehmen Sie die Adresse eines solchen „Konstante“:

Color *p = &BACKGROUND_COLOR; // Breaks! 

Aus diesem Grund ist es sinnvoll, sie „stand out“ zu haben, macht, wie sie sind wirklich nicht nur „Variablen, die Sie kann nicht geändert werden ".

+2

Aber ist das nicht die Aufgabe der IDE, heutzutage? Sie hervorheben? – xtofl

+1

Nicht jeder benutzt immer eine IDE, auch heute noch. Ich gebe immer noch einen bemerkenswerten Teil meiner Zeit (~ 10%) in vi aus. – dagorym

+6

Vergessen Sie nicht die #define-Makros, die zu unangenehmen Nebenwirkungen führen können. Wenn sie alle in Großbuchstaben geschrieben sind, ergibt sich ein visueller Hinweis für "Hier sind Drachen!" – Skizz

3

Mit Großbuchstaben Konstante lange Formeln sind viel einfacher zu lesen, müssen Sie nicht erraten, welches Element variieren kann und welche nicht. Es ist natürlich nur eine Konvention, aber hilfreich.

29

Ich denke, es ist kein technisches, sondern ein psychologisches Problem. Namenskonventionen sind nicht für den Compiler zu verarbeiten (der Computer kümmert sich nicht wirklich um Namen), sondern eher für den Programmierer, der den Code durchsucht, um so viel Information wie möglich mit so wenig Aufwand wie nötig zu haben. Die Verwendung einer anderen Namenskonvention sagt dem Leser deutlich, dass das, was Sie lesen, etwas ist, das zur Kompilierzeit FIXED ist und Sie nicht durch den Code gehen müssen, um zu bestimmen, wo und wie der Wert dorthin gelangt ist.

+1

"so viele Informationen wie möglich mit so wenig Aufwand wie nötig": Ich stimme dem zu. In Kombination mit "Klartext" als Programmiermedium kann dies zu einer Großschreibung führen. Wenn nur der Editor Konstanten in einer anderen Farbe zeigen würde, würde kein spezielles Gehäuse benötigt. Heutzutage zeigen die meisten Programmiertools mehr Informationen, also denke ich, dass Namenskonventionen langsam verblassen. – xtofl

+5

Muss es wirklich zur Kompilierzeit behoben werden? Was ist mit einer Laufzeitkonstante, z.B. die Zeit, zu der das Programm gestartet wurde? Was ist mit festen Sammlungen, die vom Compiler nicht verstanden werden können, aber dennoch effektiv konstant sind? –

+2

@ Jon Skeet: Das ist ein guter Punkt: Wie man mit Grenzen umgehen. Was ist die Definition einer Konstante? Hier kämpfst du mit der Sprache, die du benutzt. Für mich sollten sie Großbuchstaben sein, da sie Konstanten sind ... unabhängig von den Einschränkungen der Sprache/des Compilers sind sie Konstanten. –

17

Wenn ich weiß, dass etwas eine Konstante ist, kann ich mehrere Male darauf verweisen und weiß, dass es sich nicht ändert.Mit anderen Worten, das weiß ich:

Color black = Colors.BLACK; 
foo(black); 
foo(black); 

das gleiche wie:

foo(Colors.BLACK); 
foo(Colors.BLACK); 

, die nützlich sein kann manchmal zu kennen. Persönlich bevorzuge ich die .NET-Namenskonvention, die Pascal Fall für Konstanten zu verwenden ist (und Methoden):

Foo(Colors.Black); 
Foo(Colors.Black); 

Ich bin kein großer Fan von shouty Fall ... aber ich mag Konstanten offensichtlich Konstanten seines .

+3

Downwoters: Bitte geben Sie Kommentare. –

+3

Die Frage ist: Warum ein anderes Namensschema verwenden, um Konstanz zu bezeichnen? Nicht darum, warum Konstanz nützlich ist. – xtofl

+8

Meine Antwort spricht nicht darüber, warum Konstanz nützlich ist - es geht darum, warum * Wissen * über Konstanz nützlich ist. Hier kommt die Namensgebung ins Spiel. –

1

Es ist eine Problemumgehung für Ihre Entwicklungswerkzeuge nicht in der Lage, die Eigenschaften eines Bezeichners in einer bequemen Weise zu erkennen.

Ähnlich wie ungarische Notation.

Wenn Ihre IDE besser wird, brauchen Sie keine Namenskonvention, aber diejenige, die vorschreibt, dass ein Name umfassende Informationen darüber ist, was ein Bezeichner bedeutet.

Auch das kann sich entwickeln: warum nicht ein Programmiersystem erstellen, wo Sie nur Kennungen erstellen und fügen Sie Eigenschaften wie "kurze Beschreibung", "type", ... Wenn das Werkzeug ankommt, kann dies bequem tun So, ich bin drin. "Intentional Programming" ist ein Hinweis.

1

Bei der Programmierung ist es wichtig, einen Code zu erstellen, der für Menschen verständlich ist. Namenskonventionen helfen dabei. Dies ist am besten, wenn Sie Code betrachten, den Sie nicht geschrieben haben, und den Code wartungsfreundlicher macht, da er einfach von Konstanten und Variablen zu unterscheiden ist.

8

Ich glaube an C++ ist es eine Konvention, die von den Tagen der Verwendung des Präprozessors übernommen wurde, um # konstante Werte zu definieren. Damals wurde es gemacht, um zu vermeiden, dass der Präprozessor seinen gesamten Quellcode mit Füßen tritt, da die üblichen Konventionen für C-Funktion und Variablennamen sie zu Groß- oder Kleinbuchstaben machen würden.

Aus C++ Sicht würde ich sagen, dass es eine schlechte Idee ist, Ihre Konstanten in Großbuchstaben zu machen. Ich musste deshalb mehr als ein Build-Problem debuggen - denken Sie daran, dass der C++ - Präprozessor nichts über Namespaces und den Namensumfang weiß und gerne ersetzen wird, was er für angemessen hält, obwohl es eher unpassend ist.

+3

Genau das wollte ich sagen. Heute, in C++, ist es ein Anti-Idiom, ALL_UPPER_CASE für Konstanten zu verwenden, da der Vorprozessor Ihre Konstanten mit einigen Makros überschatten kann, die er von einer Stelle übernommen hat, die Sie nicht erwartet haben (wie die COS-Header-Dateien Ihres Herstellers). –

+2

Dies ist der Grund, warum Google 'kConstantName' in seinen Namenskonventionen verwendet. Eine Alternative, die den alten Stil etwas bewahrt, wäre k_CONSTANT_NAME. –

-1

Codierungskonvertierungen sollen die Lesbarkeit verbessern. Sie müssen keine Buchstaben verwenden. Java erlaubt zum Beispiel $ symbol.

public final static Color $$ = COLOR.WHITE; 
public final static Color $_ = COLOR.BLACK; 

Sie könnten Ihre Variablen auch nummerieren, aber das bedeutet nicht, dass es eine gute Idee ist. ;)

3

Ich denke Großbuchstaben Konstanten sind ein schlechtes Erbe von C. Die Logik dahinter ist die gleiche wie bei der Verwendung von Unterstreichungen als Präfixe für private Mitglieder. Dies ist technisches Zeug, das bereits durch Java-Schlüsselwörter wie private oder im Falle von Konstanten static final ausgedrückt wird.

Siehe auch: http://weblogs.java.net/blog/2006/09/28/case-against-uppercases

4

In C (und dann C++), Symbole, die mit dem Präprozessor #define Richtlinie definiert wurden, wurden alle in den Schutzkappen als ein lautes Signal an Entwickler geschrieben, dass der Code war nicht, wie es schien, und nicht als normales Symbol behandeln. Konstanten gab es anfänglich nicht in K & R C (obwohl const später von C++ zurückgebracht wurde), so verwendeten die Entwickler stattdessen #define, daher die Kappen.

Aus irgendeinem Grund wurde dies in Java als "Konstanten sind Caps" verdreht, daher die aktuelle fehlgeleitete (IMO) Konvention.

-2

Es ist definitiv ein technisches Problem in Java. Überlegen Sie:

Was ist der Wert von "whatAmI" vor und nach dem Auskommentieren der vorherigen Zeile?

Wenn der Konstantenname dieselbe Konvention wie der Name der lokalen Variablen hat, führt dies zu REAL-Code-Problemen. Konstanten sollten immer die UPPERCASE-Konvention haben, um dies zu vermeiden.

+0

Das ist kein Problem von Konstanten vs. Variablen. Im selben Umfang können Konstanten und Variablen nicht den gleichen Namen haben. In Ihrem Beispiel könnte Weiß eine Variable anstelle einer Konstante sein und das gleiche Problem würde auftreten. – Mnementh

1

Im Grunde, zurück, als Menschen in C verliebt waren, und C++ & Java waren entweder neu oder noch nicht erstellt, Leute verwendeten alle Großbuchstaben für Preprozessor-Konstantennamen, um anzuzeigen, dass sie nicht tatsächlich Variablen waren.

#define INT_CONST 4 
#define STRING_CONST "Yello." 
#define FLOAT_CONST 3.6122448 

bedenkt, dass dies der einzige Weg war, eine wahre Konstante in C (es ist immer noch möglich const Variablen zu ändern, wenn Sie wissen, wie) zu definieren, Präprozessorkonstanten so wurden nur als Konstanten gesehen, und als solche der Bedeutung von All-Caps-Namen, die von Präprozessor-Konstanten zu einfachen Konstanten im Allgemeinen verschoben sind. Dies wurde dann in spätere Sprachen übertragen und wurde zum Standard "costs = capitals".

Andere Sprachen haben jedoch ihren eigenen bevorzugten Stil (zum Beispiel C# &. NET bevorzugen PascalCase), also ist es am besten, den bevorzugten Stil zu verwenden, wenn es einen gibt.

0

Eigentlich rät die meisten C++ Benennungsrichtlinien (einschließlich ISO, Boost, Sutter & Stroustrup und Google) stark davon ab, Konstanten mit Großbuchstaben zu benennen. Dies liegt daran, dass Makros auch Großbuchstaben verwenden und sie überall in Header-Dateien verstreut sein können, was möglicherweise seltsame Verhaltensweisen erzeugt. Die Leute benutzen immer noch alle Caps, weil sie von altem C/K & R oder altem Legacy-Code lernen. In Modern C++ - neuem Code sollten Sie jedoch vermeiden, Großbuchstaben für alles außer Makros zu verwenden.

Meine Lieblingstheorie, warum überhaupt Caps existieren, ist, dass bei sehr alten Maschinen der Code direkt im Maschinencode über numerische Tastaturen eingegeben wurde. Wenn die Assemblersprache in der Szene eintraf, verwendete sie nur Großbuchstaben, da die Tastatur zu dieser Zeit nicht standardisiert war und einige Tastaturen eingeschränkt waren, zum Beispiel mit den gleichen numerischen Tastenfeldern, um in Alphabete wie in Funktionstelefone einzutreten. Dies wurde dann auf viele frühe Sprachen wie BASIC übertragen, was alles ist, was alles abdeckt. Als die tatsächlichen Terminals verfügbar wurden und die Tastaturen standardisiert wurden, begannen die Leute, gemischte Fälle ohne Vorbehalte zu verwenden, und alle Großbuchstaben wurden für etwas reserviert, das im Vergleich zu Funktionen und Variablen selten vorkommt.

Die meisten C++ - Richtlinien stimmen nun darin überein, "k" als Präfix für Konstante gefolgt von Name mit Unterstrich oder CamelCase zu verwenden. Ich persönlich bevorzuge kCameCase, weil es leicht erlaubt, von Variablen zu unterscheiden, die mit under_scores benannt sind.

const float kFixedRadius = 3.141; 
0

Sie ALL_CAPS nicht für Konstanten verwenden, nur weil Konstanten Makros verwendet werden soll.

Diese quote von C++ Core-Richtlinien fasst alles zusammen.

0

Dies hilft dem Programmierer zu verstehen, was er auf einen Blick sieht. Es hilft zu wissen, dass eine Konstante verwendet wird, so dass der Wert sich nicht ändert, egal wie Sie darauf Bezug nehmen.

Es gibt nicht wirklich einen Grund in Bezug auf die Compiler-Seite der Dinge. Namenskonventionen sind rein, Konventionen, nicht wirklich technische Restriktionen.

Verwandte Themen