【问题标题】:Design-by-contract finding pre-conditions按合同设计寻找先决条件
【发布时间】:2016-11-05 18:43:13
【问题描述】:

我必须基于这个接口用 Java 创建一个计算器。

public interface CalculatorIF {
    int add(int x, int y);
    int sub(int x, int y);
    int mult(int x, int y);
    //double div(int x, int y);
    //int sqrt(int x);
}

但是对于每个方法,我都需要前置条件。 我真的需要关于前置条件的帮助,因为我什至无法想象一个有意义且尚未由 Java 处理的单个条件。

编辑:除法和 sqrt 对我来说很清楚,但我需要一些关于 add、sub 和 mult 的想法。

【问题讨论】:

  • 你说的java处理是什么意思?
  • 我的意思是对于我的添加方法,我只能想象作为前提条件 x 或 y 大于 Integer.MAX_VALUE 但这已经由 java 处理。
  • sqrt 的前提条件是非负数?或者对于 div 是y!=0?也许我只是弄错了,但可能就是这样
  • 除以零?负数的平方根? Java 将在除以零的情况下抛出 ArithmeticException 并返回 NaN,在这种情况下,您应该在 sqrt 方法中检查 int x 是否为负数,如果是,则抛出适当的异常...
  • 如果没有什么要检查的,那就没有什么要检查的

标签: java design-by-contract preconditions


【解决方案1】:

如果添加两个 Integer.MAX_VALUE 值,结果将不适合 int 并将被截断。另一方面,如果输入域受到限制,我们总是可以保证结果不会被截断,而是有一个期望值。

例如,如果x <= Integer.MAX_VALUE / 2y <= Integer.MAX_VALUE / 2,那么和x + y 将小于或等于Integer.MAX_VALUE,因此不会截断正整数。类似的推理可以用于负值和Integer.MIN_VALUE。减法的前提条件可以用同样的方法完成。

对于乘法,如果任一操作数的绝对值小于sqrt (Integer.MAX_VALUE),则它们的乘积将在int的范围内。

检测上溢和下溢的更复杂的方法是可能的,但对于课堂练习来说,这样的先决条件似乎很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    相关资源
    最近更新 更多