2017-02-17 40 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

и т.д.

Хотя эти подходы могут быть очень сложными, иногда может потребоваться несколько дней, чтобы доказать это даже для тривиальных программ и даже дней для подталкивания uce адекватный уровень абстракции.

Есть некоторые эвристические подходы, но очевидно, что они не являются 100% точным (эвристический)

простой эвристический подход был бы попробовать оба метода на 1000 входов и посмотреть, если результаты совпадают

EDIT :

вот список Model Checker, который я нашел в Википедии. Я не использовал ни одного из них, они не могут быть именно тем, что вы ищете.

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

1

Игнорирование побочных эффектов, 2 функции будут функционально эквивалентны, если для одного и того же входа они выдают одинаковый выход.

Это будет работать только для чистого кода. Я не знаю, как контролировать побочные эффекты вообще, поскольку побочные эффекты, которые выполняет функция, могут быть любыми.

Обратите внимание, что не было бы возможности полностью проверить это без проверки каждого возможного ввода. Если вход представляет собой ограниченный Enum, это может быть легко. Если это 2 целых числа, например, общее количество комбинаций будет огромным.

1

В общем, цель рефакторинга иметь функции ведут себя так же до и после того, как он переработан. Разработчики обычно делают это, создавая обширные модульные тесты, проверяя как нормальные, крайние, так и исключения.

В двух параллельных функциях OP, doIt и doIt2, они обычно могут возвращать один и тот же ответ, учитывая любые целые входы a и b. Тестирование модуля продемонстрирует это.

Но что, если a или b - наибольшее целое число, которое может хранить Java, MAX_VALUE?

Что делать, если был побочный эффект от a=a+1?

В этих случаях две функции могут казаться похожими на поверхности, но при этом дают разные результаты.

 Смежные вопросы

  • Нет связанных вопросов^_^