2012-12-06 25 views
7

Mam rozwiązanie problemu z powiadomieniem, który działa dobrze, ale obawiam się, że może to być zły pomysł.Metoda klasy i metoda instancji o tej samej nazwie w Objective-C

Mam powiadomienie, które musi być obsługiwane przez każde wystąpienie klasy i przez samą klasę. Aby sobie z tym poradzić, rejestruję się w powiadomieniu zarówno przez klasę, jak i instancje klasy. Ponieważ jest to dokładnie to samo powiadomienie, nazwa klasy i metoda instancji są takie same. Jest to zgodne ze standardem, który ustaliliśmy dla nazw procedur obsługi powiadomień.

Czy to zły pomysł? Czy jest jakaś ukryta got'ca, której mi brakuje. Czy pomylę się z przyszłymi deweloperami?

+ (void)initialize 
{ 
    if (self == [SICOHTTPClient class]) { 
     [[self notificationCenter] addObserver:self 
             selector:@selector(authorizationDidChangeNotification:) 
              name:SICOJSONRequestOperationAuthorizationDidChangeNotification 
             object:nil]; 
    } 
} 

- (id)initWithBaseURL:(NSURL *)url 
{ 
    self = [super initWithBaseURL:url]; 

    if (self) { 
     self.parameterEncoding = AFJSONParameterEncoding; 
     [self registerHTTPOperationClass:[SICOJSONRequestOperation class]]; 
     [self setDefaultHeader:@"Accept" value:@"application/json"]; 

     if ([[self class] defaultAuthorization]) 
      [self setDefaultHeader:@"Authorization" value:[[self class] defaultAuthorization]]; 

     [[[self class] notificationCenter] addObserver:self 
               selector:@selector(authorizationDidChangeNotification:) 
                name:SICOJSONRequestOperationAuthorizationDidChangeNotification 
               object:nil]; 
    } 

    return self; 
} 

- (void)dealloc 
{ 
    [[[self class] notificationCenter] removeObserver:self 
               name:SICOJSONRequestOperationAuthorizationDidChangeNotification 
               object:nil]; 
} 

#pragma mark Notifications 

- (void)authorizationDidChangeNotification:(NSNotification *)notification 
{ 
    NSString *authorization = notification.userInfo[SICOJSONRequestOperationAuthorizationKey]; 

    if ([authorization isKindOfClass:[NSString class]]) { 
     [self setDefaultHeader:@"Authorization" value:authorization]; 
    } else { 
     [self clearAuthorizationHeader]; 
    } 
} 

+ (void)authorizationDidChangeNotification:(NSNotification *)notification 
{ 
    NSString *authorization = notification.userInfo[SICOJSONRequestOperationAuthorizationKey]; 

    if ([authorization isKindOfClass:[NSString class]]) { 
     [self setDefaultAuthorization:authorization]; 
    } else { 
     [self setDefaultAuthorization:nil]; 
    } 
} 
+1

Super pytanie. Nie mam tysiąca punktów, ale mogę powiedzieć, że metody instancji i klasy nie będą sprzeczne, ponieważ ich potrzeby i implementacja są bardzo różne. –

Odpowiedz

3

To właśnie komentarze są dla kodu :)

Nie ma żadnego problemu w Objective C z metody klasy i metody instancji o tej samej nazwie.

Sugerowałbym albo:

  • zmienić swoje zgłoszenia nazwa metody specyfikację obsłużyć to (a następnie obsługiwać zgłoszenie klasy z innej metody odpowiednio nazwie) lub

  • dodać odpowiedni komentarz wyjaśnić, co dzieje się na rzecz przyszłości potencjalnie mylić deweloperom

+0

Myślę, że masz rację. Komentarze będą wystarczająco dobre dla przyszłych programistów, aby zobaczyć punkt metod instancji/klasy. Dzięki za wkład. –

1

sam język i środowisko uruchomieniowe se e nie ma dwuznaczności w tym, co robisz. Więc jesteś bezpieczny na tym froncie.

Jeśli chodzi o mylących przyszłych opiekunów, to myślę, że nie musisz się zbytnio przejmować głupimi błędami autouzupełniania, ponieważ nie jest to metoda, z którą chcesz wykonywać połączenia ręczne.

Powiedziałbym, że będę kuszony, aby przenieść klasy rzeczy do sztucznej kategorii. To nie tylko zapewni separację na stronie, ale wyraźnie zaznaczy, że klasa zamierza odpowiedzieć jako osobna transza funkcjonalności z odpowiedzi instancji.