让我们看看如何通过最小化变量的可见性来防止面条式代码(spaghetti code)现象的一些建议。我们的目标是将变量在源代码中可见的代码部分减少到尽可能少的程度,即减少变量的作用域。
作用域最小化是指以一种易于实现的方式构建代码的过程:

  • 要声明作用域最小的变量
  • 将数据赋值给作用域最小的变量。
    事实上,是代码结构定义了变量的可见性。

背景概念

程序是由简单语句(例如赋值语句)或复合语句(例如条件语句、循环语句)组成的。复合语句可以嵌套,这意味着它们可以由包含其他语句的代码块组成。
具体来说,让我们考虑两个区块A和B,如果A包含B,我们称A为B的外部块,而如果B包含在A中,我们称B为A的内部块。
块的缩进级别是其嵌套级别的数目,并且对应于比其外部块高一级的级别。我们将全局作用域定义为没有外部块、缩进级别为0的特殊块。最后,全局变量是指在全局作用域中定义的变量。

可变可见性规则

变量在代码的以下部分中可见:从变量的声明语句开始,在变量的声明块的末尾结束,并且包括代码内的所有嵌套块。
变量在位于以下位置的代码部分中不可见:在变量的声明之前,和在变量的声明块末尾之后。

建议

  1. 切勿使用全局变量
  2. 声明单一用途变量
  3. 声明接近其使用的变量
  4. 保持代码块小
  5. 使用接近其声明的变量
  6. 使用不超过两个嵌套级别

R1. 切勿使用全局变量

永远不要声明或使用全局变量,因为它们会使代码更难阅读、维护和测试
它们的使用增加了有问题的副作用的出现,这通常会导致不易识别和修复的编程错误。
程序中可能错误赋值变量的语句越少越好。
总而言之,使用全局变量通常代表技术债务,必须通过重写代码尽快偿还!

R2. 声明单一用途变量

为单一的特定目的声明和使用变量,以便将它们的作用域限制在最小。
已声明变量的用途越多,该变量可见的语句数量就越多。
变量可见的语句数量越多,可能错误地为变量赋值的语句就越多。
可能错误赋值变量的语句越多,查找和修复潜在错误就越困难。
总结:只声明和使用单一用途的变量。

R3. 声明接近其使用的变量

声明变量时,应尽可能靠近将使用它们的语句和代码块。
严格与建议R2相关,这是减少可以使用声明变量的语句数量的另一种方式。

示例:三个后续块

首先,让我们考虑三个后续代码块A、B和C。即:A、B和C位于同一外部块中,并且它们具有相同的缩进级别。其次,让我们在A之前声明一个变量v,缩进级别与A相同。根据可见性规则,v将对随后的所有三个块A、B和C可见。现在让我们假设我们需要v只对C可见。显然,在C之前声明v会降低其可见性,因为它只能通过C中的语句显示。到目前为止还不错!然而,如果遵循这一建议而不遵循下一项建议,则该建议只有部分用处。

R4. 保持代码块小

与关于单一用途变量的建议R2类似,通过使代码块专注于单个特定任务来保持代码块尽可能小。否则,某些变量可能会被专用于不同任务的代码块部分不必要地显示出来。
让我们再来看看前面介绍的三个后续块A、B和C,它们具有相同的缩进级别。假设我们需要声明一个变量w,该变量将由A使用和修改,而只由B和C读取。在A之前声明w是不可避免的,因此它的范围将不必要地包括B和C。这使得B和C也能够赋值w,而我们希望它们只能读取w的值。我们如何避免这种情况?只需将B和C分成两个不同的函数,将w作为它们的参数之一。
总结:使代码块成为单任务,将子任务移到不同的函数中。

R5. 使用接近其声明的变量

请记住,使用变量时要尽可能靠近其声明。假设您需要使用(即读取或赋值)在外部块中声明的变量v。记住最小化使用v的语句和v的声明块之间的缩进级别。
一般规则:变量声明和使用之间的最大嵌套层数应为两个。
为了完整性,让我们来看一个示例,其中在三个嵌套级别(即比推荐的级别多一个)的距离上使用变量可能是合理的。

示例:矩阵乘法算法

让我们考虑迭代矩阵乘法算法,它使用三个嵌套循环。这类循环中最深的部分包含以下赋值语句:

sumsum + Aik × Bkj.

语句使用的A和B在外部块中以三个嵌套级别的距离声明,该距离比建议的最大值多一个级别。在这种情况下,对规则进行例外是非常情有可原的。在使用外部块中声明的变量时,如果不考虑角点情况,则认为三个缩进级别过多。
尽管建议R6实际上可以满足这个建议,但是记住这个建议在组织代码时总是一个好主意。

R6. 使用不超过两个嵌套级别

通常,请记住尽可能减少嵌套块的深度。
每个函数中的最大嵌套深度应最多为两个。
当一个函数的嵌套深度大于两个时,按以下方式重新构造它:

  1. 将一些子块移动到不同的功能中,并
  2. 将被移动的子块使用的变量作为函数的参数传递。
    如建议R5所示,有时将三个作为最大深度是合理的。同样,问题分开,总是考虑两个作为最大嵌套深度。
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐