文章目录
C语言合理使用全局变量
全局数据(Global Data)
全局数据可以在程序中任意一个位置访问,这一概念有时被延伸到作用域比局部变量更广的变量——例如可以在一个类内部的任意位置进行访问的类变量。但是,在一个类中的任意位置可访问,并不意味着该变量是全局的。
与全局数据有关的问题
如果随意使用全局变量,或者认为不能随心所欲地使用他们是一种约束,那么你可能好没有充分理解信息隐藏和模块化的意义。
模块化、信息隐藏并结合使用设计良好的类可能还算不上是绝对真理,但是它们能极大地提升大型程序的可理解性和可维护性。
- 无意修改了全局数据
- 与全局数据有关的代码重入问题
- 全局数据阻碍代码重用
- 与全局数据有关的非确定的初始化顺序事宜
- 全局数据破坏了模块化和智力上的可管理性
全局数据使得你的模块化能力大打折扣,如果使用了全局数据,你能购在同一时间只关注一个子程序?不能,你不得不关注一个子程序,以及使用了全局变量数据的其他子程序,尽管全局数据并没有完全破坏程序的模块化,但是却削弱了它。
只用万不得已时才使用全局数据
- 首先把每一个变量设置为局部的,仅当需要时才把变量设置为全局的
- 区分全局变量和类变量
- 使用访问子程序
用访问子程序来取代全局数据
访问器子程序的优势
- 你获得了对数据的集中控制
- 你可以确保对变量的所有引用都得到了保护
- 自动获取信息隐藏的普遍益处
- 访问器子程序可以很容易转变为抽象数据类型
如何使用访问器子程序:
- 要求所有的代码通过访问器子程序来存储数据:比如,所有全局以g_开头,除了访问器,其他代码都不得访问
- 不要把所有的全局数据都扔在一处:尽量把全局数据和访问器子程序打包到适合的类里面
- 用锁定来控制对全局变量的访问:锁定要求使用或者更新一个全局变量值之前,该变量必须被签出,完成使用之后再签入。(加锁)
- 在访问器子程序里构建一个抽象层
- 对一项数据的所有访问都应该在同一个层次上(操作一致性)
降低全局数据的风险
- 创建一种命名规则来突出全局变量
- 为全部的全局变量创建一份注释良好的清单
- 不要用全局变量来存放中间结果
- 不要把所有的数据都放在一个大对象中并导出传递,以说明你没有使用全局变量
核对表(使用全局数据的注意事项)
- 所有的变量是否都是局部的或者是类范围的?除非绝对必要才是全局的?
- 变量的命名规则能把局部数据、类数据和全局数据区分开吗?
- 你对所有的全局变量都加以文档说明吗?
- 避免使用伪全局数据,即被四处传递且包含有杂乱数据的巨大对象吗?
- 用访问子程序来取代全局数据吗?
- 把访问子程序和数据组织到类里面吗?
- 访问器子程序提供了一个在底层数据类型实现之上的抽象层吗?
- 所有相关的访问器子程序都位于同一抽象层吗?
要点
- 避免使用全局变量,不只是因为它们危险,还是因为你可以用其他更好的方法取代它们。
- 如果你不得不使用全局变量,那么就通过访问子程序来使用它。访问器子程序能为你带来全局变量所能带来的一切优点,还有一些额外的好处。
C语言全局变量管理
本文探讨C语言中全局变量的合理使用,强调信息隐藏和模块化的重要性,介绍使用访问子程序替代全局变量的方法,以及如何降低全局数据带来的风险。
291

被折叠的 条评论
为什么被折叠?



