2017-02-17 97 views
4

有没有办法来比较,如果两种方法是通过功能等价(即他们做同样的事情),而不是按值当量(即所有在该方法的代码是一样的)?有没有办法通过函数而不是值来比较两个方法?

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

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

给他们打电话并检查他们的返回值。 –

+0

是的,这就是你知道他们做同样的事情的方式,除非你定义了“以同样的方式做一些奇怪的事情”。 –

+0

我已经关闭了这个问题,因为它不是java相关的,这是来自CS理论的一般问题。看到典型的问题,它应该给你一个理解这个问题的线索 – Andremoniy

回答

3

为100%的唯一方法是在数学上证明这一点

有办法:

1- Theorem proving

2- Model Checking

和等

虽然这些方法可能非常困难,有时可能需要几天的时间才能证明它即使对于微不足道的程序甚至几天也没有用足够的抽象层次。

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

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

编辑:

这里是我在维基百科上发现模型检查清单。我没有使用过它们中的任何一个,它们可能并不完全符合您的要求。

https://en.wikipedia.org/wiki/List_of_model_checking_tools

1

忽略副作用,2个函数在功能上等价,如果对于相同的输入,它们会产生相同的输出。

这将只对纯代码的工作,虽然。我不知道通常会监测副作用,因为功能的副作用可能是任何事情。

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

1

一般情况下,重构的目的是为了有一个功能之前相同的行为,它是重构之后。开发人员通常会通过创建大量的单元测试来完成此任务,测试正常,边缘和异常情况。

在OP的两个函数给出任何整数输入A和B进行比较,doItdoIt2,他们通常会返回相同的答案。单元测试会证明这一点。

但是,如果a或b是Java可以存储的最大整数,那么该怎么办?MAX_VALUE

如果a=a+1有副作用会怎么样?

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

相关问题