当前位置:  开发笔记 > 程序员 > 正文

好吧,全局变量被谴责,单身人士被鄙视,还有什么选择?

如何解决《好吧,全局变量被谴责,单身人士被鄙视,还有什么选择?》经验,为你挑选了3个好方法。

对于桌面应用程序.这只是一个普遍的问题,可能只需要一般的答案.



1> Corey Trager..:

具有静态数据成员的静态类?但谁在乎.静态数据成员只是具有更多政治正确包装的全局变量.

不要让时尚超越你的常识.使用普通的旧全局变量没有任何问题.单例模式通常是过度杀戮和令人讨厌的类型,并且当你单步执行代码来调试它时会很烦人.

假设您使用的是C/C++,我建议您不要使用全局变量作为从堆中分配内存的类实例.它们会使您更难使用检查内存泄漏的工具.将全局声明为指针,在main()的开头新建它,最后删除它.

6评论之后的编辑:想想伐木.您不希望能够从应用程序的任何位置在日志中写入一行吗?如果没有全局可见的日志记录,您是如何具体实现的?如果你想要全局可见的东西,那么继续使它全局可见.


但是,当然,有时您可能仍然需要全局日志.这就是为什么我认为这不是全局因素,但是*全局可变状态*.如果日志不是可变状态,则日志可以是全局的.如果它只需要文本并将其抛出到某些外部介质,那就没问题了.但并非所有日志都那么简单
关于"记录几乎是唯一允许使用Singleton的地方",配置怎么样?我的意思是,从配置文件中获取设置?应用程序在启动时读取/加载文件,然后从应用程序的任何位置读取值.
没有.全球性因其明显的范围而被视为糟糕.但是对于非全局命名空间中的其他自由对象和静态类成员都不是这样

2> Norman Ramse..:

答案取决于语言.我最近遇到了一个人,他的公司开发了在许多流行的手机上运行的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软件服装,他们可以轻松地为不同的客户插入不同的部分.

我真的很喜欢这种方式编程,因为我可以看到正在发生的一切,我的私人数据结构受到保护,不受窥探:-)



3> jalf..:

首先,假装单词在某种程度上比全局变量更好或更可接受是没有意义的.单身人士只是一个看起来像OOP的全球性服装.抛出一堆其他问题.

另一种选择当然是没有全球数据.而不是您的类在某处访问某些静态(全局)变量,而是将数据传递给其构造函数.是的,这意味着你必须向构造函数添加一些参数,但这是件坏事吗?它使类的依赖项显式化.我可以简单地通过在构造函数中为它提供不同的对象来测试类,而如果它依赖于全局数据,那些全局变量必须存在于我的测试中,这很麻烦.

类似地,我可以轻松地重构,因为除了直接传递给对象的类之外,对类没有魔法依赖.

线程安全性变得更容易管理,因为您不再拥有与同一全局实例通信的所有对象.相反,它们可以传递给类的单独实例.


是否要将日志记录实例传递给每个函数,用户语言或帮助文件的位置,以便它可以执行上下文相关帮助.
推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有