养成良好的编程习惯

养成良好的编程习惯

看一个作家的水平,不是看他发表了多少文字,而要看他的废纸篓里扔掉了多少。同样。评价一个程序员,不是看他写了多少行代码,而是要看他删掉了多少无用的代码。

代码模块化

这里的模块化,不是单纯的把代码切割开来,分放在不同的位置,其实非但不能达 到模块化的目的,而且制造了不必要的麻烦。真正的模块化不是文本意义上,而是逻辑意义上的模块化,其实就是函数

较为优秀的模块化,需要注意以下几点。

  • 单个函数的行数尽量不要超过40行。一般笔记本电脑屏幕所能容纳的代码行数是50行。我可以一目了然的看见一个40行的函数,而不需要滚屏。

  • 注意提取出工具函数。重复的代码,不管它有多短,提取出去做成函数,都可能是会有好处的。

  • 每一个函数只做单一的功能。这样可以保证编程逻辑清晰。

  • 避免使用全局变量和类成员传递信息,尽量使用局部变量和参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A {
String x;

void findX() {
...
x = ...;
}

void foo() {
findX();
...
print(x);
}
}

由于x属于class A,这样程序就失去了模块化的结构。由于这两个函数依赖于成员x,它们依赖全局的数据。findX和foo不再能够离开class A而存在,而且由于类成员还有可能被其他代码改变,代码变得难以理解,难以确保正确性。

1
2
3
4
5
6
7
8
9
String findX() {
...
x = ...;
return x;
}
void foo() {
int x = findX();
print(x);
}

减少无用的注释

很多人觉得很多注释可以增加代码可读性,实际上,过多的注释充斥在代码中间,让程序变得障眼难读。而且维护注释需要很多精力,得不偿失。

事实上,优秀的程序员编写的代码本身就具有很好的可读性。尽量只在代码逻辑复杂,不易理解的时候使用注释,增加可读性。

下面给出一些增加代码可读性的技巧:

  • 函数名和变量名要有意义。
1
2
//xiaoming eat apple.
eat(xiaoming,apple);

这样的代码根本不需要注释来解释它在干什么。

  • 局部变量定义依据就近原则。

比较下面两段代码

1
2
3
4
5
6
7
void fuc() {
int index = ...;
...
...
bar(index);
...
}
1
2
3
4
5
6
7
void fuc() {
...
...
int index = ...;
bar(index);
...
}

前者当阅读到bar(Index)时,需要不断向前寻找index来源以及是否改变过,大大降低了可读性,而后者就很容易就看到了index。

  • 局部变量名字尽量简短。

  • 把复杂的逻辑提取出去,做成“帮助函数”。

逻辑不清晰的那片代码,往往可以被提取出去,做成一个函数,然后在原来的地方调用。由于函数有一个名字,这样你就可以使用有意义的函数名来代替注释。

  • 不要省略中间变量。

  • 在合适的地方换行。

1
2
3
4
if (someLongCondition1() && someLongCondition2() && someLongCondition3() &&
someLongCondition4()) {
...
}
1
2
3
4
5
6
if (someLongCondition1() &&
someLongCondition2() &&
someLongCondition3() &&
someLongCondition4()) {
...
}

显然后者更加容易阅读。

代码越简单越好

并不是语言提供什么,你就一定要把它用上的。实际上你只需要其中很小的一部分功能,就能写出优秀的代码。

  • 永远不要省略花括号。

  • 考虑条件的所有可能。有If就不要省略else,相信我,这个习惯可以帮你节省不少DEBUG的时间。

参考资料

正义的花生-简书

我的博客