【问题标题】:singletons in cocoa, are they evil?可可中的单身人士,他们是邪恶的吗?
【发布时间】:2012-11-09 10:26:31
【问题描述】:

我在这个网站上看到了很多“单身人士是邪恶的”。 这几乎让我相信单身人士是病态的骗子。 但, 如果是真的,为什么可可中有这么多单例?像 shareApplication、shareManager 等等。 我想知道如果我不使用单例模式,我怎么能做同样的事情。例如,确保只有一个实例并在我需要时访问它。

所以我会怀疑这句话,直到我想出更好的方法。

请帮助我。谢谢

【问题讨论】:

标签: objective-c cocoa oop design-patterns singleton


【解决方案1】:

没有一个特征或模式本质上是邪恶的。甚至goto 也有它的用途,有时可以提高可读性。 “单例是邪恶的”源于许多新手开发者容易误用它们的事实。所以这是常识,有时常识并不是最好的解决方案。

在您的示例中,shared... 在技术上并不是单例。您可以同时创建数千个UIApplication 或NSFileManager 实例。它们更像是服务定位器(“查找我的应用程序”、“查找我的默认文件管理器”)。这些方法为我们提供了一些有用的共享值,我们需要 99% 的时间。虽然这会使单元测试变得更加困难,但这样做的好处是值得的。

【讨论】:

  • 非常感谢,我同意你的观点,这些方法非常方便,我宁愿忽略它们造成的问题。但是,这让我想到了全局变量,我以前认为它们很方便,然而,结果却是误解。现在你的回答增加了我的困惑。这是否意味着,nothings 是邪恶的,甚至像全局变量或 goto 一样。看来我的大学导师教的完全错误......(他只是告诉我单身是邪恶的......)
  • @lancy 好吧,我不知道你的导师是不是错了,因为我不知道他们说这句话的确切背景。至于邪恶的程度——就像演讲或文学一样。 F字是“邪恶的”。如果您经常使用 f 字词说话,那么您的语言质量就会降低 - 人们无法判断您是想说些什么还是只是咒骂。但在某些情况下,这样的词可以帮助你完成任务(想想战场命令)。对于功能/模式以及必须阅读和维护其用法的人来说,这有点像。
  • @lancy:单例是全局对象。 boredzo.org/blog/archives/2011-03-18/…
【解决方案2】:

单例通常有助于存储您的全局数据。

然而,单例通常只是用作各种随机方法和变量的垃圾场,没有任何顺序或理由。

http://blogs.msdn.com/b/scottdensmore/archive/2004/05/25/140827.aspx

这可能是人们不喜欢使用 Singleton 的原因。

如果你不以混乱的行为滥用 Singleton,那么在我看来你不应该避免使用它。

【讨论】:

  • 一种不同的问题:您正在谈论“大泥球”/“上帝对象”类。这可以作为一个单例或一组类方法来完成(或者,事实上,甚至在一个常规对象中——这是控制器中的一个常见问题)。而且,正如你所说,可以制作一个不是大泥球的单身人士。
【解决方案3】:

Cocoa 中有如此多的单例,因为它的设计早在它对所有遇到问题的事物都宣布“邪恶”和“被认为有害”很酷之前就已经设计好了。

单身人士并不完全是邪恶的。如果使用得当,它们在许多情况下都能很好地工作。您已经发现了与它们相关的问题,但这并不意味着您必须立即摆脱它们,否则世界将终结。有些项目的实际情况是这样的,所以你永远不会遇到单例的问题。

显然,当库单例已经存在时,您无法避免使用它们。每当您需要某个对象,如 NSApplication 或 NSWorkspace 时,您应该使用它们的 sharedApplication/sharedWorkspace 方法,这就是系统框架的设计方式。

在设计您自己的代码时,您可以确保对象仅由工厂创建,而不是单例,并以某种方式编写一些工厂方法,以便在之前请求此类对象时返回之前的实例。这种设计避免了全局变量和单例变量无法用模拟代替它们的典型缺点。

【讨论】:

  • 非常感谢。我认为您的意思是单例模式并不邪恶,但还不够好。而且正因为可可几乎不会出错,所以我们可以简单地使用它。但是在设计自己的代码时,我最好使用单例的工厂模式来避免这些问题?这就是说,工厂比单身更好?也许有一天它会像全局变量一样被弃用?再次感谢!
  • @lancy:工厂模式(通过创建对象来创建对象)到处都是浪费时间和精力。躲开它。强制的单例通常是浪费时间和精力来实现,但不使用,并且在某些情况下它们是合适的。通常你根本不应该实现单例,甚至不应该“返回前一个实例”——不是因为它有害,而是因为没有理由这样做。如果您不需要多个,那么就不要创建多个。
猜你喜欢
  • 1970-01-01
  • 2012-01-23
  • 2011-01-02
  • 1970-01-01
  • 2011-01-04
  • 2021-01-15
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多