iPhone,正在使用isKindOfClass以任何方式被认为是不好的做法?

时间:2011-02-06 11:42:32

标签: objective-c cocoa cocoa-touch

例如,如果有'handle all'类型方法......

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

这是不好的做法吗?是否有更简洁的替代方案或更好的方法来构建代码?

运行时,可读性,可维护性或任何东西都有缺点吗?

3 个答案:

答案 0 :(得分:7)

每当某些事物被视为好/坏的做法时,它或多或少都是主观的。在做某事本质上是正确/错误时,它或多或少是客观的。

isKindOfClass:是检查类继承的有用方法。它回答了唯一的问题,“是一个类的对象是(给定类的一个子类)?”。它没有回答任何其他问题,例如“这个对象以自己的方式实现该方法吗?”或“我可以将对象用于X或Y吗?”。如果按预期使用isKindOfClass:,则不会有任何问题。毕竟,在动态类型语言中,您应该有工具来提取有关对象的元信息。 isKindOfClass:只是可用工具之一。

某些物品可能对他们的课程撒谎的事实不应该真正让你失望。他们只是将自己伪装成另一个阶级的对象,而不会破坏任何东西。如果这不会破坏任何东西,我为什么要关心?

最重要的是,您应该始终记得使用正确的工具用于任何特定目的。例如,isKindOfClass:不能代替respondsToSelector:conformsToProtocol:

答案 1 :(得分:1)

排序。这个问题基本上涵盖了您的要求:Is it safe to use isKindOfClass: against an NSString instance to determine type?

您需要记住一些警告(请参阅上面的链接),但我个人认为这是一种相当可读的方法。你需要确保你在条件测试中所做的事情是合适的(Apple给出的例子是“一个对象可能它是一种NSMutableArray,但你可能不是能够改变它“)。

答案 2 :(得分:0)

我会考虑你给出的反模式的例子,所以是的,我会说这是有害的。使用isKindOf就是打败多态和面向对象。

我更希望你打电话:

[obj doTheThing];

然后在子类中以不同方式实现doTheThing。

如果obj可能属于您无法控制的类,请使用类别将doTheThing方法添加到它们。如果您需要默认行为,请在NSObject上添加一个类别。

在我看来,这是一个更清晰的解决方案,它有助于将逻辑(您正在做的)与实现细节(如何针对特定的不同类型的对象)分开。