Метод класса и метод экземпляра с тем же именем в Objective-C

У меня есть решение проблемы с уведомлением, которое работает хорошо, но, боюсь, это может быть плохой идеей.

У меня есть уведомление, которое должно обрабатываться каждым экземпляром класса и самим классом. Чтобы справиться с этим, я регистрируюсь для получения уведомления как от класса, так и от экземпляров класса. Поскольку это одно и то же уведомление, я назвал класс и метод экземпляра одинаковыми. Это соответствует стандарту, который мы установили для имен обработчиков уведомлений.

Это плохая идея? Есть ли какая-то скрытая хитрость, которую я упускаю. Буду ли я сбивать с толку будущих разработчиков?

+ (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];
    }
}

person Jeffery Thomas    schedule 06.12.2012    source источник
comment
Супер вопрос. У меня нет тысячи точек, но я могу сказать, что методы экземпляра и класса не будут конфликтовать, так как их потребность и реализация очень разные.   -  person Anoop Vaidya    schedule 06.12.2012


Ответы (2)


Для этого и нужны комментарии к коду :)

В Objective C нет проблем с методом класса и методом экземпляра, имеющими одно и то же имя.

Я бы предложил либо:

  • изменить спецификацию имени метода уведомления, чтобы обработать это (а затем обработать уведомление класса с помощью другого метода с соответствующим именем), или

  • добавьте соответствующий комментарий, чтобы объяснить, что происходит, для будущих потенциально запутанных разработчиков

person occulus    schedule 06.12.2012
comment
Я думаю ты прав. Комментарии будут достаточно хороши для будущих разработчиков, чтобы увидеть смысл методов экземпляра/класса. Спасибо за ваш вклад. - person Jeffery Thomas; 07.12.2012

Сам язык и среда выполнения не увидят двусмысленности в том, что вы делаете. Так что вы в безопасности на этом фронте.

С точки зрения путаницы будущих сопровождающих, я думаю, вам не нужно слишком беспокоиться о глупых ошибках автозаполнения, потому что это не тот метод, к которому вы собираетесь делать вызовы вручную.

Тем не менее, у меня возникло бы искушение переместить классовые вещи в искусственную категорию. Это не только даст разделение на странице, но и сделает явным то, что класс намеревается ответить как отдельный транш функциональности от ответов экземпляра.

person Tommy    schedule 06.12.2012