2009-08-21 14 views
8

Ho notato che la maggior parte dei codificatori Objective-C non utilizza mai la sintassi self->ivar quando accede direttamente alle variabili di istanza. La maggior parte del codice di esempio che vedo fa semplicemente riferimento alla variabile di istanza senza self->. Penso che sia piuttosto complicato fare riferimento a una variabile di istanza senza chiarire che si tratta di una variabile di istanza e non semplicemente una variabile dell'ambito corrente.Utilizzo di auto-> ivar quando si accede direttamente alle variabili di istanza

mi sento come voglio scrivere cose del genere:

- (void)dealloc { 
    [self->someVar release]; 
    [self->anotherVar release]; 
    [super dealloc]; 
} 

o

- (void)setVar:(Foo *)newVar { 
    [self->var autorelease]; 
    self->var = [newVar retain]; 
} 

non ci sono un sacco di occasioni in cui abbiamo mai nemmeno dovremmo accedere alle nostre variabili di istanza senza utilizzare un accessor per l'incapsulamento, ma a volte abbiamo bisogno di come in dealloc, o in getter e setter personalizzati.

Sono una persona cattiva/programmatore per fare questo? C'è qualche buona ragione per non scrivere codice come questo? Perché è davvero bello farlo in questo modo.

risposta

7

Chuck è corretta in quanto non c'è tecnica motivo non si dovrebbe scrivere in questo modo, a meno che non si sta shadowing ivars con le variabili locali, che è generalmente una cattiva idea. Tuttavia, è discutibile che omettere lo self-> sia stilisticamente più pulito, e certamente si traduce in un codice meno dettagliato. Personalmente troverei che lo self-> sia fonte di distrazione (specialmente se il codice è ben progettato e le variabili sono ben definite) ma se rende le cose più comprensibili per te, lo faccia con tutti i mezzi. Basta essere consapevoli che se si mostra il proprio codice ad altri programmatori Objective-C, è probabile che abbiano un'opinione contrastante, quindi è bene avere un aspetto positivo. Inoltre, molti programmatori scoprono che la loro percezione di ciò che rende il codice "piacevole" cambia nel tempo e con l'esperienza, e quelle opinioni spesso si addolciscono con l'età. :-)

+2

Come ho detto, è più breve. Lo preferisco, ma non potrei rendere l'argomento secondo cui gli identificatori più brevi sono sempre migliori, però - odio mantenere il codice che è tutto x, yez. Quindi è essenzialmente una questione di dove si trova il tuo mezzo felice. Sospetto che i pitonisti probabilmente preferirebbero la forma 'self->'. Ovviamente, non dovresti fare l'accesso diretto a ivar molto spesso in Objective-C, comunque. Forse essere poco attraenti è un'altra virtù della sintassi 'self->'. – Chuck

+0

Lol. "pensa la pelle". Quella pelle è magrissima e spessa? – Rob

7

Non c'è motivo per cui non si dovrebbe scrivere in questo modo. Penso che le persone tendano a scriverlo in un altro modo perché cercano comunque di evitare di pedinare i loro ivar, quindi non ci dovrebbero essere ambiguità su quale variabile stiano parlando - ed è più breve.

+0

Grazie mille per la risposta rapida! –

4

Risposta breve: No, non sei un programmatore cattivo a causa di quello :) Non c'è anche una buona ragione per non scrivere codice in questo modo; la maggior parte dei programmatori è semplicemente pigra o non ha mai scritto un metodo estenuante in tutta la loro vita.

Risposta lunga: Tecnicamente quando si accede a una variabile senza "auto->", il compilatore prima di una variabile di quel nome nel campo di applicazione locale e se non riesce a trovare uno, si ripeterà che la ricerca con le variabili di istanza. Se trova un hit lì, genererà effettivamente il codice come se "auto -> ..." fosse stato scritto lì. Se non ci fosse alcuna corrispondenza con le variabili di istanza, il compilatore tenterebbe di farlo nell'ambito globale, BTW.

La maggior parte dei programmatori legge solo il proprio codice e sa bene cosa è una variabile di istanza e cosa no. Una volta che hai dovuto lavorare con il codice che non hai scritto tu stesso, dove il metodo è lungo 4 schermate (e ho una schermata grande), sei davvero grato quando il programmatore ha reso assolutamente chiaro su ogni accesso variabile: è quella variabile un parametro inviato alla chiamata al metodo, una variabile locale di questo metodo, una variabile di istanza dell'oggetto o eventualmente una variabile globale (solo globale a tutte le istanze di questa classe o eventualmente globale). Sei grato, perché se ci sono solo un gruppo di variabili con un nome simile e senza uno schema di denominazione o accesso speciale, comunque di tipo diverso, perdi rapidamente la supervisione.E basandosi sul fatto che l'evidenziazione della sintassi Xcode evidenzia le variabili di istanza in modo diverso rispetto alle variabili locali è anche stupido, perché nessun programmatore è costretto a modificare il codice in Xcode e anche se lo fa, potrebbe avere uno schema di colori in cui istanza le variabili sono dello stesso colore di quelle locali.

L'accesso alle variabili di istanza tramite auto-> è perfettamente soddisfacente, ma si consideri anche un possibile utilizzare un prefisso/suffisso, che renderà ovvio anche quelle variabili di istanza ed evitare conflitti di denominazione con parametri di metodo o variabili locali.

1

L'obiettivo C aggiunge automaticamente un trattino di sottolineatura al nome di i-var, quindi quando si visualizza "_someVar" è implicitamente dell'ambito della classe. Il carattere di sottolineatura è abbastanza di un indicatore visivo per rendere chiaro il suo ambito senza aggiungere auto->.

+0

Sono d'accordo con te, che se vedi '_someVar' rilasciato in' dealloc' o impostato in un setter personalizzato, puoi essere ragionevolmente sicuro che si tratta di un ivar. Ma se vedessi 'someVar' in quei contesti, probabilmente penserei che fosse un ivar, solo uno che è stato definito manualmente o sintetizzato manualmente (con' @ synthesize'). In conclusione, è un po 'difficile dire che un "_" importante significa che è "implicitamente" un ivar. Il carattere di sottolineatura non è né necessario né condizione sufficiente. Ma hai ragione che la pratica migliore è usare le proprietà, lasciare che siano sintetizzati per te da ivars e avranno il trattino di sottolineatura principale. – Rob

Problemi correlati