2012-01-05 8 views
5

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ń:

  1. Utwórz nieruchomość, która umożliwia dzwonienie pod numer self.value
  2. zmienić nazwę mojego zmiennej instancji, takich jak _value
  3. zmienić nazwę mojego zmiennej argumentów startowych, takich jak initValue lub argValue

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.

Odpowiedz

4

Dla ustawiaczy (i przez inicjalizatorów rozszerzenia), uważam, że konwencja ma poprzedzić nazwę parametru z new:

- (void)setCrunk:(Crunk *)newCrunk; 
- (id)initWithCrunk:(Crunk *)newCrunk; 

Ogólnie myślę, że najbardziej rozpowszechnioną formą Widziałem to nazwać parametr theCrunk, ale Apple seems to recommendaCrunk.

+0

Używam 'crunkIn', ponieważ w przeciwnym razie nie otrzymasz autouzupełniania. –

+0

@ 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:]' –

+0

@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. –

2

Jeśli użyjesz tylko 1, kompilator da ci ostrzeżenie.

Można łączyć 1 & 2 przy użyciu:

@synthesize value = _value; 

Jeśli chcesz ukryć swoją zmienną od spadkobierców może zadeklarować pusty nazwie kategorię i zadeklarować swoją właściwość istnieje.

Dla 3 można użyć aValue do argumentacji.

+1

Gdzieś (nie pamiętam) napisane jest, że nie powinno się używać '_' jako przedrostka. Robi to tylko Apple. Powinieneś używać go jako sufiksu, który Google poleca gdzieś (czego również nie pamiętam). Więc 'value = value_' ... sprawdź http://www.kevincallahan.org/software/accessorizer.html, a także AppCode, jeśli poważnie myślisz o używaniu tego rozwiązania. –

+0

Nie zgadzam się, to tylko konwencja stylu. –

+0

Nie zgadzasz się z tym, że Apple zaleca stosowanie podkreślnika jako przedrostka? –

3

A zmiana nazwy na "inValue" nie jest dobrym pomysłem?To, co masz tutaj - twoje "rozwiązanie" jest skomplikowane, szczególnie z akcesoriami, itp. Obj-C 2. Ponieważ self.value i inValue są różnymi rzeczami, potrzebują różnych nazw.

Zauważ, że możesz użyć

-(void)method1:(NSString*)value; 

w nagłówku

i

-(void)method1:(NSString*)inValue; 

w pliku .m.

+0

Zauważyłem, że możesz mieć różne nazwy argumentów w interfejsie i implementacji. Moim celem jest zachowanie spójności, aby programiści nie musieli myśleć o tym, jaka nazwa jest używana. Czy używałeś konwencji różnych nazw w interfejsie i implementacji? Jak to się udało dla twojego zespołu? –

+0

@DavidV jest to problem, który nie jest związany z interfejsem, tylko z implementacją. Punkt Toma jest w 100% ważny. –

+0

@Jar, nie chcę powiedzieć, że punkt Toma jest nieważny. Rozumiem, że interfejs pozostanie niezmienny, a programista pracujący w klasie będzie miał spójny schemat nazewnictwa dla ivars. Po prostu jest to rozwiązanie, którego początkowo nie rozważałem, dopóki nie przeczytam postu Toma, a teraz rozważam to. Cenię spójność w interfejsach wyższych niż spójność w implementacji, ale nadal lubię tę drugą. –

Powiązane problemy