怎么减少错误的发生
错误,我们暂且仅对软件开发而言。
错误的类别,暂且仅考虑接口错误和实现错误。
- 接口错误
- 一般可以分为误解和失配
- 误解
比如在一段公路入口有巨大的标识牌,上面写着:前方道路,靠左行,红灯行,绿灯停。这个大家可能觉得很荒谬,然而类似的事情在软件开发里面却层出不穷,生产方认为自己已经在文档中清楚地说明了用法和用途,然而他却没有意识到这与使用方的常识和惯例背道而驰。举个简单的例子,C 标准库里面的两个函数:
1 2 3 4 |
#include <stdio.h> size_t fwrite(const void * ptr, size_t size, size_t count, FILE * stream); #include <stdlib.h> void qsort(void * base, size_t num, size_t size, int (* comparator)(const void *, const void *) ); |
我不知道有多少人用过这两个函数,但是,大体上,应该是用 fwrite 的人多,而用 qsort 的人少。而用 fwrite 的人,大多数情况下,传递的 size 都等于 1,并且,一般情况下,size 和 count 搞反了也不会有啥大问题,除非判断了返回值。然而,一旦用多了 fwrite,并且吧 ObjectSize, ObjectCount 这个顺序当成了一个常识,再使用 qsort 的时候,就悲剧了!
还有一个例子:stl 的 range,一般表示为前闭后开的 [begin, end) 区间,如果你要搞一个前开后闭的 (begin, end] 区间,大家都会疯掉不可。我确实曾经被这样的 (begin, end] 疯掉过。
-
- 失配
一般情况下,发生在版本兼容问题上。我仅举一个简单例子:在Bash3.x中,[[]] 中的正则表达式会按Bash的quoting removal 规则进行处理,也就是说对于一般的正则表达式,加单引号,双引号,和不加引号,都没有区别,然而到了Bash4.x,如果加了引号,就悲剧了!Bash4.x会把引号当成正则表达式的一部分!
-
- 另一种接口错误
最近我在挤地铁时发现了另一类错误,看上去似乎不属于这两种:人很挤的时候,在地铁楼梯上,经常发现,人们走的是左边,而不是右边,稍微用心一下,就会发现这是什么原因——人们总是按贪心算法走最短路径,刚下地铁的人,会走挨地铁(车厢)的楼梯一侧,而这一侧正好是左边,上面往下走的人,却是走右边。在人流量不大的时候,这不是什么问题,然而,当人流汹涌时,造成的拥堵让大家都很郁闷。
怎么解决这个问题呢?——那就是在设计地铁站时,让贪心算法的最短路径是右边,而不是左边。再General一点,就是:设计要遵守人们的思维习惯。
在程序设计上,如果我们设计的接口符合人的思维习惯,可以大大减少错误的发生。在 C 里面,至少有两处设计违反人的直觉,不过还好,这两处早被 deprecate 了:
-
-
- 函数的默认返回值为 int,而非 void
- f() 表示可接受任意个参数,返回值为 int 的函数。
-
- 实现错误
一般情况下,就是指我们程序的逻辑错误
[e01]
[e01]
[e03][e03][e03][e03]
多多注意。。。
[e01]
今天碰到的一个错误:实施人员在一个xml文件中更改了一个重要参数,由于更改的那台机器上没装什么文本编辑软件,因此直接用记事本修改,后来这个问题搞了我们半天(这块的程序是我开发的),后来仔细分析了下报错的日志,才断定是编码问题。
[e08]
回复 yushouling:误解
[e01]
接口的定义要能清晰的说明该接口的作用,其实最好的减少错误发生的方法,还是要不断的重构代码
[e03]
毛主席说:“决定战争胜负的关键因素是人不是武器。”
[e01]