看一个作家的水平,不是看他发表了多少文字,而要看他的废纸篓里扔掉了多少。同样。评价一个程序员,不是看他写了多少行代码,而是要看他删掉了多少无用的代码。
代码模块化
这里的模块化,不是单纯的把代码切割开来,分放在不同的位置,其实非但不能达 到模块化的目的,而且制造了不必要的麻烦。真正的模块化不是文本意义上,而是逻辑意义上的模块化,其实就是函数。
较为优秀的模块化,需要注意以下几点。
单个函数的行数尽量不要超过40行。一般笔记本电脑屏幕所能容纳的代码行数是50行。我可以一目了然的看见一个40行的函数,而不需要滚屏。
注意提取出工具函数。重复的代码,不管它有多短,提取出去做成函数,都可能是会有好处的。
每一个函数只做单一的功能。这样可以保证编程逻辑清晰。
避免使用全局变量和类成员传递信息,尽量使用局部变量和参数。
1 | class A { |
由于x属于class A,这样程序就失去了模块化的结构。由于这两个函数依赖于成员x,它们依赖全局的数据。findX和foo不再能够离开class A而存在,而且由于类成员还有可能被其他代码改变,代码变得难以理解,难以确保正确性。
1 | String findX() { |
减少无用的注释
很多人觉得很多注释可以增加代码可读性,实际上,过多的注释充斥在代码中间,让程序变得障眼难读。而且维护注释需要很多精力,得不偿失。
事实上,优秀的程序员编写的代码本身就具有很好的可读性。尽量只在代码逻辑复杂,不易理解的时候使用注释,增加可读性。
下面给出一些增加代码可读性的技巧:
- 函数名和变量名要有意义。
1 | //xiaoming eat apple. |
这样的代码根本不需要注释来解释它在干什么。
- 局部变量定义依据就近原则。
比较下面两段代码
1 | void fuc() { |
1 | void fuc() { |
前者当阅读到bar(Index)时,需要不断向前寻找index来源以及是否改变过,大大降低了可读性,而后者就很容易就看到了index。
局部变量名字尽量简短。
把复杂的逻辑提取出去,做成“帮助函数”。
逻辑不清晰的那片代码,往往可以被提取出去,做成一个函数,然后在原来的地方调用。由于函数有一个名字,这样你就可以使用有意义的函数名来代替注释。
不要省略中间变量。
在合适的地方换行。
1 | if (someLongCondition1() && someLongCondition2() && someLongCondition3() && |
1 | if (someLongCondition1() && |
显然后者更加容易阅读。
代码越简单越好
并不是语言提供什么,你就一定要把它用上的。实际上你只需要其中很小的一部分功能,就能写出优秀的代码。
永远不要省略花括号。
考虑条件的所有可能。有If就不要省略else,相信我,这个习惯可以帮你节省不少DEBUG的时间。