有没有办法比较两个方法是否等效于函数(即它们做同样的事情)而不是等价值(即方法中的所有代码是相同的)?
例如,这两种方法的编码方式不同,但执行相同的功能。
public int doIt(int a, int b) {
a = a + 1;
b = b + 1;
return a + b;
}
public int doIt2(int z, int x) {
int total = z + x + 2;
return total;
}
我一直在寻找一种方法在Eclipse中做到这一点,但我感兴趣的是,这甚至可能超越一个简单的方法。
答案 0 :(得分:3)
100%的唯一方法是在数学上证明它
有办法:
等
尽管这些方法可能非常困难,但有时可能需要数天时间才能证明它甚至是琐碎的程序甚至是几天来产生足够的抽象级别。
有一些启发式方法,但显然它们不是100%准确(启发式)
一种简单的启发式方法是尝试两种方法来输入1000个输入并查看结果是否相同
编辑:
这是我在维基百科上找到的模型检查器列表。我还没有使用它们,它们可能不是你想要的。
答案 1 :(得分:1)
忽略副作用,2个函数在功能上是等效的,如果对于相同的输入,它们会产生相同的输出。
这只适用于纯代码。由于功能执行的副作用可能是任何事情,因此我无法监视一般的副作用。
注意,如果不测试每个可能的输入,就没有办法完全验证这一点。如果输入只是一个有限的枚举,那可能很容易。例如,如果它是2个整数,则组合的总数将是巨大的。
答案 2 :(得分:1)
通常,重构的目的是让函数在重构之前和之后的行为相同。开发人员通常通过创建大量单元测试,测试正常,边缘和异常情况来实现此目的。
在OP的两个要比较的函数doIt
和doIt2
中,给定任何整数输入a和b,它们通常可以返回相同的答案。单元测试将证明这一点。
但是如果a或b是Java可以存储的最大整数MAX_VALUE
怎么办?
如果a=a+1
产生副作用怎么办?
在这些情况下,表面上的两个函数可能看起来相似,但会产生不同的结果。