全局变量/常量的替代方案

Alternative to global variables/constants

本文关键字:方案 常量 全局变量      更新时间:2023-10-16

我一直读到使用全局变量是糟糕的编程设计,但这是否意味着全局常量也不好?

除了全局变量/常量,还有什么替代方案?声明多个源文件中需要的常量的最佳方式是什么?

全局变量不好的主要原因是对共享状态的依赖,这使得程序的不同部分很容易通过以您不打算的方式操纵共享状态来对程序的其他部分造成意外干扰,从而使程序更容易出错、更难调试、更难维护。

另一方面,常量基本上是可以的,只是它们污染了全局命名空间(这可能会在编译时通过更改编译单元中符号的含义而导致意外的后果)。如果您可以在特定的名称空间/作用域中声明它们,那么您就可以了。

全局变量的真正问题是它们鼓励从代码中的多个点进行更改。做某事的函数也有改变全局状态的副作用(事实上,函数编程根本不允许副作用来避免这个陷阱)。

这种编程风格很难正确调试和维护。

将数据保持在使用位置附近,以便有一个定义良好的机制来更改它

全局常数不会受到同样的问题的影响。

全局变量会导致大量(通常未知)依赖共享状态的代码带来实际问题。这可能(确实)导致难以理解、跟踪等交互。简而言之,许多代码最终会紧密耦合,这通常会导致问题。

全局常数主要是一个(潜在的)哲学问题。由于它们是恒定的,大多数来自全局变量的真正问题永远不会出现。同时,质疑一个特定的常数是否真的应该是全局的是完全合理的。如果(例如)你在处理物理学,那么将光速定义为全局常数可能是有意义的。根据字段的不同,Pi、e等也可以作为全局变量。另一方面,如果您可以合理地将对此类事情的需求限制为更少的代码,那么这通常是更可取的。Pi的值不会改变,但类似

 x = area(some_circle);

倾向于比更易于阅读/理解

x = some_circle.radius * some_circle.radius * Pi;