文章目录
1、使用变量的一般事项
1.1 变量初始化原则
- 在声明的时候初始化
- 在靠近变量第一次使用的位置初始化它(就近原则)
- 在靠近第一次使用变量的位置声明和定义该变量
- 在可能的情况下使用 final 或者 const
- 注意计数器和累加器在下次使用时是否需要重置
- 在类的构造函数里初始化该类的数据成员
- 检查是否需要重新初始化(比如在循环内多次使用的变量)
- 一次性初始化具名变量;用可执行代码来初始化变量
- 使用编译器设置来自动初始化所有变量
- 利用编译器的警告信息
- 检查输入参数的合法性
- 使用内存访问检查工具来检查错误的指针
- 在程序开始的时候初始化工作内存
1.2 作用域
作用域或者可见性(Visibility)是指变量在程序内的可见和可引用的范围。
应该将每个变量定义成只对需要看到它的、最小范围的代码段可见,缩小变量的作用域:
- 将变量的作用域限定到一个单独的循环或子程序中
- 如果不行,就将可见性限定到某个类内部的那些子程序
- 如果还是不行,就创建一些访问器子程序(java中的get/set方法)来让其他类共享该变量的数据
优先选用局部作用域,其次是类作用域,再次是全局作用域。
1.3 变量的单一职责
1.3.1 每一个变量只用于单一用途
这两个位置使用同一个变量,会使得本无联系的两者看上去似乎彼此相关,可读性较差。
1.3.2 避免让代码具有隐含含义
当变量代表不同事物时让其具有不同的取值集合也是同一个变量具有多个用途的场景。比如用变量pageCount的取值表示已打印纸张的数量,在其值为-1时,用以表明有错误发生。在这个场景中,pageCount在正常情况下表示纸张的数目,是一个整数;然而在其为-1时,用它来表明有错误发生,此时整数类型客串了布尔类型。即使你本人很清楚pageCount变量的含义,但是别人会感到模糊。好的方式是用两种变量来保存两种信息,这会具备更好的清晰度和可读性。
1.3.3 确保使用了所有已经声明的变量
1.4 总结
2、变量的命名
好的变量名是提高程序可读性的关键要素。记住,代码读的次数要远大于编写的次数。
如果你发现需要猜测某段代码的含义,你就应该考虑为变量重新命名
2.1 变量名中的计算值限定词
很多程序都有表示计算结果的变量:Total,Sum,Average,Max,Min,Record,Pointer 等等这样的限定词来修改某个名字,那么请记住把限定词加到名字的最后。
Num限定词的位置是约定成俗的:
- 放变量名的开始位置表示一个总数。比如 numCustomers 表示的是员工的总数。最好换用为 total
- 方变量名的结束位置表示一个下标。比如 customerNum 表示的是当前员工的序号。最好换用为 index
2.2 变量名中的常用对仗词
- begin/end
- first/last
- locked/unlocked
- min/max
- next/previous
- old/new
- opened/closed
- visible/invisible
- source/target
- source/destination
- up/down
2.3 为特定类型的数据命名
2.3.1 循环变量
- 只有几行的循环体,可以使用约定成俗的 i、j、k
- 在循环体内使用的循环外的变量,应该取一个具有意义的名字
- 过长的循环体(比如嵌套循环),应该给循环下标换一个更有意义的名字
2.3.2 状态变量
为状态变量取一个比 flag 更好的名字。标记应该用枚举类型、具名常量或用作具名常量的全局变量来对其赋值。
2.3.3 临时变量
临时变量也要具备可读性。
2.3.4 布尔变量
- 典型的布尔变量名:done、error、found、success、ok
- 不要在布尔变量名前加上is,在判断语句中会降低可读性。if(isFound) 的可读性要略差于 if(found)
- 使用表示肯定的布尔变量名
2.3.5 枚举变量
可以全部大写,也可以使用前缀
2.3.6 具名常量
具名常量应该根据该常量所表示的含义,而不是该常量所具有的数值为该抽象事物命名。比如CYCLES_NEEDED=5
3、基本数据类型
4、全局变量
避免使用全局变量,先考虑是否能作为局部变量,再考虑是否能作为类的成员变量,最后在考虑全局变量。
如果不得不使用全局变量,可以通过get/set方法来取代全局数据。