全局变量/常量的替代方案
Alternative to global variables/constants
我一直读到使用全局变量是糟糕的编程设计,但这是否意味着全局常量也不好?
除了全局变量/常量,还有什么替代方案?声明多个源文件中需要的常量的最佳方式是什么?
全局变量不好的主要原因是对共享状态的依赖,这使得程序的不同部分很容易通过以您不打算的方式操纵共享状态来对程序的其他部分造成意外干扰,从而使程序更容易出错、更难调试、更难维护。
另一方面,常量基本上是可以的,只是它们污染了全局命名空间(这可能会在编译时通过更改编译单元中符号的含义而导致意外的后果)。如果您可以在特定的名称空间/作用域中声明它们,那么您就可以了。
全局变量的真正问题是它们鼓励从代码中的多个点进行更改。做某事的函数也有改变全局状态的副作用(事实上,函数编程根本不允许副作用来避免这个陷阱)。
这种编程风格很难正确调试和维护。
将数据保持在使用位置附近,以便有一个定义良好的机制来更改它
全局常数不会受到同样的问题的影响。
全局变量会导致大量(通常未知)依赖共享状态的代码带来实际问题。这可能(确实)导致难以理解、跟踪等交互。简而言之,许多代码最终会紧密耦合,这通常会导致问题。
全局常数主要是一个(潜在的)哲学问题。由于它们是恒定的,大多数来自全局变量的真正问题永远不会出现。同时,质疑一个特定的常数是否真的应该是全局的是完全合理的。如果(例如)你在处理物理学,那么将光速定义为全局常数可能是有意义的。根据字段的不同,Pi、e等也可以作为全局变量。另一方面,如果您可以合理地将对此类事情的需求限制为更少的代码,那么这通常是更可取的。Pi的值不会改变,但类似
x = area(some_circle);
倾向于比更易于阅读/理解
x = some_circle.radius * some_circle.radius * Pi;
相关文章:
- #定义c-预处理器常量..我做错了什么
- 运行同一解决方案的另一个项目的项目
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Project Euler问题4的错误解决方案
- 通过多个头文件使用常量变量
- 在cuda线程之间共享大量常量数据
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 是默认情况下分配给char数组常量的值
- 私有类型的静态常量成员
- 视觉工作室中涉及 void*、字符串和常量字符 [] 的意外重载解决方案
- 全局变量/常量的替代方案
- 将图像*[3]传递到常量图像*[3]无法使用const_cast<图像*[3]>,替代方案?
- 为多语言解决方案定义多个预处理器常量
- 函数参数 -> 结构体成员的 void* 和常量 void* 的解决方案
- C++需要从常量字符串转换的解决方案
- 需要对 std::tuple 进行非常量索引访问的雄辩解决方案(即 std::get<E>)