Используется ли RespondsToSelector: хороший стиль? - PullRequest
3 голосов
/ 03 октября 2010

Является ли "лучшим стилем" отправка сообщения и надежда, что объект отвечает, или проверка того, отвечает ли он на селектор и имеет ли какой-то запасной вариант, если он этого не делает.

Например,:

- (NSString *)stringForObjectValue:(id)obj {
    if ([obj respondsToSelector:@selector(intValue)]) {
        NSString *roman = [self formatRomanNumber:[obj intValue] resultSoFar:@""];
        return roman;
    } else {
        return [NSString stringWithFormat:@"can't format a %@", [obj class]];
    }
}

против

- (NSString *)stringForObjectValue:(id)obj {
    NSString *roman = format_roman(@"", [obj intValue]);
    return roman;
}

(пример взят из подкласса NSNumberFormatter ... но он может быть из подкласса NSObjectFormatter ...)

Ответы [ 2 ]

2 голосов
/ 03 октября 2010

Если вы не уверены на 100%, что все экземпляры, которые приходят к вашей функции (stringForObjectValue), отвечают на селектор, то вы должны выполнить эту проверку, чтобы избежать сбоев во время выполнения.

Как обрабатывать случаи, когда obj не отвечает на селектор intValue, может зависеть от конкретного контекста, в котором используется ваш метод. Например, в этом случае вы можете вернуть nil-объект из метода, чтобы вы могли легко увидеть, что что-то пошло не так

1 голос
/ 03 октября 2010

Если вы не знаете точный тип, тогда использование respondsToSelector: определенно хороший стиль, потому что в противном случае вы рискуете сделать исключение.И так важно, что для этой техники есть название: Duck Typing .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...