对于桌面应用程序来说。这只是一个一般性问题,也许只需要一般性答案。

有帮助吗?

解决方案

一个静态类静态数据成员?但谁在乎。静态数据成员与多个政治正确包装只是全局变量。

不要让时尚覆盖您的常识。这没有什么错用一个普通的老全局变量。单例模式往往是矫枉过正和恼人的键入,和恼人当你通过代码单步调试它。

假设使用的是C / C ++,我建议你没有这种是从堆中分配存储器类实例的全局变量。他们会让你更难使用该检查内存泄漏的工具。宣布全球作为指针,新它在主()的开始,在最后将其删除。

EDIT后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方法。

为什么比全局变量更好?的有没有意外即可。如果出现问题,或者你想添加一个功能,你知道,一切都在传递的值明确的,而且,你知道你可以塞很多模块一起,他们不会干涉,除非你明确地传递他们之间的状态。我在手机BIZ联系,他说这个属性是巨大的,他的公司---他们的OEM软件衣服,他们可以很容易地为不同的客户不同的插拼在一起。

我真的很喜欢编程这种方式,因为我能看到这回事的一切,我的私人数据结构从窥探保护: - )

首先,有在假装singletions在某种程度上比全局更好或多种可接受的没有意义的。单身只是一个全球性的打扮看起来像OOP。与一群在抛出其他问题。

和替代方案是,当然要的具有全局数据。相反,你的类访问一些静态(全局)变量某处,将数据传递给它的构造。是的,这意味着你要几个参数添加到构造,但是是一件坏事?它使类的依赖关系明确。我可以简单地通过在构造提供给它的不同对象测试类,而如果它依赖于全局数据,那些全局在我的测试,这是杂乱存在。

同样,我可以很容易地重构,因为有比上什么直接传递给对象的其他类没有神奇的依赖关系。

主题安全性变得更容易管理,因为你不再把所有的对象具有相同全局实例通信。相反,它们可以被传递的类的单独实例。

如果不推荐单或全局变量,我不会在意。如果我觉得这是实现它,然后我会继续和使用它的最合理的方式。

这完全取决于你试图解决的问题。这种信息的关键位被你冷落。如果你正在寻找一个涵盖范围广泛的解决方案,没有一个。有仅仅我们应用模式时适用。

我已经看到了这两种全局和单身的最普遍的问题是,你使用线程时,风险的不良行为。在这种情况下,你应该总是使用执行范围作为基本单元。这是面向对象编程的优势之一 - 可以使用对象的成员与意外螺纹混乱的很少恐惧持有的所有相关数据。这种鲜明的对比非OO功能的编程语言,在那里你必须通过参数交出的数据了。

在其他共同关心往往是组织 - 这是很难理解在一个大系统中的确切位置数据来自当它可以读取/随时写入。这一点,在我的经验,更多的是与开发商而不是代码本身的问题。除非你上,似乎主要是突然出现在编程书籍的困难问题的例子那些近亿线megasystems的一个工作,你将能够搜索到你的整个代码库为特定项目在相当短的一段的时间。必要的下一步是要定期审核的代码库,以确保全局/静态变量没有被分配到随机的。这是诅咒了大量的开发方法,但对于具有一定规模下的系统和复杂性,是一个完全可行的解决方案。

到一个常见的解决方案是使用单实例的类,而不是单/全局变量。

您的应用程序将负责确保只有一个实例。

该解决方案还挺吮吸,因为你不能阻止人们instanciating类(不是单),所以它必须是一个内部类。

我不会太在意所有宗教战争了解 Singleton模式,虽然 - 如果我认为它适合我的需要,我一般用它

全局变量的小程序重新正常,但当他们得到更大的你开始奇怪的副作用,当有人进行更改或转到“哦,我只需要设定这个全球性问题消失”修复一个bug

在使用全局变量和单例并看到一切都变得混乱之后,我提出了这个解决方案。

  1. 使每个全局变量成为类的成员。从逻辑上讲,每个全局变量都属于应用程序(或系统)。只需创建一个应用程序类。将全局对象定义为属性。所以它们是在第一次调用时创建的。

  2. 为应用程序类创建一个单例,以便您可以全局访问它。这将是您的代码中唯一的单例。好吧,最后它就像java中的system.out或system.in对象一样。

笔记:我知道,这是一个非常古老的问题,但仍然很受欢迎。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top