就良好的Objective-C编码实践而言,如果我创建一个没有状态的函数,将它编写为某个类的静态方法还是作为C函数更好?
例如,我有一个特殊的文件路径检索方法,它在继续进入主NSBundle之前检查Caches目录。我目前在一个空的Utils类下将它作为静态方法。这应该是C函数吗?
我选择使用静态方法(暂时)的原因是:a)它与Objective-C语法一致,b)该类有助于对方法进行分类。但是,我觉得我有点作弊,因为我可以轻松地用这些无状态静态方法填充我的Util类,最后得到一个丑陋的“shell类”,其唯一的目的就是持有它们。
你使用什么约定?通过一些客观指标,一个比另一个“更好”吗?谢谢!
答案 0 :(得分:2)
如果你能想到一个现有的类,这可能是一个很好的方法,你可以通过制作一个Objective-C类来注入你的方法。这保留了使用静态方法的两个原因,同时不使用额外的类来污染类空间。
例如:
@interface NSString (MyStringCategories)
- (NSString*) myCoolMethod;
@end
// [StringCategories.m]
#import "StringCategories.h"
@implementation NSString (MyStringCategories)
- (NSString*) myCoolMethod {
// do cool stuff here
return whateverYouLike;
}
@end
现在您可以将myCoolMethod
发送到任何字符串。酷!
在您的特定情况下,听起来像NSBundle上的方法可能是一个合适的架构。不要忘记,它可以是一个类方法,因此您无需实例化任何内容即可调用您的方法。
答案 1 :(得分:1)
这是一个非常难以回答的问题,因为很多人的答案取决于他们的个人喜好和口味。我个人认为,如果你有一个函数是一个函数,即它与一个对象无关,它没有内部状态等。请让它成为一个函数,不要试图将你可能包含的所有东西都包括在内。一个对象只是因为你正在使用OO语言,你可以。
为了保持我的答案简短,让我参考一本(imo)相当不错的书:
http://www.gotw.ca/publications/c++cs.htm
我知道这是针对C ++的,但是有很多见解可以与其他语言共享(特别是Objective-C和Objective-C ++),尤其是来自“类设计和继承”的部分。在那里,你会发现一个项目,“首选写非会员非友好功能”。
结论:“通过最小化依赖关系,非成员非友好函数改善封装[...]他们也分解了整体类[...] [和]提高了通用性[...]”。
我认为该项目有一些道理。
答案 2 :(得分:1)
如果没有类可以清楚地绑定它,那么我使用一个函数。我还使用这些实用程序位的函数,因为如果不使用或引用它们就可以被剥离。在这方面,使用函数也很有帮助,因为链接错误优于运行时错误(甚至.m在构建中意外省略,或者从另一个外部更新的方法引用)。 ObjC符号的一个问题是它们不会被剥离,因此它们自然会带来大量依赖 - 所有objc方法和类以及所需的类别方法必须存在于最终二进制文件中。对于非常小的程序或库来说,这不是一个问题,但它很快就会受到中/大型系统和库的影响。
所有内容都不需要在@interface
中声明 - 尤其是在较大的系统中,所有这些声明都会将您的相互依赖性转化为意大利面。与方法相比,函数更快,更小,可以通过编译器或链接期间更好地优化,如果没有引用,可能会被剥离。
如果你需要多态性,它只是属于一个组织或方便的类,那么类或实例方法通常是更好的选择。
出于同样的原因,我也最小化了声明类别方法。当您使用函数时,您可以轻松地在需要的地方编写包装器方法,并充分利用这两种方法。