在软件开发中出现Bug似乎是再正常不过的事情了。作为软件开发工程师,谁敢说自己写的代码没有出现过Bug。甚至有的程序员自嘲自己的开发工作是在写Bug。所以,在软件开发中出现Bug太正常了。但是,你有没有考虑过,如何在软件开发中预防出现Bug?
我们知道Bug发现的越早成本越低,发现的越晚,成本越高。估计很多人没有这个体会,也有很多人有这个体会。这对于小规模的代码其实不太明显,但大规模的,复杂的软件就非常明显。因为在代码量非常大的情况下,抓出一个Bug并非容易的事情。
示例
别说大规模代码了,大家看看这个下面代码。这个代码中print_gender用于根据参数打印性别字符串。但是在实际使用的时候发现打印的总是man,而无法打印woman,大家能看出问题在哪吗?
现在代码比较少,估计很多人一下子就看出来了。但是如果在一个规模非常大的函数中找到类似的错误还是比较困难的。
看到没?
是的,就是函数中if语句中的条件写错了。其实这个是一个非常低级,而且很容易产生的错误。我们在快速的敲键盘的时候,很有可能漏了一个等号,就产生这个结果了。
- if ( is_male = true )
如何尽早发现问题
尽早发现问题当然是最好的,但是能早到什么时候呢?如何尽早发现问题呢?
最早的时间点应该是编译器编译的时候。我们在写代码的时候经常会出现编译器无法通过的情况。如果我们能够将程序的错误能够在该阶段解决,那么自然是非常好的,但却不可能全部在这个阶段解决。我们可以做到尽量在这个阶段来解决。
比如前面的错误,我们是可以借助编译器在编译阶段来搞定的。聪明的你知道如何做吗?
我们可以将上面的if语句写成如下的样子:
- if ( true = is_male )
也就是将常量写到前面,而变量写到后面。这样,如果缺少等号的情况下就会出现编译错误。因为我们是无法为一个常量赋值的。如果没有缺少等号的情况下是可以编译通过的。
这里只是一个例子,我们可以在很多地方借助编译器来提高我们的代码质量,而避免在后期出现逻辑的错误。我们再举一个例子。
在C/C++中const是经常用到的关键字,比如下面这个store_name函数,我们本来是想将传入的参数存储在函数中的临时变量,然后进行后续的分析。但是由于马虎,将strcpy的参数搞反了。如果在参数中使用了const关键字,则可以起到预防的作用,从而避免错误。
可以看出,通过这种方式可以有效的避免开发中由于低级错误而产生的软件Bug。而且由于问题会比较早的发现,整个修复的成本会低很多。