1、数据认知

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

数据相关的一些概念:

抽象数据类型(abstract data type)、文字量(literal)、数组、局部变量、布尔变量、数据成员、指针、B-树、字符变量、私有、字符串、结构变量、具名常量 etc.

2、关于变量的隐式声明

隐式变量声明对于任何一种语言来说都是最具危险性的特性之一。使用支持不需要预先声明变量的语言开发,容易因拼写错误而使用一个错误的变量。

想要尽量避免隐式变量带来的困扰,可以尝试下面下面这些方法:

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

3、变量初始化原则

不合理的初始化数据是产生编程错误的常见根源之一。不恰当的变量初始化所导致的一系列问题都源于变量的默认值与你的预期不同。下面的行为会产生此类问题:

  • 从未对变量赋值
  • 变量值已经过期
  • 变量的一部分被赋值,另外一部分没有

避免初始化错误的建议:

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

4、作用域

作用域可以看做是一种衡量变量的知名度的方法,作用域或者可见性指的是变量在程序内的可见和可应用的范围。作用域受限或者很小的变量只能在程序的很小范围内可见,反之则在很多地方可见。

使用作用域的规则

  • 使变量引用局部化

    介于同一个变量多个引用点之间的代码可称为“攻击窗口”,可能会有新代码加入到这个窗口中,不当的修改这个变量。

    衡量一个变量不同因用电的靠近程度可以计算该变量的“跨度”,跨度表明了对一个变量引用的集中程度。

  • 尽可能缩短变量的存活时间

    长存活时间意味着一个变量经历了许多语句,而短存活时间意味着只经历很少的语句,计算某一个变量的最初引用点和最后引用点的代码行数(包含最初和最后一条语句)。

    缩短变量存活时间的好处:

    • 减小攻击窗口
    • 使你能对自己的代码有更准确的认识
    • 减少了变量初始化错误的可能
    • 使代码更具可读性
    • 有利于将相关代码重构成子程序
  • 减小作用域的一般原则

    • 在循环开始之前再去初始化该循环里使用的变量,而不是在该循环所属的子程序的开始处初始化这些变量
    • 直到变量即将被使用时再为其赋值
    • 把相关语句放在一起
    • 把相关语句组提取成单独的子程序
    • 开始时采用最严格的可见性,然后根据需要扩展变量的作用域

5、持续性

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

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

与持久性相关的最主要问题是变量实际生命期比你想象的要短。如果你试图在一个变量的正常生命期结束之后访问它的数据,有时会被错误提示告知,但有时旧的数值仍然留在变量里,使你误认为自己用对了变量。

避免上面问题的措施:

  • 在程序中加入调试代码或者断言来检查关键变量的合理取值
  • 准备抛弃变量时给它们赋上一个不合理的指
  • 编写代码时,要假设数据并没有持续性
  • 养成在使用所有数据之前声明和初始化的习惯。

6、绑定时间

对程序维护和更改有很深远影响的一个话题是“绑定时间”:把变量和它的值绑定在一起的时间。 采用越晚绑定时间会越有利。

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

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

8、为变量指定单一用途

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

更多有关《代码大全 2》的读书笔记,请关注 :
http://tabalt.net/blog/code-complete-2-reading-notes/

本文链接:http://tabalt.net/blog/cc2-general-issues-in-using-variables/,转载请注明。