3

如果我正在实现一个函数,该函数基于某些输入进行一些计算并返回输出而不会造成任何副作用。

我总是使用常规 C 函数而不是在类中使用静态方法。

将静态方法强行放入类中是否有理由?

我不是在谈论创建单例或工厂方法的方法,而是像那里的常规方法:

而不是这样的:

+(NSString *)generateStringFromPrefixString:(NSString *)prefixString word:(NSString *)word;

这不是更好吗?

NSString *generateString(NSString *prefixString, NSString *word);

在效率方面,我们不会节省,查找选择器以获取函数指针吗?

4

4 回答 4

3

Objective-C 没有“静态方法”之类的东西。它有类方法。这不仅仅是挑剔,因为类方法是动态调度的,而不是静态调度的。这可能是使用类方法而不是函数的一个原因:它允许子类覆盖它。

相比之下,这也可能是使用函数而不是类方法的原因——以防止它被覆盖。

但是,一般来说,没有规定必须使用类方法。如果函数适合您的需要和偏好,请使用函数。

于 2013-07-20T10:42:07.553 回答
2

一个重要因素是可测试性。您的 c 函数是否特别需要测试?(当然,一切都必须经过理想的测试,但有时你可以通过调用它来测试一个东西)。如果需要,您可以单独访问这些功能吗?也许您需要模拟它们来测试其他功能?

截至 2013 年,如果您生活在 Apple/Xcode/iOS/MacOS 世界中,那么您更有可能在 objc 中拥有比普通 c 更多的内置工具来测试事物。我想说的是:模拟 c 函数更难

我非常喜欢 C 函数。起初我不喜欢它们出现在我好看的 objc 代码中。过了一会儿,我觉得这没什么大不了的。真正重要的是上下文。我的观点是(与 PLPiper 在 NSObjcRuntime.h 上的观点相同)有时,通过其名称或功能判断,函数不属于任何类。所以没有语义上的理由让它们成为类方法。当我开始为包含几个内联c 函数的代码编写测试时,所有这些模棱两可的事情都消失了。现在,如果我需要对某些 ​​c 函数进行专门测试、模拟等。我知道在 objc 中更容易做到。有更多/更容易的内置工具来测试 c.objc 的东西。

对于感兴趣的人:C 中的函数模拟(用于测试)?

于 2013-07-20T13:10:19.370 回答
2

我不认为这是一个糟糕的设计,不,但在某些情况下,一种可能被认为比另一种更合适。关键问题是:

  • 这个方法属于一个类吗?
  • 这种方法值得添加到类中吗?

类是自包含和可重用的东西。对于您示例中的方法,我很想回答“是的,它确实/是”,因为它是特定于NSString并且是您(大概)想要经常使用的方法。它的参数也是 type NSString。因此,我会在类扩展中使用消息表单,并#import在需要时使用扩展。

有两种情况(在我的脑海中)这是不合适的。首先是该方法专门与“主类”之外的其他实体交互的情况。这方面的例子可以在 AppleNSObjcRuntime.h文件的底部附近找到。这些都是标准的 C 函数。它们并不真正属于特定的类别。

使用标准 C 函数的第二种情况是在非常特定的情况下只使用一次(或很少次)。UIApplicationMain是一个完美的例子,特定UIView子类方法的辅助方法-drawRect:也浮现在脑海中。

关于效率的最后一点。是的,选择器查找比标准 C 调用要慢一些。但是,运行时(至少 Apple 不能对 GCC 发表评论)确实使用了缓存系统,因此最常发送的消息会很快被吸引到选择器表的“顶部”。

免责声明:这在某种程度上是一种风格问题,上述建议是我这样做的方式,因为我认为它使代码更有条理和可读性。我确信还有其他同样有效的方法来构造/交错 C 和 Objective-C 代码。

于 2013-07-20T10:09:22.803 回答
0

为了一致性和程序员的期望,我会说使用Objective C风格。我不喜欢混合调用符号和函数符号,但你的里程可能会有所不同。

于 2013-07-20T12:09:38.533 回答