5

我已经开始使用 Xcode 的重构功能(编辑 > 重构 > 提取),并注意到 Xcode 提供了提取方法或函数的功能

我已经在这里其他地方阅读过两者之间的差异,并了解方法连接到类,而函数没有。所以我不是在寻找定义,拜托。

假设不涉及任何参数,什么时候使用一个而不是另一个合适?我知道,如果某些东西与类无关,那么它可能是一个函数,但同样,这只是定义。我正在寻找好的用例。

就我个人而言,我正在尝试从 AppDelegate 的applicationDidEnterBackground. 由于它是进入后台时唯一处理事件的地方,因此清理代码的唯一方法是将子例程提取到......好吧,函数。但是它们会在 AppDelegate.m 中,所以它们不是方法吗?

嗯..

4

4 回答 4

9

就个人而言,仅当且仅当满足以下两个要求时,我才使用函数:

  1. 我在给定的课程中或在整个项目中如此频繁地使用它,以至于它需要被推广。
  2. 它没有副作用或上下文依赖性(没有那种void *context混乱)。

在我看来,C 风格的函数应该只作为最后的手段,或者在你真正需要在这种应用程序中使用函数行为的情况下使用。事件处理既是特定于应用程序的,也是上下文敏感的,所以最好不要管它,专注于重构常见的模式。

于 2013-06-01T03:18:32.250 回答
3

当你有一个函数时,你会使用函数;-) 你知道定义:一个方法有一个隐式参数self,并且可以使用它访问实例变量;一个函数没有隐含的参数——它需要的所有东西都必须传入。

如果您正在重构较大方法的一部分,该部分不会访问实例变量,并且您没有重构它以便子类可以覆盖它,那么让 Xcode 为您构建一个函数。完成后添加static到它,因此它是类私有的。

在这样做的过程中,您什么都没有丢失,并且清楚地表明这段代码是一个函数——它不会改变对象的状态。

选择函数和方法之间当然没有硬性界限,它是一个模糊的边界。例如,如果一段代码只访问一个或两个实例变量但不更新它们,那么您可能会选择一个函数 - 再次明确对象状态没有被修改。但是您不想将大量实例变量作为参数传递,这很难阅读(而且效率低下)。

使用函数可能很好,在 Objective-C 中这样做当然也不错。

于 2013-06-01T06:48:53.417 回答
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;
    }
    
于 2013-06-01T07:25:03.953 回答
2

一个类的方法通常需要访问连接到该类的实例变量。Objective-C 中的函数不连接到类,因此无法访问类的任何非公共成员变量。

考虑包含成员变量 _memberVar 的类 KNode。

@interface KNode : NSObject {
    int _memberVar;
}

@end

此类的任何方法都可以访问和更改成员变量,但任何旧函数都不能,因为它是私有的。

@implementation KNode

- (void)modify {
    _memberVar = 10;
}

@end

以下功能将不起作用

void modify(KNode * node) {
    _memberVar = 10;
}
于 2013-06-01T03:20:14.297 回答