自信编程的好处

时间:2009-04-24 21:30:06

标签: debugging assertions

将断言放入代码中有什么意义?自信编程有什么好处?

private void WriteMessage(string message)
{
    Debug.Assert(message != null, "message is null");

    File.WriteAllText(FILE_PATH, message);
}

例如,我们可以检查消息变量并在此处抛出异常。为什么我在这里使用assert?或者这是一个错误的例子,看到断言的好处?

7 个答案:

答案 0 :(得分:9)

他们也支持快速失败的哲学,Jim Shore在this article中解释。

答案 1 :(得分:7)

有些人会写:

/*
 * This can never happen
 */

写起来更实用:

assert(i != -1);

我喜欢使用断言,因为它们很容易通过简单的编译时间常量关闭,或者做一些其他事情,比如准备错误报告。在释放某些东西时,我通常不会打开断言(至少不是以通常的方式)。

使用它们使我免于在其他人的计算机上犯下非常愚蠢的错误......那些喜欢测试我的alpha代码的勇敢的灵魂。使用它们加上像valgrind这样的工具有助于保证在提交之前我抓到了一些可怕的东西。

答案 2 :(得分:2)

要考虑的一个重要区别是您希望通过断言捕获哪些错误。我经常使用断言来捕获编程错误(即,调用具有空参数的方法)和处理验证错误的不同机制(例如,传入错误长度的社会安全号码)。对于断言捕获的编程错误,我想快速失败。对于验证错误,我希望不那么频繁地响应,因为数据中存在错误可能是正常的(例如,用户正在进行某种类型的数据输入)。在这些情况下,正确的处理可能是将错误报告给用户并继续运行。

答案 3 :(得分:1)

如果方法有一个指定的前置条件来获取非空消息参数,那么一旦前置条件不成立,你希望程序失败,然后必须是bug的来源固定的。

我认为在开发安全关键软件时,断言更为重要。当然,当软件被正式指定时,你宁可使用断言。

答案 4 :(得分:1)

有关断言(以及与代码构造相关的许多其他主题)的精彩讨论,请查看Steve McConnel的Code Complete。他用了整整一章来有效地使用断言。

答案 5 :(得分:1)

我使用它们来验证我是否已经提供了有效的依赖类。对于构造函数DI中的exmaple,您通常接受某种依赖于提供某些操作或服务的外部类。

所以你可以断言(classRef! - null,“classRef不能为null”);而不是等待你将消息传递给classRef并获得一些其他异常,例如异常:访问冲突或同样含糊不清的东西,可能不会立即看到代码。

答案 6 :(得分:0)

测试我们的假设是非常有用的。断言不断确保不变量成立。简而言之,它用于以下目的,

  • 它允许实施快速失败系统。
  • 由于副作用,减少错误传播
  • 由于用户数据或后续代码更改,系统禁止(进行完整性检查)系统进入不一致状态。

有时,当我们不想使用try / catch / throw时,我赞成使用assert_return()。

private void WriteMessage(string message)
{
    assert_return(message != null, "message is null"); // return when false
    File.WriteAllText(FILE_PATH, message);
}

我建议assert_return()通过在测试版本中报告错误来暂停应用程序。然后在生产系统中,它应该记录并错误并从函数返回说它不能这样做。