【问题标题】:Is there a way to compare two methods by function rather than value? [duplicate]有没有办法通过功能而不是价值来比较两种方法? [复制]
【发布时间】:2017-02-17 13:53:11
【问题描述】:

有没有办法比较两个方法是否按功能等效(即它们做同样的事情)而不是按值等效(即方法中的所有代码都相同)?

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

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 中执行此操作的方法,但我感兴趣的是,这是否可能超出一个简单的方法。

【问题讨论】:

  • 打电话给他们并检查他们的返回值。
  • 是的,这就是你知道他们做同样事情的方式,除非你以某种奇怪的方式定义 do the same thing
  • 我已经关闭了这个问题,因为它与 java 无关,它是 CS 理论的一般问题。查看规范问题,它应该为您提供理解这个问题的线索

标签: java compare


【解决方案1】:

达到 100% 的唯一方法是用数学证明它

有办法:

1-Theorem proving

2-Model Checking

等等

虽然这些方法可能非常困难,但有时可能需要几天时间来证明它,即使是琐碎的程序,甚至需要几天时间才能产生足够的抽象级别。

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

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

编辑:

这是我在 Wikipedia 上找到的模型检查器列表。我没有用过它们,它们可能不是你要找的。​​p>

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

【讨论】:

    【解决方案2】:

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

    这仅适用于纯代码。我不知道一般情况下可以监控副作用,因为函数执行的副作用可能是任何东西。

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-16
        • 1970-01-01
        • 1970-01-01
        • 2021-08-26
        • 1970-01-01
        • 2021-06-21
        • 2019-07-31
        相关资源
        最近更新 更多