第十章 使用变量的一般事项

本章中用“变量”一词同时指代对象和内置数据类型,如整数和数组等。“数据类型”一词通常指内置数据类型,而“数据”一词则可能代表对象,也可能代表内置数据类型。

数据认知

创建有效数据的第一步是了解所要创建的数据种类。积累大量的数据类型对于程序员来说至关重要。

有关数据类型的更多资源

Cormen《Introduction to Algorithm》

Sedge wick《Algorithm in C++》

轻松掌握变量定义

隐式声明

  • 关闭隐式声明
  • 声明全部变量
  • 遵循某种命名规则
  • 检查变量名

变量初始化原则

避免产生初始化错误的建议:

  • 在声明变量的时候初始化;
  • 在靠近变量第一次使用的位置初始化;
  • 理想情况下,在靠近第一次使用变量的位置声明和定义该变量;
  • 在可能的情况下使用final或者const;
  • 特别注意计数器和累加器;
  • 在类的构造函数里初始化该类的数据成员;
  • 检查是否需要重新初始化;
  • 一次性初始化具名变量,用可执行代码来初始化变量;
  • 使用编译器设置来自动初始化所有变量;
  • 利用编译器的警告信息;
  • 检查输入参数的合法性;
  • 使用内存访问检查工具来检查错误的指针;
  • 程序开始时初始化工作内存。

作用域

作用域或者可见性指的是变量在程序内的可见和可引用范围。下面是一些使用作用域的规则:

  • 使变量引用局部化;
  • 尽可能缩短变量的“存活”时间;
  • 减小作用域的一般原则;
    • 在循环开始之前再去初始化该循环里使用的变量,而不是在该循环所属的子程序的开始处初始化这些变量;
    • 直到变量即将被使用时再为其赋值;
    • 把相关语句放到一起;
    • 把相关语句提取成单独的子程序;
    • 开始时采用最严格的可见性,然后根据需要扩展变量的作用域。
  • 有关缩小变量作用域的说明;
    • 程序员采用哪种缩小变量域的方法,取决于他如何看待“方便性“和”智力上的可管理性“。

持续性

持续性是对一项数据的声明周期的另一种描述,持续性具有多种形态:

  • 特定代码段或子程序的声明周期。
  • 只要你允许,它就会持续下去。
  • 程序的生命周期。
  • 永远持续。

绑定时间

绑定时间是把变量和它的值绑定在一起的时间。是发生在编写代码的时候还是编译程序的时候?是在程序加载的时候还是在运行的时候?抑或是其他时间?

  • 编码时(使用神秘数值)
  • 编译时(使用具名常量)
  • 加载时
  • 对象实例化时
  • 即时

数据类型和控制结构之间的关系

数据类型和控制结构之间以一种定义明确的方式相结合。Jackson描述出了三种类型的数据和相应的控制结构之间的关系:

  • 顺序型数据翻译为程序中的顺序结构;
  • 选择型数据翻译为程序中的if和else语句;
  • 迭代型数据翻译成程序中的for、repeat、while等循环结构。

为变量指定单一用途

通过使用一些巧妙的方法,可以给一个变量赋予多种职责。不过你最好还是远离这些奇技淫巧。

  • 每个变量只用于单一用途;
  • 避免让代码具有隐含含义;
  • 确保使用了所有以声明的变量。

核对表:使用数据的一般事项

初始化变量

  • [ ] 每一个字程序都检查其输入参数的正确性吗?
  • [ ] 变量声明位置靠近第一次使用的位置吗?
  • [ ] 尽可能在声明变量的同时初始化变量吗?
  • [ ] 如果无法同时声明和初始化变量,有没有在靠近第一次使用变量的位置声明变量?
  • [ ] 计数器和累加器经过了适当的初始化吗?如果需要再一次使用,之前重新初始化了吗?
  • [ ] 适当地重新初始化”需要重复执行的代码里的变量“了吗?
  • [ ] 代码在通过编译器编译的时候是不是没有警告信息?
  • [ ] 如果你用的语言允许隐式声明,你为由此可能引发的问题做好补偿措施了吗?

使用数据的其它事项

  • [ ] 如果可能,所有变量都被定义为具有最小作用域了吗?
  • [ ] 各变量的引用点都尽可能集中在一点吗?对同一变量的再次相邻引用,或者变量的整个生命期都这样做了吗?
  • [ ] 控制结构符合数据类型吗?
  • [ ] 所有声明的变量都用到了吗?
  • [ ] 变量在合适的时间绑定了吗?——也就是说,你有意识地在晚期绑定所带来的灵活性和增加的复杂度之间做出了平衡了吗?
  • [ ] 每个变量都有且仅有一项用途吗?
  • [ ] 每个变量的含义都很明确且没有隐含含义吗?

要点

  • 数据初始化过程很容易出错,所以请用本章描述的初始化方法来避免由于非预期的初始值造成的错误;
  • 最小化每个变量的作用域。把同一变量的引用点集中在一起。把变量限定在子程序或类的范围内。避免使用全局数据;
  • 把使用相同变量的语句尽可能集中在一起;
  • 早期绑定会减低灵活性,但有助于减小复杂度。晚期绑定可以增加灵活性,同时增加复杂度;
  • 吧每个变量用于唯一的用途。
相关文章
相关标签/搜索