2017-02-17 6 views
4

2つのメソッドが同等の値ではなく(つまり、メソッドのすべてのコードが同じである)関数によって等価であるかどうかを比較する方法はありますか?2つのメソッドを値ではなく関数で比較する方法はありますか?

たとえば、これらの2つの方法は異なる方法でコーディングされますが、同じ機能を実行します。

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の入力のための両方の方法を試してみて、結果は同じ

EDITあるかどうかを確認することです:

ここに私がWikipediaで見つけたモデルチェッカーのリストがあります。私はそれらのどれも使用していない、彼らはあなたが探しているものではないかもしれません。一般的に

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

1

2つの関数は、同じ入力に対して同じ出力を生成する場合、機能的に同等です。

これは純粋なコードでしか機能しません。関数が実行する副作用は何でもよいので、一般的な副作用を監視する方法はわかりません。

可能なすべての入力をテストせずに完全に検証する方法はありません。入力が限られたEnumだけの場合、それは簡単かもしれません。例えば2つの整数の場合、組み合わせの総数は膨大になります。

1

、リファクタリングの目的は、それがリファクタリングされる前と後の機能は同じ動作をすることです。開発者は一般的に、通常、エッジ、および例外の両方のケースをテストして、広範な単体テストを作成します。

比較するOPの2つの関数では、doItdoIt2のように、整数入力aとbを指定すると、通常は同じ答えが返されることがあります。ユニットテストはこれを実証するでしょう。

しかし、aまたはbがJavaが格納できる最大の整数である場合は、MAX_VALUE

a=a+1から副作用があった場合はどうなりますか?

これらの場合、2つの関数はサーフェス上で同じように表示されますが、異なる結果が得られます。

関連する問題