这是本专题中最后一篇文章,我们来聊聊如何养成好的编程习惯。人们总说,养成一个良好的习惯将使我们受益一生。在软件开发这个行业,良好习惯的养成尤为重要。对于一个从事软件开发工作的人而言,C语言只是一个开始。今后,你会接触到其他各种各样的程序设计语言。这些语言表面看来千差万别,但却有着千丝万缕的联系。那时候,你在C语言学习中养成的编程习惯和思维方式将会和新的语言一起陪伴你走完后面的路。
在真实的软件产品开发中,我们面对的绝大多数问题都和开发人员编程习惯不好有关。当别人花费大量时间帮你定位问题,结果发现是由于你犯了一个极为低级的错误时,你失去的将是队友的信任。
那么,究竟如何培养良好的编程习惯呢?你可以从以下方面做起。
1. 函数参数检查
对于一个函数而言,参数的合法性是正常执行的基础。在成熟的软件产品中,用来检查参数合法性的代码甚至会超过总代码的50%。在大型项目中,每个模块中的参数检查代码相当于大型商场里的防火闸门。一旦出现问题,能够把整个程序隔离成独立的小单元,以便开发者能够迅速定位问题,修改Bug。
参数检查让我们的程序拥有更强的健壮性。
2. 数组越界检查
只要用到数组,我们脑海中就要有一根数组越界的弦绷着,随时保持警惕。数组越界是最难被发现的灾难性问题,常常让人花费大量时间去定位问题。
3. 变量初始化
这件事时常被忽略。并非大家不知道它的重要性,实在是很多时候想着先定义再初始化,结果却并非自己想象的那么简单。看下面这段代码:
int x = 1;
int cnt;
...
if (x == 1)
{
cnt = 0;
}
else
{
if (cnt++ = 1)
{
...
}
}
显然,有这样的可能性,执行cnt++时它还没被初始化。之后,就是程序出现各种莫名其妙的错误,你甚至开始怀疑你的眼睛。所以,养成习惯在定义变量时就立刻初始化,写成int cnt = 0; 这样即使程序出现什么问题都很容易定位。
4. 内存申请后判断结果
在我们调用malloc申请内存空间时,一定要判断是否成功。例如下面这段代码:
int* pBuf = (int*)malloc(10 * sizeof(int));
if (pBuf == NULL)
{
return -1;
}
如果没有if语句,申请了空间之后直接操作。那么如果由于系统原因申请空间不成功,那么就会出现可怕的内存泄露错误。
5. 注意空指针
这一点有两个含义:
- 不再使用的指针要手动置为NULL
- 使用指针前一定要判断是否为NULL
6. 复杂代码加注释
注释不仅是给被人看的,大部分时间是给自己看的。在维护自己写的代码时,很多时候看注释比看大段代码本身效率更高。
7. 避免立即数
需要立即数的时候一定要想到使用宏定义的方式。这样方便后期维护。当需求变更或者软件升级的时候,立即数就是灾难。
8. 多使用标准库函数
在实现一些常用功能时,尽量调用标准C库函数实现。这样方便代码的维护和移植。比如,字符串拷贝就要用strcpy()函数。
9. 注意代码对称性
malloc()和free()永远要成对出现,否则一定出问题。
10. 函数参数个数不要太多
一般,每个团队的代码规范中都会要求不许超过多少个参数。一般超过后就写成结构体的方式传递。
11. 用snprintf()代替sprintf()
sprintf()的写入没有任何限制,容易出现内存溢出。所以尽量使用snprintf()来控制写入长度。这样能够提高程序的安全性。
12. 做好代码备份
写代码最大的悲剧莫过于写了好久的代码突然没有了。经历过这种事的人永远都不会希望经历下一次。不过还有一些人经历过不止一次。这就是坏习惯的问题。
目前比较流行的git和SVN能够很好的帮助我们管理好代码,做好版本控制工作。在我的其他专题中也讲过git的使用方法。希望大家多做练习,养成好的编程习惯。
这个专题终于写完了,真没想到战线拉了这么长。持续更新真是一件需要毅力的事情,我总是被项目进度影响文章的更新。感谢那么多人依然关注我写的东西,也很欣慰有人能从中得到帮助。
发来邮件交流的朋友们大部分都觉得讲具体项目的部分比较实用,后面会多写一些这方面的东西。希望大家继续关注。
我是天花板,让我们一起在软件开发中自我迭代。
如有任何问题,欢迎与我联系。