编写可读代码的艺术-代码应当易于理解
可读性基本定理——代码的写法应当使别人理解它所需的时间最小化
如果真的有人真的完全理解了你的代码,他就应该能改动它、找出缺陷并明白它是如何与你代码的其他部分交互的
就算你从事只有一个人的项目,这个目标也是值得的。那个其他人可能就是6个月的你自己,那时你自己的代码看上去已经很陌生了。而且你永远也不会知道——说不定别人会加入你的项目,或者你丢弃的代码会在其他项目里重用
把信息装到名字里
-
避免泛泛的名字(例如tmp和retval)
tmp这个名字只应用于短期存在且临时性为其主要存在因素的变量
retval这个名字没有包含很多信息,用一个描述该变量的值的名字来代替它
像i、j等名字常用作所有索引,但有时候会有比i、j、k更贴切的命名。
例如多重循环的时候,使用了错误的索引,这样的缺陷很难发现,使用更精确的名字可能会有帮助(索引的第一个字母与数据的第一个字符匹配) -
用具体的名字代替抽象的名字
在给变量、函数或者其他元素命名时,要把它描述得更具体而不是更抽象 -
使用前缀或后缀来给名字附带更多信息
1.为名字附带更多信息
一个变量名就像是一个小小的注释。尽管空间不是很大,但不管你在名中挤进任何额外的信息,每次有人看到这个变量名时都会同时看到这些信息。
因此,如果关于一个变量有什么重要的事情的读者必须知道,那么是值得把额外的词添加到名字中的。
例如,假设你有一个变量包含一个十六进制字符串
string id;//例如:af84ef845cd8
如果让读者记住这个ID的格式很重要的话,你可以把它改成hex_id2.带单位的值
如果变量是一个度量的话(如时间长度或者字节数),那么最好把名字带上它的单位3.附带其他重要属性
这种给名字附带额外信息的技巧不仅限于单位。在对于这个变量存在危险或者意外的任何时候你都该采用它例如:
但不应该给每个变量都加上这样的属性,基本上,如果这是一个需要理解的关键信息,那就把它放在名字里 -
决定名字的长度
当选择好名字时,有一个隐含的约束就是名字不能太长。
名字越长越难记,在屏幕上占的地方也越大,可能会产生更多的换行另一方面,程序员也可能走另一个极端,只用单个单词(或者单一字母)的名字
有一些指导原则:
在小的作用域里可以使用短的名字
作用域小的标识符不用带上太多信息,因为所有的信息(变量的类型、它的初值、如何析构等)都很容易看到,所以可以用很短的名字
反之,如果一个标识符有较大的作用域,那么它的名字就要包含足够的信息以便含义更清楚输入长名字——不再是个问题
有很多避免使用长名字的理由,但不好输入这一条已经不再有效。我们所见到的所有的编程文本编辑器都有内置的单词补全功能
首字母缩略词和缩写——团队的新成员能否理解这个名字的含义?
程序员有时候会采用首字母缩略词和缩写来命令,以便保持较短的名字,例如,把一个类命名为BEManager而不是BackEndManager。这种名字会让人费解。
而使用eval来代替evaluation,用doc来代替document,用str来代替string是相当普遍的,因此团队的新成员看到FormatStr()可能会理解它是什么意思,然而,理解BEManager可能有点困难丢掉没用的词
有时名字中的某些单词可以拿掉而不会损失任何信息。例如ConvertToString()就不如toString()这个更短的名字,而且也没有丢失任何有用的信息 -
利用名字的格式来表达含义
有目的地使用大小写、下划线等——例如:可以在类成员和局部变量后面加上_来区分它们