对assert,防错设计,除错设计的一些认识

来源:互联网 发布:淘宝卖越南新娘 编辑:程序博客网 时间:2024/05/22 06:48

1.assert是什么,做什么用:assert是个宏,多用于函数入口等地方检查参数有效性。

2.assert的设计思想:最大化,在发现非法情况的时候,立即停止程序的执行,尽最大努力保留犯罪现场。

3.assert存在的理由:除错设计的重要手段。

 

4.除错设计:除错设计要解决的是开发阶段的问题,是要帮助除掉程序员编码或者设计过程中的错误,如:设计错误,编码错误,各种各样的不小心,其中就包括了没有做适当防错设计。

5.防错设计:防错设计是程序功能设计的一部分,要解决的是运行阶段的问题,用于保证程序的稳定性,健壮性,防错设计要做的是系统在遇到不可预知发生条件或发生时机的异常状况时通过适当的处理措施尽最大可能保障程序的正常运作,最常见的情况莫过于malloc失败一类和内存使用相关的异常情况,极端的可能包括EMC一类的问题,比如单片机系统设计中的防跑飞处理等。

 

6.防错与除错的关系:

   1).从生存周期的角度来说:防错和除错是重叠的,除错只存在于开发阶段,防错既存在于开发阶段,也存在于运行阶段。

   2).从职能的角度来讲:防错设计保证系统运行阶段的稳定性,除错设计检验程序设计的正确性,因为程序设计的正确性包含了良好的防错设计,所以防错设计的正确与否是由除错设计来检验的。

   3).从使用的策略来讲:除错设计的职责是错误的发现,其使用的策略是最大化错误,使其立即体现出来。

                                  防错设计是要使异常和错误带来的影响最小化,两者是恰恰相反的。

 

综合起来说,除错设计要解决得是开发阶段的问题,它的核心是使问题最快的,以最强烈的方式表达出来以引起开发者的注意,于是,便有了assert, 防错设计要解决得是系统运行阶段的问题,它要处理的其实并不是错误,而是异常情况,它的宗旨是,尽最大努力对系统运行中的异常情况进行检测并处理(包不包括未知BUG带来的异常,这是个很有趣的问题),保证系统的正常运行,可以说,它的做法和除错设计刚刚相反,它是尽量的把异常情况的包围起来,减少对系统运行或其它部分的影响。初看起来,除了各自的生效时间不一样,功能上似乎是完全对立的,但是对立和统一是可以相互转化的,如果设计者在系统中没有做防错处理或者不到位,这就是一个错误,它应该被除错设计检测出来,也就是说,防错设计师需要有除错设计来检验的。

 

 

说起来似乎很拗口,如果用一种所谓的结果导向来看待问题,那么一句话足也:如果在开发阶段出现ASSERT失败,那必然是开发者出现了什么失误,要么是不小心,要么是没做好防错设计,让异常情况蔓延到了这里。