Mi imbatto in uno scenario abbastanza comune in Objective-C dove passo una variabile ad un metodo init e poi voglio assegnarlo ad una variabile di istanza del stesso nome. Tuttavia non ho trovato un modo per definire le variabili per chiarire quale sia il valore dall'argomento del messaggio e quale sia la variabile di istanza.Buone pratiche per disambiguare i nomi degli argomenti rispetto ai nomi delle variabili di istanza in Objective-C
Dire che ho un po 'di classe come il seguente:
@interface MyObject
{
NSString *value;
}
- (id)initWithValue:(NSString *)value;
@end
Nella mia implementazione voglio che il mio metodo init a guardare qualcosa di simile:
- (id)initWithValue:(NSString *)value
{
self = [super init];
if(self) {
self.value = value; // This will not work with instance variables
}
}
So di tre soluzioni:
- Creare una proprietà, che consente di chiamare
self.value
- Rinominare la mia variabile di istanza, come ad esempio
_value
- Rinominare la mia variabile argomento init, come ad esempio
initValue
oargValue
Io non sono soddisfatto di una qualsiasi di queste soluzioni. L'aggiunta di una proprietà rende la proprietà pubblicamente disponibile sull'interfaccia oppure, se si utilizza un'estensione, la si nasconde dagli ereditari. Inoltre non mi piace avere nomi diversi per le variabili o usare un trattino basso, che forse deriva dallo sviluppo in altri linguaggi come Java e C#.
C'è un modo per disambiguare le variabili di istanza dagli argomenti dei messaggi? In caso contrario, c'è una linea guida di codifica in Cocoa su come risolvere questo problema? Mi piace seguire le linee guida di stile quando appropriato.
Aggiornamento
Dopo pensando a come fare questo in C, mi si avvicinò con la soluzione di self->value
. Funziona, ma genera un avvertimento del compilatore che la dichiarazione locale di 'valore' nasconde la variabile di istanza. Quindi questa soluzione non è soddisfacente visto che ho un obiettivo di avvertimento zero.
Io uso 'crunkIn' perché altrimenti non si ottiene il completamento automatico. –
@Josh Caswell, per coerenza è la convenzione di utilizzare il prefisso che si sceglie (nuovo, a, a) in tutti i casi, anche se non lo si assegna? Forse è semplicemente passato in un altro messaggio, come ad esempio '[super setCrunk:]' –
@DavidV: Direi di lasciare il prefisso disattivato a meno che non sia necessario disambiguare con un ivar, ma non posso fingere che sia qualcosa di diverso da la mia preferenza. –