在进行科学计算时使用全局变量

计算科学 编程范式
2021-11-25 07:02:35

我在大学一年级的计算机编程课程中学到,使用全局变量几乎总是一个坏主意。但是,我发现在为非常复杂的模拟设计 Fortran 程序时,这种做法似乎使事情变得更容易;例如,我不必担心将变量传递给各种子程序。

我的问题是我错过了什么吗?我糟糕的编程习惯最终会回来伤害我吗?

4个回答

组织代码以避免全局变量的好处包括更好地控制变量的变化。没有什么比追查全局变量是如何被错误地更改或踩踏更糟糕的了。对于引入库或作为库发布以供其他人代码使用的大型复杂系统尤其重要。想象一下你拉入一个库的噩梦,该库的全局变量与你的全局变量同名……哎呀!

可能的解决方案包括创建一个封闭结构(特定于语言:想到对象、类或结构)来存储这些变量,并且只允许通过调用结构的公开函数来更改这些变量。

你几乎肯定会被咬,除非它们是只读的或者除非你的代码是微不足道的,在这种情况下它可能不是科学计算。

编程时不要试图省去打字;尽量节省开发和调试时间。

您的观点因您使用 Fortran(我假设为 Fortran 77)而受到影响,其中您只有两种访问变量的方法:(1)它们是某些 COMMON 块中的全局变量,或者(2)它们已作为参数传递(通常是标量)到当前函数。

自 1977 年以来,所有更现代的编程语言都以多种方式解决了这一问题。一个例子是在 C/C++ 中使用结构(复合类型或其他语言中的记录),它允许您将许多变量组合为一个变量,并且只将对一个结构的引用作为参数传递给函数。或者,在大多数面向对象的编程语言中更优雅的是,将事物组合在类中,然后将指向此类对象的引用或指针隐式传递给每个成员函数。这些技术使处理您认为不重要的问题并消除了使用全局变量的动机。

不使用全局变量的原因已经在其他答案中给出。我个人最喜欢的原因之一是减少潜在错误的最佳策略之一是限制变量的范围。仅存在于程序很小一部分中的变量不会在其他地方造成麻烦。所以我的目标通常是尽可能晚地声明任何变量并尽可能早地销毁它,仅仅是因为这样可以更容易阅读和理解代码。另一方面,全局变量以最恶劣的方式违反了这一目标。

可以用全局变量完成的任何事情都可以在没有全局变量的情况下完成。

但是随着代码的增长,全局变量开始了自己的生命,在一些非常糟糕的情况下,它们会完全解调代码,因此理解任何特定的子程序都需要完全理解整个代码库;可以想象,对全局变量的更改可以随时随地发生。

因此,我认为在没有全局变量的情况下学习编码是本能的,而不是被视为更难的选择是最好的方法。