【代码大全】笔记-关于全局数据

C语言全局变量管理
本文探讨C语言中全局变量的合理使用,强调信息隐藏和模块化的重要性,介绍使用访问子程序替代全局变量的方法,以及如何降低全局数据带来的风险。

C语言合理使用全局变量

合理使用全局变量

全局数据(Global Data)

全局数据可以在程序中任意一个位置访问,这一概念有时被延伸到作用域比局部变量更广的变量——例如可以在一个类内部的任意位置进行访问的类变量。但是,在一个类中的任意位置可访问,并不意味着该变量是全局的。

与全局数据有关的问题

如果随意使用全局变量,或者认为不能随心所欲地使用他们是一种约束,那么你可能好没有充分理解信息隐藏和模块化的意义。

模块化、信息隐藏并结合使用设计良好的类可能还算不上是绝对真理,但是它们能极大地提升大型程序的可理解性和可维护性。

  • 无意修改了全局数据
  • 与全局数据有关的代码重入问题
  • 全局数据阻碍代码重用
  • 与全局数据有关的非确定的初始化顺序事宜
  • 全局数据破坏了模块化和智力上的可管理性
    全局数据使得你的模块化能力大打折扣,如果使用了全局数据,你能购在同一时间只关注一个子程序?不能,你不得不关注一个子程序,以及使用了全局变量数据的其他子程序,尽管全局数据并没有完全破坏程序的模块化,但是却削弱了它。

只用万不得已时才使用全局数据

  • 首先把每一个变量设置为局部的,仅当需要时才把变量设置为全局的
  • 区分全局变量和类变量
  • 使用访问子程序

用访问子程序来取代全局数据

访问器子程序的优势

  • 你获得了对数据的集中控制
  • 你可以确保对变量的所有引用都得到了保护
  • 自动获取信息隐藏的普遍益处
  • 访问器子程序可以很容易转变为抽象数据类型

如何使用访问器子程序:

  • 要求所有的代码通过访问器子程序来存储数据:比如,所有全局以g_开头,除了访问器,其他代码都不得访问
  • 不要把所有的全局数据都扔在一处:尽量把全局数据和访问器子程序打包到适合的类里面
  • 用锁定来控制对全局变量的访问:锁定要求使用或者更新一个全局变量值之前,该变量必须被签出,完成使用之后再签入。(加锁)
  • 在访问器子程序里构建一个抽象层
  • 对一项数据的所有访问都应该在同一个层次上(操作一致性)

降低全局数据的风险

  • 创建一种命名规则来突出全局变量
  • 为全部的全局变量创建一份注释良好的清单
  • 不要用全局变量来存放中间结果
  • 不要把所有的数据都放在一个大对象中并导出传递,以说明你没有使用全局变量

核对表(使用全局数据的注意事项)

  • 所有的变量是否都是局部的或者是类范围的?除非绝对必要才是全局的?
  • 变量的命名规则能把局部数据、类数据和全局数据区分开吗?
  • 你对所有的全局变量都加以文档说明吗?
  • 避免使用伪全局数据,即被四处传递且包含有杂乱数据的巨大对象吗?
  • 用访问子程序来取代全局数据吗?
  • 把访问子程序和数据组织到类里面吗?
  • 访问器子程序提供了一个在底层数据类型实现之上的抽象层吗?
  • 所有相关的访问器子程序都位于同一抽象层吗?

要点

  • 避免使用全局变量,不只是因为它们危险,还是因为你可以用其他更好的方法取代它们。
  • 如果你不得不使用全局变量,那么就通过访问子程序来使用它。访问器子程序能为你带来全局变量所能带来的一切优点,还有一些额外的好处。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值