尽可能减小作用域。你所采取的方法往往取决于你“方便性”和“可管理性”这两个问题
的看法。许多程序员喜欢用全局变量。因为全局变量存取很方便而且程序员们不必围着参数表
和模块命名规则转。事实上,这种存取方便性是与由全局变量引入的危险共存的。
另一些程序员则尽可能使用局部变量,因为局部变量可以提高可管理性。你所隐含的信息
越多,那么需要记在心中的东西就越少,而需要记住的东西越少,那么犯错误的机会也就越少,
因为许多细节都不需要再进行记忆了。
“方便性”和“可管理性”之间的区别可以理解为是强调写程序还是强调读程序。扩大变
量作用域事实上的确可以方便写程序,但是一个任意子程序都可以在任意时刻访问任一个变量
的程序,往往要比使用模块化子程序的程序难懂得多。在这种程序中,你无法单纯理解一个子
程序,你必须同时也理解与这个子程序分享全局变量的其它子程序。这样的程序不仅难读,而
且也很难调试和修改。
因此,你必须尽可能地减小变量的作用域。如果能将变量的作用域限制在一个子程序之内
的话,那是再好不过的了,如果你无法把它限制在一个模块中的话,那就利用存取子程序来使
几个模块分享这一数据。总之,应尽量避免使用全局变量以减小作用域。
把对某一变量的引用集中放置。某些研究人员认为把对某一变量的访问放得越近,那么对
程序阅读者的精神压力也就越小。这一想法有很大的直觉吸引力——你每次只需注意比较少的
变量。以下是由这一想法产生的几项准则:
应恰好在某一循环前初始化循环中用到的变量,而不是在含有这个循环的子程序开头对其
中用到的变量进行初始化。这样作可以使你在修改循环时,同时想起对相应的变量的初始化进
行修改;或者在这一循环外再嵌套一个循环时,此时外部循环每执行一次时,都会对内部循环
用到的变量进行初始化,而不会出现只初始化一次的错误。
要在用到某一变量时才对它进行赋值。你可能有过费尽心机地寻找某一变量到底是在哪被
赋值的体验。因此,越清楚地表示出变量赋值的地方越好。
下例指出了在一个计算日收入的子程序中,是怎样把对同一变量的引用集中放置,以便方
便地寻找它们的。第一个例子是违反这一原则的一个C语言子程序:
void SummarizeData(...)
{
...
...
GetOldData(OldData, &NumOldData);
GetNewData(NewData, &NumNewData);
TtlOldData = Sum(OldData,NumOldData);
TtlNewData = Sum(NewData,NumNewData); 语句使用两组变量
PrintOldDataSummary(OldData,TtlOldData,NumO1dData);
PirntNewDataSummary(NewData,TtlOldData,NumNewData);
SaveOldDataSummary(TtlOldData,NumOldData);
SaveNewDataSummary(TtlNewData,NumNewData);
...
...
}
在上例中,你不得不同时注意 OldData、NewData、NumOldData、NumNewData、TtlOldData