《代码大全
2
》读书笔记
——
变量
(
使用变量的一般事项
)
1
、“变量”在这里同时代表对象和内置数据类型。
2
、要养成良好的创建变量的方法和习惯。
(1)
对支持隐式变量声明的语言,在未声明变量时,编译器会自动声明变量,但这种做法不好。
(2)
对支持隐式变量声明的语言,建议关闭隐式声明、声明全部变量、遵循某种命名规则、检查变量名。
3
、变量初始化
(1)
在声明变量的时候初始化。
(2)
在靠近变量第一次使用的位置初始化。即就近原则,把相关的操作放在一起。
(3)
理想情况下,在靠近第一次使用变量的位置声明和定义该变量。声明指定了变量的类型,定义为变量指定特定的取值,每个变量都应该在声明的同时被定义。
(4)
在可能的情况下使用
final
或者
const
。
final
和
const
关键字在定义常量、输入参数以及任何初始化后其值不再发生改变的局部变量时非常有用。
(5)
特别注意计数器和累加器。注意在下一次使用这些变量之前重置其值。
(6)
在类的构造函数里初始化该类的数据成员。如果在构造函数里分配了内存,就应该在析构函数中释放。
(7)
检查是否需要重新初始化。如果的确需要重新初始化,要确保初始化语句位于那些重复执行的代码内部。
(8)
一次性初始化具名常量;用可执行代码来初始化变量。若想用变量来摸拟具名常量,则在程序开始处对常量做一次初始化即可。对于真正的变量,则应在靠近它们使用位置用可执行代码对其初始化。
(9)
使用编译器设置来自动初始化所有变量。确保记下所使用的编译器设置。
(10)
利用编译器的警告信息。
(11)
检查输入参数的合法性。赋值前确保数值合理。
(12)
使用内存访问检查工具来检查错误的指针。
(13)
在程序开始时初始化工作内存。
4
、变量的作用域
作用域或者可见性指的是变量在程序内的可见和可引用的范围。
(1)
使变量引用局部化。好的做法是把对一个变量的引用局部化,即把引用点尽可能集中在一起,提高程序的可读性。
(
跨度
)
(2)
尽可能缩短变量的“存活”时间,即一个变量存在期间所跨越的语句的总数,开始于引用它的第一条语句,结束于引用它的最后一条语句。可以减少初始化错误的可能,会使代码更具可读性,也会使把相关的代码片断重构为单独的子程序会非常容易了。
(
生存时间
)
5
、减小作用域的一般原则
(1)
在循环开始之前再去初始化该循环里使用的变量,而不是在该循环所属的子程序的开始处初始化这些变量。
(2)
直到变量即将被使用时再为其赋值。让变量的赋值位置越明显越好。
(3)
把相关语句放在一起。
(4)
把相关语句组提取成单独的子程序。
(5)
开始时采用最严格的可见性,然后根据需要扩展变量的作用域。在对变量的作用域进行选择时,应该倾向于选择该变量所能具有的最小的作用域:首选将变量局限于某个特定的循环,然后是局限于某个子程序,其次成为类的
private
变量,
protected
变量,再其次对包
(package)
可见,最后在不得已的情况下再把它作为全局变量。
6
、变量的持续性
(1)
在程序中加入调试代码或者断言来检查那些关键变量的合理取值。如果变量取值变得不合理,就发出警告信息通知去寻找是否有不正确的初始化。
(2)
准备舍弃变量时给它们赋上“不合理的数值”。
(3)
编写代码时要假设数据并没有持续性。
(4)
养成在使用所有数据之前声明和初始化的习惯。
7
、变量的绑定时间
即变量和它的值绑定在一起的时间,采取越晚的绑定时间会越有利。变量与数值绑定时间的情况:
(1)
编码时
(
使用数值硬编码
)
(2)
编译时
(
使用具名常量
)
(3)
加载时
(
从外部数据源中读取数据
)
(4)
对象实例化时
(
如每次窗体创建时读取数据
)
(5)
即时
(
如每次窗体重绘时读取数据
)
一般而言,绑定时间越早灵活性越差,但复杂度也会越低。但希望获得灵活性越强,则支持这种灵活性的代码就越复杂,出错几率也会越高。按照需要引入足够的灵活性来满足软件需求。
8
、数据类型与控制结构
(1)
序列型数据对应程序中的顺序语句。序列型数据是由一些按照特定顺序使用的数据组成的。若在一行中写有五条语句,每条语句都负责处理一项不同的数据,则它们就是顺序语句。
(2)
选择型数据对应为程序中的
if
和
case
语句。选择型数据指的是一组在任一特定时刻有且仅有一项被使用的数据。相应的程序语句必须做出实际的选择。
(3)
迭代型数据对应为程序中的
for
、
repeat
、
while
等循环结构。迭代型数据是需要反复进行操作的同类型的数据,通常保存为容器中的元素、文件中的记录或者数组中的元素。迭代型数据与负责读取数据的迭代型代码
(
即循环
)
相对应。
在使用过程中,可能结合了序列型、选择型和迭代型数据,可以把这几种简单的构造块组合起来描述更复杂的数据类型。
9
、为变量指定单一用途
(1)
每个变量只用于单一用途。
(2)
避免让代码具有隐含含义。
(3)
确保使用了所有已声明的变量。检查代码以确认使用了所有声明过的变量的习惯。
2006年6月3日