How*_*ard 17 iphone objective-c ios
现在似乎很多Objective-C代码都在使用Singleton.
虽然有很多人抱怨Singleton,例如谷歌(Where Have All the Singletons Gone?),他们的同事也会使用它:http://code.google.com/mobile/analytics/docs/iphone/
我知道我们已经在Stack Overflow中得到了一些答案,但它们并不完全特定于Objective-C作为动态语言:Objective C有类别,而许多其他语言没有.
那你的意见是什么?你还在使用辛格尔顿吗?如果是这样,你如何使你的应用程序更可测试?
更新:我认为我们需要使用代码作为更具体的讨论的例子,所以关于SO的讨论是基于理论而没有一行代码
我们以Google Analytics iOS SDK为例:
// Initialization
[[GANTracker sharedTracker] startTrackerWithAccountID:@"UA-0000000-1"
dispatchPeriod:kGANDispatchPeriodSec
delegate:nil];
// Track page view
[[GANTracker sharedTracker] trackPageview:@"/app_entry_point"
withError:&error];
Run Code Online (Sandbox Code Playgroud)
上面代码的优点是,一旦使用方法" startTrackerWithAccountID " 初始化,您可以在整个应用程序中运行方法" trackPageview ",而无需通过配置.
如果你认为Singleton不好,你能改进上面的代码吗?
非常感谢您的投入,祝周五愉快.
Dan*_*Ray 33
这篇文章很可能是down down,,但我真的不明白为什么单身人士没有爱情.它们完全有效,你只需要了解它们有用的东西.
在iOS开发中,您只有一个当前应用程序实例.你只是一个应用程序,对吧?你不是两个或零申请,是吗?因此,该框架为您提供了一个UIApplication单例,通过它可以获得应用程序级的操作系统和框架功能.它适当地模拟一些东西,使其成为一个单身人士.
如果你有可以而且应该只有一个数据字段的数据字段,并且你需要从应用程序中的所有地方获取它们,那么将它作为单例进行建模也完全没有错.将单例创建为全局变量桶可能是对模式的误用,我认为这可能是大多数人反对它们的原因.但是,如果你正在对具有"单一性"的东西进行建模,那么单身就可能成为可能.
一些开发人员似乎对单身人士有一种根本的厌恶,但是当他们真正被问到为什么时,他们会忽略全局,命名空间和美学.我想我能理解,如果你真的一劳永逸地解决了Singletons的反模式,并且在所有情况下都会被憎恶.但那时你再也没想过了.框架设计不同意你的看法.
Ter*_*cox 33
我想大多数开发人员都会经历单身人士阶段,在那里你可以轻松获得所需的一切,在一群精彩的单身人士中.
然后你会发现使用Singletons进行单元测试可能很困难.您实际上并不想连接到数据库,但您的Singleton确实如此.添加一层重定向并模拟它.
然后你发现单元测试不是你需要不同行为的唯一时间.您可以根据参数使Singleton可配置为具有不同的行为.你开始怀疑是否需要将它分成两个单身人士.然后你的代码需要知道要使用哪个Singleton,所以你需要一个知道要使用哪个Singleton的Singleton.
然后其他一些代码开始弄乱你的Singleton中的值,而你正在使用它.他们怎么敢!如果你想让任何人从任何地方获得这些价值,你就会让它们全球化......
一旦你达到这一点,你就会开始怀疑Singletons是否是正确的解决方案.您开始看到全局数据的危险性,特别是在OO设计中,您只是假设您的数据不会受到其他人的攻击.
所以你回去开始传递数据,而不是查找它(这曾经被称为好的OO设计,但现在它有一个像"依赖注入"这样的花哨名称).
最终你会发现单身人士适度.你学习识别单身人士何时需要停止单身.
因此,您可以获得UIApplication和NSUserDefaults等共享对象.这些是单身人士的好用途.
十年前,我在Java Singleton热潮中被烧得足够多了.我甚至不考虑写自己的单身人士.我在最近的内存中唯一需要类似的东西是想要缓存[NSCalendar currentCalendar]的结果(需要很长时间).我在NSCalendar上创建了一个类别,并将其作为静态变量缓存.我觉得有点脏,但替代方案是痛苦的慢代码.
总结和为那些tl;博士:
单身人士是一种工具.它们不太可能是正确的工具,但你必须自己发现它.
| 归档时间: |
|
| 查看次数: |
5138 次 |
| 最近记录: |