为什么全局变量、静态变量、单例不好

原文地址链接:https://fuzhe1989.github.io/2017/09/30/why-global-static-singleton-var-evil/

(文章没有转载完整, 只是做个记录,为了后面好去复习)

全局变量

很多人都知道代码中要尽量避免使用全局变量,那么全局变量有什么问题,为什么大家觉得它不好?因为全局变量是一种全局状态,而可变的全局状态破坏了理想的程序。

理想的程序

理想情况下:

  • 整个程序是由一个个相互独立的组件(模块或函数或对象)组成,组件的设计遵循“高内聚低耦合”,不同的组件之间仅在必要时通过公开接口交互,任意两个组件间的通信链路是清晰明确的。组件间的依赖关系因此也是清晰的。

  • 我们可以替换掉任意组件而不影响其它组件的运行,从而注入我们的逻辑。尤其是在测试中,我们可以mock掉任意组件,从而控制程序的行为,达到我们的测试目的。

  • 程序不存在未定义行为,任意组件的行为都是可预测的,尤其是组件的初始化顺序是确定的。

  • 从代码角度,组件的逻辑要有局部性,即逻辑相关的代码是在一起的,尽量减少阅读时的跳跃次数。

全局状态的问题

  • 全局状态是暴露在外面的,任何地方都可以访问,你没有办法约束这种行为,破坏了封装性。另一方面,可以认为全局状态也侵入到了访问它的组件中,也破坏了这些组件的封装性。尤其是如果一个const方法访问了全局变量,它可能就算不上const方法了。
    两个组件如果访问了相同的全局状态,它们实际上就耦合在一起了,独立性被破坏了。
  • 组件交互的链路不再清晰,理想链路上的任意两个组件都可能通过某个全局状态交互。
  • 全局状态往往会被并发访问,这就要求全局状态一定要具备线程安全性。但这一点不是总能被很好的保证的。尤其是两个分别保证了线程安全性的全局状态,不代表一起使用时还是线程安全的,还需要额外的同步手段。某种程序上,这种同步也会影响程序的性能。
  • 全局状态最讨厌的是,它导致测试很难写。首先,很难控制所有的全局状态,因此很难把环境弄干净,测试结果可能被任何一个漏掉的全局状态所影响。其次,全局状态是难以替换的,也就意味着mock和逻辑注入非常困难,甚至导致一些测试无法实现。
  • C++中全局变量还有一个问题:不同编译单元的全局变量不保证初始化顺序,当你在一个全局变量的构造过程中访问另一个全局变量,很可能会进入未定义状态。

有一个笑话说:C++中全局变量的名字前缀用什么最好?答案是//。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值