【问题标题】:Objective-C: When to know that you are abusing the SIngleton method of Global VariablesObjective-C:什么时候知道你在滥用全局变量的 SIngleton 方法
【发布时间】:2010-01-01 19:19:04
【问题描述】:

所以在过去的几周里,我的客户 iphone 应用程序从 5 个左右的课程增加到 25 个以上。有了这么大的(无论如何对于 iphone)类结构,我一直在使用 Singleton 类来访问全局变量。问题是,每当我需要访问我正在处理的类之外的变量时,我可以选择修改代码以传递对变量的引用,或者将其放入单例中。当然,将它放入单例中会少很多代码和工作量,但是,现在单例开始看起来像是不相关的全局变量的混杂。

我的问题是,维护一个具有不相关全局变量的大型单例对象是否合适,以及在“非平凡”iphone 应用程序中跨类共享数据的“最佳实践”方式通常是什么?

非常感谢您的建议!

【问题讨论】:

    标签: objective-c oop singleton global-variables


    【解决方案1】:

    我在解耦设计的上下文中完成了这个问题的detailed analysis。我会试着总结一下我的观点:

    1. 如果您的 Singleton 带有重要的全局状态,请不要使用 Singleton。这包括持久性存储,例如数据库、文件等。
    2. 如果类名对单例对象的依赖不明显,则应注入依赖项。将单例实例注入类的需要证明了该模式的错误使用(参见第 1 点)。
    3. 假定单例的生命周期与应用程序的生命周期相同。大多数 Singleton 实现都使用延迟加载机制来实例化自己。这是微不足道的,它们的生命周期不太可能改变,否则你不应该使用 Singleton。

    【讨论】:

      【解决方案2】:

      一般来说,一个项目中不需要很多单例或全局变量。不过,你没有提供太多关于你实际在做什么的信息。它们是一种气味,它们不是被禁止的。

      您可能想研究其他方法。例如。实现这些类共享的协议,以根据需要传输某些数据位(然后每个人都获得自己的副本),或者使用绑定/KVO 来保持这些类之间的值同步。

      如果您在某个课程中遇到混搭,是时候将该课程拆分为多个课程了。如果你有很多只由一两个类使用的小型 one-ivar-classes,最好将其合并回其中一个类,或者将这三个类的所有功能都采用不同的方式拆分。

      另外请记住,您不需要单例。一个类已经是一个(元)对象,其中一个实例已经存在,因此您可以只使用没有实例的类方法。在类上使用单例实例的主要动机是,您可以用其子类的实例替换单例,而无需针对超类编写代码(例如,NeXT 可能针对不同的文件系统或平台有不同的 NSWorkspace 子类)。

      【讨论】:

        【解决方案3】:

        您可能会考虑将这些值放入应用程序委托拥有的字典中。你存储什么样的东西?

        【讨论】:

          【解决方案4】:

          Apple/NeXT 定义了许多单例,每个都有自己的焦点,通常被称为某事的“经理”。在某些情况下,例如 NSWorkspace,他们似乎很难自己解决这个问题。

          【讨论】:

            猜你喜欢
            • 2010-09-15
            • 1970-01-01
            • 2022-01-11
            • 1970-01-01
            • 2013-08-14
            • 2010-11-04
            • 2011-06-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多