你使用断言吗?

这不是一个“问题”所以我正在制作CW。

assert 

关键字太棒了!

它应该让你觉得你的自己对你编写的代码更有信心,但是,直到今天我创建一个小型测试类(<20行)时,我才意识到自从它被引入以来从未使用它。

哎呀! 我几乎没有使用记录器,这确实非常有用,但直到今天我才意识到我不使用断言。

你使用断言吗? 如果不是,那是什么原因?

我被教导在90年代使用了很多断言,他们很有道理。 这是一个很好的防御性编码。

但是,我认为现在已经被unit testing所取代,这实际上会强制代码运行并告诉它在哪里被破坏。 调试断言需要有人实际运行调试代码并查看ui或日志。 unit testing可以自动化。

我一直都在使用它们。 它们是练习“早期崩溃”理念的好方法,最好必须解决为什么断言失败而不是必须处理坏/损坏的输出。

问题是你必须养成一种习惯。 我很少看到其中的任何中间立场,人们要么不习惯它,几乎从不使用它们,或者人们使用它们,并且它们在整个代码中严格散落。 你只需要注意到“哦,嘿,我在这里不假思索,让我明确确认它’断言(假设)’”

我使用断言来确保我不会在代码中引入错误。 如果我知道一个值应该在一个映射中,我断言(使用assert关键字)。 如果我知道参数永远不应该为null,那我就断言了。 如果我知道参数可以为null,那么我将检查它并抛出相应的exception。

我在Code Complete或Effective Java上阅读它 – 应该使用断言来检测编程错误 – 应该使用exception来处理exception但可能的情况。 如果您知道该值不为null(由合同定义),则不需要在代码上的每个方法上检查null,但如果值不为null则断言也没有坏处。 仅当您为VM指定​​参数-ea时才会启用断言,如果禁用,它们不应影响应用程序的性能。

您也应该使用更多日志:-)。 了解何时使用跟踪,调试和信息,并确保记录应用程序执行的所有操作。 当您必须弄清楚为什么某些东西在生产环境中不起作用时,它会让生活变得如此简单。

简短回答 – 是的。

答案很长 – 并不总是,但经常。 我通常使用断言来解决错误,我知道我无法做任何事情(当程序运行时)并且实际上并不需要记录。 例如 – 如果我必须检查某个值是否超出范围,或者指针是否为NULL,即使它应该有一些值。

对于“解析文件”和“无法找到文件”等其他内容,我通常会抛出exception。 这样我就可以记录错误并使用一些故障安全文件/方法代替。

而且我非常赞同Falaina,你真的应该注意到 – “嘿!我在这里做了一些假设”

引入unit testing后断言的唯一实际用途是将方法的不变量传递给其他程序员。 在实际代码中执行此操作要比在他们无论如何都会忽略的注释中更好。 很难忽视断言!

我不使用它们。 unit testing应该足以测试您的代码。 此外,由于默认情况下它们已被禁用,因此它们通常会被完全忽略。 然后他们只是倾向于用无用的断言来混淆你的代码,这些断言可以更好地表达为注释。

但是,如果你确实需要这个,那么一些库有你可以调用的断言静态方法,这些方法不会被跳过 – 这些方法也更具可读性,因为assert关键字不常见并且可能立即导致“wtf”时刻,但是Assert .x方法只是可以追溯的方法。 特别是Spring框架使用断言库。

不,从不使用它们。 不知道为什么,只是从来没有习惯。

如果你喜欢断言,你会喜欢合约。 它们基本上是将断言扩展到更多情况的想法。

是! 总是! 关键字是我在每种语言中最好的朋友!

没有真正的理由不使用断言,它们确保我对输入值和状态所做的基本假设得到维护。

如果断言失败,则意味着我需要重新评估我的假设并更新代码以处理在编写当前版本时我没有想到的新奇特输入。 有什么不喜欢的?

像往常一样在编程中,它只是在正确使用时才是强大的工具。

是的,我一直使用断言,基本上每当我假设:

  1. 可以使用相当简单的谓词进行检查。
  2. 仅仅通过阅读附近的代码显然不是真的。

但是,对于可能对性能产生微不足道影响的断言,我使用D编程语言标准库中的enforce函数而不是assert 。 这与assert基本相同,只是它在发布模式下保持不变。 对于更昂贵的断言,我使用assert ,它从发布模式构建中剥离。

我倾向于检查错误情况并反而抛出exception。 原因是我希望始终检查这些条件,即使在生产中也是如此,并且exception提供了更容易处理失败条件而不是断言。

Java assert关键字相当一半(需要使用-ea命令行选项运行程序),所以我发现自己依赖于exception而不是断言。

我倾向于不使用它们,虽然我也不确定为什么。

如果您进行unit testing,例如使用nUnit,您显然会一直使用它们来validation测试结果。

不,我不使用它们。

我被教导,断言不应该用在’生产’代码中,并且在我开始使用我必须删除的东西之前 – 根据我所学到的 – 我坚持使用exception来validation条件。

我从来没有习惯使用它们,但是我调试上一个程序的时间非常糟糕,并且在某一时刻记录变量为空或不包含我期望的值。 一旦我完成所有工作,我断言我的程序所需的一切,以便成功运行。

不,但是等不及了。 我曾经用junit对所有东西进行unit testing,但那是学校,小项目没有压力。 我现在在现实生活中,我应该昨天完成这个代码….