2009-02-01 8 views
20

Ich lehre mich Objective-C und ich bemerkte in vielen Büchern und Beispielen die Verwendung von 'k' und Camel-Gehäuse in konstanter Definition, z.Was bedeutet das Starten von Konstanten mit 'k'?

#define kMyConstant 0 

Welche Bedeutung hat das 'k'? Ist dies im Objective-C-Stil oder generell in C üblich? Warum die Abweichung von (was ich immer als Best Practice empfand) K_MY_CONSTANT Stil?

Danke.

Antwort

21

Es wurde schon einmal in der SO Frage Lower case "k" in Cocoa erwähnt.

Es ist eine allgemeine Programmier Notation nicht spezifisch für Objective-C ( d.h. ungarische Notation) und die "k" steht für "constant".

Wenn man sich die Google cache von Richtlinien des Google sucht Objective-C können Sie sehen, dass sie es in ihrem Styleguide enthalten verwendet:

Constant Namen (#defines, Aufzählungen, Konst lokale Variablen, usw.) sollte mit einem Kleinbuchstaben k beginnen und dann Groß- und Kleinschreibung verwenden, um Wörter abzugrenzen, dh kInvalidHandle, kWritePerm.

Obwohl es mühsam ist zu schreiben, sind sie absolut unerlässlich, um unseren Code lesbar zu halten. Die folgenden Regeln beschreiben, was Sie kommentieren sollten und wo. Aber denken Sie daran: Während Kommentare sehr wichtig sind, ist der beste Code selbstdokumentierend. Den Typen und Variablen sinnvolle Namen zu geben, ist viel besser als obskure Namen zu verwenden und sie dann durch Kommentare zu erklären.

Aber es wurde seitdem in der live version des Dokuments entfernt. Es sei darauf hingewiesen, dass es gegen die Official Coding Guidlines for Cocoa von Apple geht.

+0

Sehr interessant. "Im Allgemeinen verwenden Sie den # define-Präprozessor-Befehl nicht zum Erstellen von Konstanten. Verwenden Sie für Integer-Konstanten Aufzählungen und für Gleitkommakonstanten das Konst-Qualifikationsmerkmal, wie oben beschrieben." Vielen Dank! – typeoneerror

+0

PS, tut mir leid wegen der wiederholten Frage. Ich schwöre, ich habe zuerst gesucht! ;) – typeoneerror

+0

@TypeOneError, ich habe es nicht erwähnt, um auf eine Wiederholungsfrage hinzuweisen. Ich denke nicht unbedingt, dass es eine Wiederholung dieser genauen Frage ist. Ich habe Sie gerade auf eine andere Ressource zum Lesen hingewiesen. Deine Frage ist ein bisschen breiter und wahrscheinlich ein besserer. – mmcdole

3

Alle Caps (wie in K_MY_CONSTANT) bezeichnet normalerweise ein Makro - nicht unbedingt eine Konstante. Im Allgemeinen ist es wichtig, dass Makros hervorstechen, weil sie alle Namespaces überdecken.

Die Konvention 'k' wird (aber nicht allgemein) für Nicht-Makro-Konstanten in C/C++ und wahrscheinlich anderen Sprachen verwendet. Ich vermute 'k' wird verwendet, weil 'c' bereits oft verwendet wird - entweder um einen Klassennamen zu bezeichnen (wie in CString) oder dass eine Variable ein Zähler ist.

3

Die kMyConstant-Sache geht auf die sehr alten Mac-Programmiertage zurück (die 80er/90er Jahre sind "sehr alt"). Dies war ein Standard Apple verwendet und viele Mac-Programmierer auch verwendet; Dies ersetzt die Definitionen vom Typ MY_CONSTANT.

Ich könnte mir vorstellen, dass die Autoren, die Sie lesen, Mac Pascal/C-Programmierer für die alte Mac Toolbox waren, bevor sie NeXT/Cocoa-Programmierer waren. Die Mac-Bibliotheken wurden früher als "Toolbox" bezeichnet - dies war die Menge an APIs und Bibliotheken, die im Laufe der Zeit zu Carbon wurden.

Ich benutze immer noch kMyConstant manchmal; fährt meine alte Schule Unix Programmierer Kollegen Nüsse.:-)

3

Ich denke, die Verwendung eines führenden „k“ ist, weil alle Sprachen sie als harte Konsonanten ausspricht und so erinnert es Menschen in der Englisch Aussprache von „konstant“ :-)

keine reservierten Wörter beginnen mit k so ist es einfacher als Suchziel.

Alternativ, von einem grafischen Aspekt, als ein führendes Zeichen bietet es eine sehr klare Flagge vor dem Rest des Namens. Führendes "c" ist weniger offensichtlich und könnte verwendet werden, um Rollen (wie in ungarischer Schreibweise) oder Klassen (wenn in einer Sprache ohne Beachtung von Groß- und Kleinschreibung) anzuzeigen.

MY_CONSTANT ist ziemlich gut als für makrobasierte Konstanten vereinbart. Manchmal ist es wichtig zu wissen, dass eine Konstante durch ein Makro definiert wird, was zum Beispiel bedeutet, dass sie auf Literalen und damit auf einer begrenzten Anzahl von Datentypen basiert und auf globaler Ebene definiert ist (wie Michael Burr gezeigt hat) out) überschreibt alle lokalen Namespace-Konstanten.