你真的会正确使用断言么?

【伯乐在线导读】:该在程序的什么地方使用断言?很多人都有误解,或者对断言(assertion)理解得并不是那么深刻,作者提出的观点是:断言正是用在条件永远不可能发生的地方。

a


我最近遇到的有些不明白断言要点和作用的程序员,这篇文章是给他们的回复。我曾写过一篇关于断言的文章,我现在仍然觉得那篇文章很好,所以没有必要重复它;本文仅来描述我怎么观察别人对待断言,而我又为什么认为那样错了。

我在审查(review)下面的代码:

有理数模板 Boost.Rational:它通过存储一对整数来实现有理数的概念。我和我同事说:「有可能你会遇到被零 除的情况(导致UB,崩溃等)。

他说:「不,无论何时当 dx 为0,x 也是0(反之亦然)。这就是程序如何运作的。所以 if 语句可以处理它,所以我有信心这不会发生。」

我说:「你为什么不放一个断言,这样每个人都理解你刚刚解释的,像下面这样。」

他回应:「我不想这样做,因为这样或许会导致程序崩溃。」

暂停一下

对话到这里,我明白了些事情。虽然我不是很确定,但我会如下描述。对于某些不会发生的事情,有不同种类或不同强度的理解。很明显,当你键入一个除法,并且你极为肯定地认为除数永远不可能是零,你就会不加检查。显然,只是插入一个断言,或者甚至是插入断言的可能,会改变这个想法。就是这些在潜意识里有一些未被定义的行为,会出现风险,一个断言就会把这些风险纳入到意识层面。

还有个用断言的原因。它们让事情变得更清醒、更有目的性。

最后我的同事把代码改成这样:

这并不是最好的改变。如果你的函数有一个前提条件,你可以尽量把它变得明显一些,而不是把它变成一个防御性的 if。

另外一个有趣的故事,我正在审查下面的代码:

我对同事说:「可能你不希望这个向量在进入函数之前是非空的,那你为什么不加一个断言来标示这一点呢?」

他说:「这个函数只在一个地方被调用而且是默认构造的向量,所以它不可能会是非空的,所以没必要断言。」

暂停一下

就我而言,放置断言的地方恰恰就是你确信这种情况不会发生(除非有bug)。这就是它们存在的理由啊!

收藏 2 评论

关于作者:yottatiana

新浪微博:@丹川黑马 个人主页 · 我的文章 · 11

可能感兴趣的话题



直接登录
最新评论
跳到底部
返回顶部