2009-11-07 22 views
10

Questa domanda riguarda lo stile di denominazione delle variabili nell'obiettivo c e cacao. Voglio solo sottolineare che non sto cercando una risposta "giusta", solo buone idee.Convenzioni di denominazione delle variabili di istanza in Cocoa

Ho letto le guide di stile oggettive di Apple e di Google e non sono davvero contento di nessuno dei due. La guida di Apple non ha raccomandazioni di stile reali riguardanti le variabili di istanza rispetto alle variabili locali. In effetti, la stessa libreria Cocoa sembra perfettamente felice di avere parametri di funzione con lo stesso nome delle variabili di istanza. Questo mi fa rabbrividire personalmente.

Guida a Googles specifica che le variabili di istanza devono essere indicate con un carattere di sottolineatura finale. Va bene, tutto bene e bene, ma suggerisce di sintetizzare tutte le proprietà pubbliche con @synthesize property = property_. Non conosco nessun altro, ma sarò dannato se lo farò per ogni variabile di istanza nel mio progetto. Penso che sia una soluzione dispendiosa e confusa.

Sono tentato di utilizzare lo stile di denominazione myX (ad esempio "myInstanceVariable") per le proprietà dell'oggetto, ma raramente ho visto quello stile nell'obiettivo c.

Quindi sì, che cosa usi? Qualche convenzione di stile là fuori non so di ciò che hai trovato utile? Pensi che i parametri di funzione con lo stesso nome delle variabili di istanza siano pericolosi, specialmente in più ambienti di sviluppo? Grazie ragazzi e ragazze!

NOTA - Come molte persone hanno sottolineato, la mia terminologia era disattivata nell'OP. Mi scuso se la dicitura originale ha ferito la chiarezza, ma penso che il punto fosse ancora chiaro.

risposta

10

tendo a usare istanza nomi senza prefisso variabili (notare che "variabile membro" è un ismo C++ come è indicativo di strutture e classi essendo essenzialmente intercambiabili, che non è il caso in Objective-C) , e nei casi in cui si pone l'ambiguità, io uso la convenzione Smalltalk di nominare il parametro diper il suo tipo con "a" o "una", ad esempio:

- (void)setFoo:(SOFoo *)aFoo; 
{ 
    foo = aFoo; 
} 

(ovviamente, in objC moderno vi piacerebbe utilizzare una proprietà per questo.)

Utilizzo di theFoo invece di aFoo è anche piuttosto comune; vedere le risposte a this question.

La convenzione di Google ha senso se sei davvero preoccupato per i conflitti. Se si utilizza uno Xcode text macro o uno strumento come Completion Dictionary o Accessorizer per generare le proprie direttive, è piuttosto semplice da adottare.

Si noti che il Cocoa key-value coding guidelines praticamente presuppone sia (a) non prefisso/suffisso i nomi delle variabili di istanza, o (b) implementare (o sintetizzare) accessori non prefissati/suffisso per loro. Come qualcun altro ha menzionato, non usare il prefisso _; è riservato per l'uso di Apple nei loro framework.

+0

Buona risposta. Sono d'accordo sul fatto che il prefisso del parametro è più pulito rispetto al tentativo di calzare una convenzione in variabili di istanza c oggettive. I documenti Apple descrivono le convenzioni per questo nel caso di tipi comuni di NSObject, quindi estenderlo per i propri tipi ha perfettamente senso. Sto contrassegnando questo come la risposta perché ha risposto meglio al punto principale della mia domanda - evitando la spaziatura ambigua dei nomi nelle funzioni di classe - e non aggiunge strane convenzioni o aggettivi. – DougW

-1

m_variableName è piuttosto comune anche per le variabili membro. Personalmente, il più delle volte, vado con lo stesso nome per entrambe le variabili e faccio la distinzione tra this.varname e varname.

+0

Sì ho visto m_X di tanto in tanto, ma con la convenzione setter in Objective C sembra disordinato. setM_variableName? Suppongo che se ti attieni alla notazione dei punti lo eviti comunque. – DougW

+1

Il prefisso "m_" è una cattiva abitudine. Così è il singolo trattino basso, a meno che non si stia scrivendo il codice per uso interno su Apple. Sfortunatamente, Apple ha lasciato che un certo numero di progetti di codice campione colpisse le strade senza una corretta pulizia. – NSResponder

+1

Perché è una cattiva abitudine? Apple non può aggiungere ivar al codice Obj-C 1.0, in modo che non possano rompere il tuo. E a quanto ho capito, il compilatore li regola in Obj-C 2.0 in modo che anche se Apple può interrompere la compilazione del codice (facile da risolvere), i programmi già compilati continueranno a funzionare. –

4

In Cocoa, lo stile è quello di avere nomi pascalCased (o che sia cammelloCased? Non posso mai ricordare); e avere le variabili membro nominate come i metodi di accesso. (Come ad esempio NSInteger anInteger, - anInteger e - setAnInteger:).

Potrebbe non essere lo stile migliore, ma probabilmente è una buona idea abituarsi ad esso se si intende eseguire qualsiasi tipo di lavoro con Cocoa, poiché un certo numero di meccanismi presuppone questo particolare tipo di convenzione di denominazione.

+0

Certo, sono a conoscenza delle convenzioni obbligatorie per getter/setter e non mi allontanerei dal caso dei cammelli. La mia domanda è più simile alla notazione utilizzata per indicare la differenza tra un'istanza e una variabile membro. In effetti, puoi sintetizzare i metodi di accesso con qualsiasi nome per qualsiasi variabile come nello stile di google, ma ciò potrebbe confondere IMO. – DougW

6

Primo: non ci sono "variabili membro" in Objective-C, ci sono "Variabili di istanza" o "ivars".

Google NON è alcun tipo di autorità sulla codifica Objective-C o sullo sviluppo Mac. Google Earth è un'app Qt: "Nulla di più.

Mi sembra di ricordare di aver visto una guida in stile di programmazione ufficiale di Apple per Objective-C, che non trovo al momento. Questo articolo è un buon riassunto, però:

http://cocoadevcentral.com/articles/000082.php

trovato! Ecco le linee guida di codifica ufficiale di Apple per Cacao:

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CodingGuidelines/CodingGuidelines.html

+0

Grazie per aver collegato le linee guida Apple. Penso che il resto di questo sia fuori tema però. Tutti sembrano desiderosi di utilizzare la loro conoscenza della tassonomia della terminologia c, ma non rispondono alla domanda in questione. Inoltre, Google potrebbe non aver inventato l'obiettivo c, ma sono certamente una fonte valida quando si tratta di convenzioni di codifica. In questo caso, non penso che i documenti Apple fossero esplicitamente chiari su questo e su Google. Mi è appena capitato di non gradire la loro risposta. – DougW

Problemi correlati