对于桌面应用程序.这只是一个普遍的问题,可能只需要一般的答案.
具有静态数据成员的静态类?但谁在乎.静态数据成员只是具有更多政治正确包装的全局变量.
不要让时尚超越你的常识.使用普通的旧全局变量没有任何问题.单例模式通常是过度杀戮和令人讨厌的类型,并且当你单步执行代码来调试它时会很烦人.
假设您使用的是C/C++,我建议您不要使用全局变量作为从堆中分配内存的类实例.它们会使您更难使用检查内存泄漏的工具.将全局声明为指针,在main()的开头新建它,最后删除它.
6评论之后的编辑:想想伐木.您不希望能够从应用程序的任何位置在日志中写入一行吗?如果没有全局可见的日志记录,您是如何具体实现的?如果你想要全局可见的东西,那么继续使它全局可见.
答案取决于语言.我最近遇到了一个人,他的公司开发了在许多流行的手机上运行的USB堆栈(例如,所以你的手机可以与你的电脑通话).他们的商店有一条规则,所有C程序都必须是可重入的.实际上,这意味着它们不是全局变量,而是为每个例程使用额外的参数; 该参数指向应该在例程之间保持的状态.
我一直用这种技术来抽象状态.示例:摄影图像的阅读器抽象:阅读器一次可以访问一个像素; 它必须知道打开文件描述符,图像中的当前位置是什么,依此类推.所有这些信息都会进入私有C结构或C++类的私有成员.没有全局变量.外界看到:
typedef struct Pnmrdr_T *Pnmrdr_T; struct Pnmrdr_T *Pnmrdr_new(FILE *); pixel Pnmrdr_get(Pnmrdr_T); void Pnmrdr_close(Pnmrdr_T); void Pnmrdr_free(Pnmrdr_T *rp); // frees memory and sets *rp = NULL
这种编程风格与OO方法非常相似.
为什么比全局变量更好? 没有惊喜.如果出现问题或者你想要添加一个功能,你知道传入的值都是显式的.此外,你知道你可以将大量模块插在一起,除非你明确地在它们之间传递状态,否则它们不会干扰.我在手机业务方面的联系人说,这个属性对他的公司来说是巨大的 - 他们是一个OEM软件服装,他们可以轻松地为不同的客户插入不同的部分.
我真的很喜欢这种方式编程,因为我可以看到正在发生的一切,我的私人数据结构受到保护,不受窥探:-)
首先,假装单词在某种程度上比全局变量更好或更可接受是没有意义的.单身人士只是一个看起来像OOP的全球性服装.抛出一堆其他问题.
另一种选择当然是没有全球数据.而不是您的类在某处访问某些静态(全局)变量,而是将数据传递给其构造函数.是的,这意味着你必须向构造函数添加一些参数,但这是件坏事吗?它使类的依赖项显式化.我可以简单地通过在构造函数中为它提供不同的对象来测试类,而如果它依赖于全局数据,那些全局变量必须存在于我的测试中,这很麻烦.
类似地,我可以轻松地重构,因为除了直接传递给对象的类之外,对类没有魔法依赖.
线程安全性变得更容易管理,因为您不再拥有与同一全局实例通信的所有对象.相反,它们可以传递给类的单独实例.