表面内容
1.代码的写法应当是别人理解他所需的时间最小化。一条注释可以让你更快理解代码。尽管减少代码行数是一个好目标,但是八里街代码所需的时间最小化是一个更好的目标。
2.选择专业的词,比如函数名使用getxxx(),这个get没有表达出很多信息,是从缓存中得到?从数据库中得到?或者从网络得到?如果是网络,可以用更专业的fetchxxx()或者downloadxxx()
3.tmp,retval这样泛泛的名字,可以根据情况命名,比如tmpFile,让人知道变量是一个临时的文件。(tmp这个名字只应用于短期存在且临时性为其主要存在因素的变量)
4.for循环嵌套的情况,以前习惯使用i,j,k这样处理。但是如果一旦嵌套中的索引使用错误(应该使用k,结果手误写成i这种情况),要查起来比较困难,可以使用classA_i,classB_i,classC_i这种形式,这样缺陷会更见明显,因为一旦数据使用的索引所代表的类型和数据的类型不一致,一眼而见。
5.一个变量名就像一个小小的注释,尽管空间不是很大,但是不管你在名中挤进任何额外的信息,每次有人看到这个变量名时都会同时看到这些信息。比如:
string id;//eg:"af84ef845cd8"
如果想要读者记住这个id的格式很重要的话,不妨将它命名为hexId
6.丢掉没用的词,比如ConvertToString(),完全可以写成ToString().
7.通常来讲,加上像is,has,can,should这样的词,可以把布尔值意义变得更明确
8.方法定义,getMean()给函数调用者的感觉是这个一个轻量级的快速的获取中值的方法,computeMean()则是一个计算量更大一点的【计算】出中值的方法。小心用户对特定词的期望。
逻辑内容
1.把条件、循环以及其他对控制流的改变做得越“自然”越好,让读者能够很连贯、不用停下来重读这段代码。
2.相对于追求最小化代码行数,一个更好的度量方式是:最小化人们理解它所需要的时间。比如三目运算符,建议默认情况下都使用if/else,而只有在最简单的情况下才使用三目。
3.避免使用do...while循环,这种代码,很多读者最后会将代码读两遍。
4.嵌套很深的代码很难以理解。每个嵌套层次都在读者的“思维栈”上又增加了一个条件,所以,当读者见到一个右大括号"}"的嘶吼,可能很难“出栈”来回忆起它背后的条件是什么。通过提早返回来减少嵌套;将代码改写成更加“线性”的代码来避免深嵌套。
5.当对代码做改动的时候,从全新的角度审视它,把它当做一个整体来看待。尽量避免单纯的去找最容易插入我需要增加的代码的地方,可能当时修改完之后代码很清晰,但是其他人整体读代码时,可能易读性就不够了。
6.超长表达式拆分成更容易理解的小块。
7.让所有的变量都缩小作用域,并非只针对全局变量,让变量对尽量少的代码行可见:这样可以有效减少读者同时需要考虑的变量的个数。
8.在javascript中,总是使用var这个关键字来定义变量。
重新组织代码
A.抽取出那些与程序主要目的不相关的子问题
B.重新组织代码使它一次只做一件事情。
C.先用自然语言描述代码,然后用这个描述来帮助你找到更整洁的解决方案。
1.如果你在想:“我希望我们的库里有一个xyz()函数”,那么就写一个(如果它还不存在的话),经过一段时间之后,你会建立起一组不错的工具代码,这个工具代码可以应用于多个项目。
2.当使用一个独立的小函数的时候,你会感觉添加功能、改进可读性、处理边界情况等都更加容易。
3.从项目中拆分出来的独立库越多越好,因为代码中的其它部分会更小而且更容易思考。
4.如果你所用的接口并不整洁,你还是可以创建自己整洁的“包装”函数。
以上可以总结为:把一般(通用)代码和项目专有的代码分开。这样做的结果是,大部分代码都是一般(通用)代码。通过建立一大组库和辅助函数来解决一般问题,剩下的只是让你的程序与众不同的核心部分。这么做的原因是:可以让程序员关注小而定义良好的问题,这些问题已经同项目的其它部分脱离开来。其结果是,对于这些子问题的解决方案倾向于更加完整和正确。
5.重新组织代码:将其中一些任务分割到代码中单独的区域来进行改进之后,这些区域相互之间是独立的,当读一个区域的时候,你不必去想起他的区域的内容。难的是要准确地描述出你的程序所做的所有这些小事情。
6.编写精炼代码的一部分工作时了解你使用的库提供了什么。
7.需求常常以微妙的方式互相影响。这意味着解决一半的问题可能只需要花1/4的工夫。
8.让代码库越小、越轻量级,这样越好。创建“工具”代码来减少重复代码;减少无用代码和没有用的功能;让项目保持分开的子项目状态。
《编写可读代码的艺术》读书笔记,布布扣,bubuko.com