2012-12-06 22 views
7

Ho una soluzione per un problema di notifica che funziona bene, ma temo che potrebbe essere una cattiva idea.Metodo di classe e metodo di istanza con lo stesso nome in Objective-C

Ho una notifica che deve essere gestita da ciascuna istanza di una classe e dalla classe stessa. Per gestirlo, mi sto registrando per una notifica sia dalla classe che dalle istanze della classe. Poiché è la stessa identica notifica, ho chiamato la classe e il metodo di istanza allo stesso modo. Questo segue lo standard che abbiamo impostato per il modo in cui i gestori di notifica sono nominati.

Questa è una cattiva idea? C'è qualche gotca nascosta che mi manca. Riuscirò a confondere il diavolo con i futuri sviluppatori?

+ (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 domanda. Non ho migliaia di punti, ma posso dire che i metodi di istanza e classe non entreranno in conflitto, poiché le loro necessità e la loro implementazione sono molto diverse. –

risposta

3

Questo è ciò che i commenti del codice sono per :)

Non c'è nessun problema in Objective C con un metodo di classe e metodo di istanza con lo stesso nome.

vorrei suggerire uno:

  • modifica la notifica nome del metodo specifica per gestire questa situazione (e quindi gestire la notifica di classe con un diverso metodo di nome appropriato), o

  • aggiungere adeguato commento a spiegare cosa sta accadendo a beneficio dei futuri sviluppatori potenzialmente confuse

+0

Penso che tu abbia ragione. I commenti saranno sufficienti per gli sviluppatori futuri per vedere il punto dei metodi istanza/classe. Grazie per il tuo contributo. –

1

il linguaggio stesso e il runtime se e nessuna ambiguità in quello che stai facendo. Quindi sei al sicuro su quel fronte.

In termini di confusione dei futuri manutentori, suppongo che non siate troppo preoccupati di errori di autocompletamento sciocchi perché non è un metodo con cui intendete effettuare chiamate manuali.

Detto questo, sarei tentato di spostare la roba di classe in una categoria artificiale. Ciò non solo darà una separazione sulla pagina, ma renderà esplicito che la classe intende rispondere come una frazione separata di funzionalità dalle risposte all'istanza.