我已经开始使用Xcode的重构功能(编辑&gt;重构&gt;提取),并注意到Xcode提供了方法或功能< /强>
我已阅读here和elsewhere关于两者之间的差异,并了解方法与函数不是。所以我不是在寻找定义。
假设不涉及任何参数,何时使用一个而不是另一个?我明白,如果某些事情不是关于这个类,那么它可能是一个函数,但同样,这只是定义。我正在寻找好的用例。
在我个人的情况下,我试图从AppDelegate的applicationDidEnterBackground
中重构一些代码。由于它是进入后台处理事件的唯一场所,清理代码的唯一方法是将子程序提取到..井,函数中。但他们会在AppDelegate.m中,所以他们不是方法吗?
嗯..
答案 0 :(得分:9)
就个人而言,我只在满足以下两个要求时才使用函数:
void *context
混乱)。在我看来,C风格的功能只应作为最后的手段使用,或者在您真正需要此类应用程序中的功能行为的情况下使用。事件处理既是特定于应用程序的,也是上下文敏感的,所以最好不要单独留下并专注于重构常见模式。
答案 1 :(得分:3)
当你有一个函数时使用函数;-)你知道定义:一个方法有一个隐式参数self
并且可以使用它来访问实例变量;函数没有隐式参数 - 必须传递它所需的一切。
如果要重构更大方法的 part ,那么该部分不会访问实例变量,并且您不重构它以便子类可以覆盖它,然后让Xcode为您构建一个函数。完成后,将static
添加到该类中,使其成为该类的私有。
在执行此操作时,您没有丢失任何内容,并明确表示该代码是函数 - 它不会改变对象的状态。
选择函数和方法之间当然没有强硬路线,它是模糊边界。例如,如果一段代码只访问一个或两个实例变量但不更新它们,那么您可以选择一个函数 - 再次明确表示对象状态未被修改。但是你不希望在参数中传递大量的实例变量,这很难阅读(而且效率低下)。
使用函数可能很好,而且在Objective-C中这样做肯定也不错。
答案 2 :(得分:2)
类的方法通常需要访问连接到该类的实例变量。 Objective-C中的函数没有连接到类,因此无法访问类的任何非公共成员变量。
考虑类KNode,它包含成员变量_memberVar。
@interface KNode : NSObject {
int _memberVar;
}
@end
此类的任何方法都可以访问和更改成员变量,但任何旧函数都不能,因为它是私有的。
@implementation KNode
- (void)modify {
_memberVar = 10;
}
@end
以下功能无效
void modify(KNode * node) {
_memberVar = 10;
}
答案 3 :(得分:2)
功能的两个小但有意义的优点:
static
来内部化,或者
__attribute__((visibility("hidden")))
,这对框架开发人员很有帮助可以内联它们。例如,我使用此模式来创建快速延迟队列:
static inline dispatch_queue_t sharedQueue() {
static dispatch_queue_t queue;
static dispatch_once_t once;
dispatch_once(&once, ^{
queue = dispatch_queue_create("foo", 0);
});
return queue;
}