断言可以用于维护循环不变量和检查程序正确性吗
Could Assertions be used for maintaning loop invariants and checking program correctness
最近看到this个问题,觉得提问的人在某种程度上是正确的。答案告诉我们不应该使用断言来执行我们程序中的任何任务。
但是断言可以作为维护循环不变量和程序不变量的简单代码,因此我们可以在一定程度上检查程序的正确性。
为什么即使我们有 if else 也需要断言??它只是测试一个布尔表达式,类似的事情可以通过 if -else 梯形图来完成,那么为什么还要创建一个新的关键字断言呢?
A 'task in your program',在上下文中,意味着应该做的事情,并且理想地测试。
不仅是:
assert p != null
比
更短更简单
if (p == null) throw new IllegalArgumentException("p is null");
使它成为一个断言清楚地表明它是一个内部约束,而不是一个指定的行为。所以你不需要另外 4 行来测试它。
当然,有时明确指定的行为是您想要的,例如public长寿命的API。
换句话说,虽然它们很相似,但在 if/throw 正确的地方使用断言是有点错误的,反之亦然。
尽管如此,很多 Java 代码并不关心断言,因为这样就少了一个决定。如果它不存在,我不确定它是否会被添加到语言中...
最近看到this个问题,觉得提问的人在某种程度上是正确的。答案告诉我们不应该使用断言来执行我们程序中的任何任务。
但是断言可以作为维护循环不变量和程序不变量的简单代码,因此我们可以在一定程度上检查程序的正确性。
为什么即使我们有 if else 也需要断言??它只是测试一个布尔表达式,类似的事情可以通过 if -else 梯形图来完成,那么为什么还要创建一个新的关键字断言呢?
A 'task in your program',在上下文中,意味着应该做的事情,并且理想地测试。
不仅是:
assert p != null
比
更短更简单if (p == null) throw new IllegalArgumentException("p is null");
使它成为一个断言清楚地表明它是一个内部约束,而不是一个指定的行为。所以你不需要另外 4 行来测试它。
当然,有时明确指定的行为是您想要的,例如public长寿命的API。
换句话说,虽然它们很相似,但在 if/throw 正确的地方使用断言是有点错误的,反之亦然。
尽管如此,很多 Java 代码并不关心断言,因为这样就少了一个决定。如果它不存在,我不确定它是否会被添加到语言中...