Why is using a Global Variables class (singleton) bad practise?
我为之工作的公司有一个很大的班级(globals.m),就是单身。它主要存储一些应该进入nsuserdefaults的bools,但是也有指向类似视频播放器的指针,这些播放器属于不同的视图控制器。我对iOS开发还比较陌生(我是一个低等的实习生),但我的直觉告诉我,代码闻起来就像天堂。我如何解释为什么使用单例存储所有变量是不好的?
编辑:我不是说单身是坏的,我只是说在这种情况下。基本上,应用程序中的每个重要变量都存储在这个实例中。
- 模式只是一种模式…真正糟糕的是,仅仅因为你认为某件事不好,就盲目地告诉它…单例并不坏,但你当然可以使用/创建坏的单例…这取决于你如何设计/使用它们…
- 辛格尔顿,这是一种模式…不要使用得体。这很糟糕,我闻到有人认为使用单例,而实际上它不是单例。
- 谢谢@joshcaswell,我之前看到过,但我没有完全理解他的观点。抱歉重复了!
uikit中的很多对象都是单件的。uiapplication对象是一个singleton。nsuserdefaults具有standardUserDefaults单例。uidevice currentDevice返回一个单例。
仅仅因为它是单身并不意味着它是坏的。不好的是,当您开始将其他类中的功能与单例对象联系起来时,它是如此根深蒂固,以至于您不能轻易地更改单例对象或受影响的对象。
我使用一个singleton来存储我的非coredata对象结构。我还定义了一些用于获取库目录、编码数据和键控归档的辅助方法。所以我可以在任何需要的地方引用一个主数组对象,或者很容易地访问那些原本只是复制和粘贴的方法。
- 所以如果他们用它来表示变量,那就没有什么害处了?
- 我想说的是,如果您在视图控制器代码中直接访问和修改单例对象,而不是将这些对象分配为视图控制器类的属性,那么情况就不好了。与在视图控制器中为数组设置一个属性并在那里修改它相比,ie -viewDidLoad { [[[Singleton shared] array]addObject:newObject]; }会很糟糕。
Globals.m听起来不是单例的,如果是单例的话,它看起来只是用于配置目的?我想,一个装满了#defines或extern的文件也能做到这一点。如果没有更多的细节,很难知道你在搜索什么。
- 它被设置为singleton,并且显式地具有一个将其引用为singleton的注释。它被积极地用于存储任何必须访问其他类的变量,而不仅仅是用于配置。除了用户界面之外,不要相互引用。一切都是通过nsnotificationcenter和这个globals实例完成的。很有可能我只是得出这样的结论:这是一个糟糕的练习,就像我说的,我不是很有经验。