Java 有没有办法通过函数而不是值来比较两种方法?

Java 有没有办法通过函数而不是值来比较两种方法?,java,compare,Java,Compare,是否有一种方法可以比较两种方法是否在函数上是等价的(即它们做相同的事情),而不是在值上是等价的(即方法中的所有代码都是相同的) 例如,这两种方法编码不同,但执行相同的功能 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; }

是否有一种方法可以比较两种方法是否在函数上是等价的(即它们做相同的事情),而不是在值上是等价的(即方法中的所有代码都是相同的)

例如,这两种方法编码不同,但执行相同的功能

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中实现这一点的方法,但我感兴趣的是,除了一个简单的方法之外,这是否可能实现。

忽略副作用,如果对于相同的输入,两个函数产生相同的输出,那么这两个函数在功能上是等效的

但这只适用于纯代码。一般来说,我不知道如何监测副作用,因为函数执行的副作用可能是任何东西


注意,如果不测试每个可能的输入,就无法完全验证这一点。如果输入只是一个有限的枚举,那么这可能很容易。例如,如果它是2个整数,那么组合的总数将是巨大的

成为100%的人的唯一方法就是用数学证明它

有以下几种方法:

1-

2-

等等

尽管这些方法可能非常困难,但有时可能需要几天的时间来证明,即使是对于琐碎的程序,甚至需要几天来生成足够的抽象级别

有一些启发式方法,但显然它们不是100%准确(启发式)

一个简单的启发式方法是对1000个输入尝试这两种方法,看看结果是否相同

编辑:

这是我在维基百科上找到的模型检查器列表。我没有用过,它们可能不是你想要的


一般来说,重构的目的是使函数在重构前后表现相同。开发人员通常通过创建广泛的单元测试来实现这一点,测试正常、边缘和异常情况

在OP要比较的两个函数中,
doIt
doIt2
,如果给定任何整数输入a和b,它们通常会返回相同的答案。单元测试将证明这一点

但是,如果a或b是Java可以存储的最大整数,
MAX\u VALUE
,会怎么样呢

如果
a=a+1
有副作用怎么办


在这些情况下,这两个函数表面上看起来很相似,但产生的结果不同。

调用它们并检查它们的返回值。是的,这就是你知道它们做同样的事情的方式,除非你以某种奇怪的方式定义
做同样的事情。
。我结束了这个问题,因为它与java无关,这是CS理论的一般性问题。看看经典问题,它会给你一个理解这个问题的线索