Występuje dość powszechny scenariusz w Objective-C, w którym przekazuję zmienną do metody init, a następnie chcę przypisać ją do zmiennej instancji Takie samo imię. Jednak nie znalazłem sposób na zakres zmiennych, aby wyjaśnić, która jest wartość z argumentu komunikatu i która jest zmienną instancji.Dobra praktyka do ujednoznaczniania nazw argumentów a nazw instancji w Objective-C
Say mam jakąś klasę, takie jak:
@interface MyObject
{
NSString *value;
}
- (id)initWithValue:(NSString *)value;
@end
W moim realizacji chcę moja metoda init wyglądać następująco:
- (id)initWithValue:(NSString *)value
{
self = [super init];
if(self) {
self.value = value; // This will not work with instance variables
}
}
wiem z trzech rozwiązań:
- Utwórz nieruchomość, która umożliwia dzwonienie pod numer
self.value
- zmienić nazwę mojego zmiennej instancji, takich jak
_value
- zmienić nazwę mojego zmiennej argumentów startowych, takich jak
initValue
lubargValue
nie jestem zadowolony z żadnego z tych rozwiązań. Dodanie właściwości powoduje, że usługa jest publicznie dostępna w interfejsie lub, jeśli używam rozszerzenia, ukrywa je przed spadkobiercami. Nie lubię też mieć różnych nazw zmiennych lub używać podkreślenia, które być może pochodzi od rozwijania w innych językach, takich jak Java i C#.
Czy istnieje sposób na wyodrębnienie zmiennych instancji z argumentów wiadomości? Jeśli nie, czy w Cocoa istnieje wytyczna dotycząca kodowania, aby rozwiązać ten problem? W razie potrzeby podążam za wytycznymi stylu.
Aktualizacja
Po myślenia o tym, jak to zrobić w C, wpadłem z rozwiązaniem self->value
. Działa to, ale generuje ostrzeżenie kompilatora, że lokalna deklaracja "value" ukrywa zmienną instancji. To nie jest zadowalające rozwiązanie, ponieważ mam cel z ostrzeżeniem.
Używam 'crunkIn', ponieważ w przeciwnym razie nie otrzymasz autouzupełniania. –
@ Jos Caswell, ponieważ spójność jest konwencją do użycia dowolnego wybieranego prefiksu (nowego, a, a) we wszystkich przypadkach - nawet jeśli go nie przypisujesz? Być może jest to po prostu przekazane do innej wiadomości, na przykład '[super setCrunk:]' –
@DavidV: Powiedziałbym, zostaw prefiks wyłączony, chyba że konieczne jest ujednoznacznienie z ivar, ale nie mogę udawać, że jest coś innego niż moja preferencja. –