2009-02-01 3 views
20

Mi sto insegnando Objective-C e ho notato in molti libri ed esempi l'uso di "k" e l'involucro di cammello in definizione costante, ad es.Qual è il significato di iniziare le costanti con 'k'?

#define kMyConstant 0 

Qual è il significato della "k"? Questo è univoco per lo stile Objective-C, o comune a C in generale? Perché la deviazione da (quello che ho sempre pensato come best practice) stile K_MY_CONSTANT?

Grazie.

risposta

21

È stato menzionato una prima volta nella domanda SO, Lower case "k" in Cocoa.

È una programmazione generale notazione non specifiche per Objective-C (cioè notazione ungherese) e "k" significa "costante".

Se si guarda alla Google cache delle linee guida di Google per Objective-C si può vedere che hanno usato per includerlo nella loro styleguide:

nomi costanti (#defines, enums, variabili locali const, ecc.) dovrebbe iniziare con una k minuscola e quindi usare un caso misto per delimitare parole, ad esempio kInvalidHandle, kWritePerm.

Sebbene sia un dolore scrivere, sono assolutamente essenziali per mantenere leggibile il nostro codice. Le seguenti regole descrivono cosa dovresti commentare e dove. Ma ricorda: mentre i commenti sono molto importanti, il codice migliore è autodocumentante. Dare nomi sensibili a tipi e variabili è molto meglio che usare nomi oscuri e quindi cercare di spiegarli attraverso i commenti.

Ma da allora è stato rimosso nel documento live version. Va notato che va contro il Official Coding Guidlines for Cocoa di Apple.

+0

Molto interessante. "In generale, non utilizzare il comando #define per il preprocessore per creare costanti: per le costanti integer, utilizzare le enumerazioni e per le costanti in virgola mobile utilizzare il qualificatore const, come descritto sopra." Grazie! – typeoneerror

+0

PS, mi dispiace per la domanda di ripetizione. Giuro che ho cercato prima! ;) – typeoneerror

+0

@TypeOneError, non l'ho menzionato per indicare una domanda a ripetizione. Non penso necessariamente che sia una ripetizione di quella domanda esatta. Ti stavo solo indicando un'altra risorsa da leggere. La tua domanda è un po 'più ampia e probabilmente migliore. – mmcdole

3

Tutte le protezioni (come in K_MY_CONSTANT) normalmente indicano una macro, non necessariamente una costante. In genere è importante che le macro si distinguano perché coprono tutti gli spazi dei nomi.

La convenzione "k" viene utilizzata (ma non universalmente) per le costanti non macro in C/C++ e probabilmente in altri linguaggi. Sospetto che 'k' sia usato perché 'c' è già usato spesso - sia per denotare un nome di classe (come in CString) o che una variabile è un contatore.

3

La cosa kMyConstant risale ai tempi di programmazione Mac molto vecchi (gli anni '80/'90 sono "molto vecchi"). Si trattava di una Apple standard utilizzata e anche molti programmatori Mac; questo ha preso il posto delle definizioni di tipo MY_CONSTANT.

Immagino che gli autori che state leggendo fossero programmatori Mac Pascal/C per il vecchio Mac Toolbox prima di essere programmatori NeXT/Cocoa. Le librerie del Mac si chiamavano "Toolbox" - questo era l'insieme di API e librerie trasformate in Carbon nel tempo.

Uso ancora kMyConstant a volte; spinge i miei colleghi di programmatori Unix della vecchia scuola.:-)

3

penso uso di un leader "k" è perché tutte le lingue pronunciano come una consonante dura e così ricorda la gente della pronuncia inglese di "costante" :-)

Non ci sono parole riservate Iniziamo con k quindi è più facile come obiettivo di ricerca.

In alternativa, da un aspetto grafico, come carattere principale fornisce una bandiera molto chiara di fronte al resto del nome. La "c" principale è meno ovvia e potrebbe essere utilizzata per indicare i ruoli (come nella notazione ungherese) o le classi (se in un linguaggio non sensibile al maiuscolo/minuscolo).

MY_CONSTANT è piuttosto d'accordo per quanto riguarda le costanti basate su macro. A volte è importante sapere che una costante è definita da una macro, ad esempio che implica che si basa su letterali e quindi da una gamma limitata di tipi di dati, oltre a essere definita in un ambito globale e quindi (come indicato da Michael Burr out) sovrascrive eventuali costanti di namespace locali.