iPhone, использование isKindOfClass считается плохой практикой в ​​любом случае? - PullRequest
6 голосов
/ 06 февраля 2011

Например, если есть метод типа handle all ...

if ([obj isKindOfClass:class1]) {
    // ...
} else if ([obj isKindOfClass:class2]) {
    // etc..

Это плохая практика? Есть ли более аккуратная альтернатива или лучший способ структурировать код?

Есть ли недостатки в жизненном цикле, удобочитаемости, удобстве обслуживания или чем-то еще?

Ответы [ 3 ]

7 голосов
/ 06 февраля 2011

Всякий раз, когда считается хорошей / плохой практикой, это более или менее субъективно.Когда что-то делает изначально правильно / неправильно, это более или менее объективно.

isKindOfClass: - это полезный метод проверки наследования классов.Он отвечает на единственный вопрос: «Является ли объект класса (подкласс) данного класса?».Он не отвечает ни на какие другие вопросы, такие как «этот объект реализует этот метод по-своему?»или «я могу использовать объект для X или Y?».Если вы используете isKindOfClass: по назначению, у вас не возникнет никаких проблем.В конце концов, в динамическом типизированном языке у вас должны быть инструменты для извлечения метаинформации об объектах.isKindOfClass: - это только один из доступных инструментов.

Тот факт, что некоторые объекты могут лгать о своем классе, не должен вас отталкивать.Они просто маскируются под объекты другого класса, ничего не нарушая.И если это ничего не нарушает, почему я должен беспокоиться?

Главное, что вы всегда должны помнить, использовать правильный инструмент для любой цели.Например, isKindOfClass: не заменяет respondsToSelector: или conformsToProtocol:.

1 голос
/ 06 февраля 2011

Вроде.Этот вопрос в основном охватывает то, что вы спрашиваете: Безопасно ли использовать isKindOfClass: против экземпляра NSString для определения типа?

Есть некоторые предостережения, которые необходимо учитывать (см. Ссылкувыше), но лично я думаю, что это довольно читаемый метод.Вам просто нужно убедиться, что то, что вы делаете внутри своего условного теста, является подходящим (пример, который Apple приводит в духе «объект может сказать , это своего рода NSMutableArray, но вы не сможетемутировать его ").

0 голосов
/ 07 августа 2014

Я бы посчитал приведенный вами пример антипаттерном, так что да, я бы сказал, что это вредно. Подобное использование isKindOf побеждает полиморфизм и ориентацию объекта.

Я бы предпочел, чтобы вы звонили:

[obj doTheThing];

, а затем по-разному реализуйте doTheThing в ваших подклассах.

Если obj может принадлежать классам, которые вы не можете контролировать, используйте категории, чтобы добавить к ним ваш метод doTheThing. Если вам нужно поведение по умолчанию, добавьте категорию в NSObject.

На мой взгляд, это более чистое решение, и оно помогает отделить логику (что вы делаете) от деталей реализации (как это сделать для конкретных типов объектов).

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