2012-07-14 102 views
2

我一直在阅读,使用全局变量是不好的编程设计,但这是否意味着全局常量也不好?替代全局变量/常量

有什么替代方法,而不是全局变量/常量,以及声明多个源文件中需要的常量的最佳方法是什么?

+0

http://c2.com/cgi/wiki?GlobalVariablesAreBad – 2012-07-14 23:16:05

+0

如果使用错误,全局变量是不好的。并且大多数时间他们被滥用/东西可以在没有的情况下以更好的方式实施。你可以看看singletons http://de.wikipedia.org/wiki/Singleton_%28Entwurfsmuster%29但它们也可能被误用 – cppanda 2012-07-14 23:17:17

+1

从我读过的内容来看,Singletons和全局变量一样糟糕吗? – Carlj901 2012-07-14 23:21:18

回答

9

背后全局变量是坏的主要原因是共享的状态,这很容易让一个程序的不同部分通过的方式,你不打算操控共享的状态,使与程序的其他部分意料之外干扰的依赖使程序更容易出错,难以调试并且难以维护。

另一方面,常量除了它们污染全局名称空间(这可能会在编译时通过更改编译单元中符号的含义而导致意想不到的后果)之外几乎可以。如果你可以在特定的命名空间/范围中声明它们,那么你将会很好。

4

全局变量的真正问题在于,它们鼓励从代码中的许多点进行更改。执行某些操作的函数也具有改变全局状态的side effect(实际上,Functional Programming根本不允许副作用来避免此陷阱)。

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

保持数据接近它的使用位置,以便有一个定义良好的机制来改变它。

全局常量不会遇到同样的问题。

0

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

全局常量大多是一个(潜在的)哲学问题。由于它们是恒定的,绝大多数来自全局变量的实际问题都不会出现。与此同时,我们完全有理由怀疑一个特定的常量是否应该是全局的。如果(例如)你在处理物理问题,将光速定义为一个全局常量可能是有意义的。根据不同的领域,诸如Pi,e等等也可以作为全局变量来理解。另一方面,如果你可以合理地限制需要这样的事情少代码,这通常是可取的。 Pi值是不会改变的,但类似

x = area(some_circle); 

往往比更可读/理解:

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

的确如此,但对于一个特定的免费函数是否应该是全局性的问题来说,这是合理的。 (从某种意义上说,自由函数总是包含全局常量。)如果在整个程序中只需要一个地方需要一个小函数,比如'area',但是可能还需要'diameter'等等,我宁愿让_π_成为全球性的,并用它来定义他们需要的功能,并对每个功能进行快速评论。 – leftaroundabout 2012-07-15 03:40:17