12

私の理解では、「参照透過性」という用語は、実際には機能コードにのみ適用できます。ただし、オブジェクト指向コードのオブジェクトに対するメソッド呼び出しは、メソッドの戻り値であり、メソッド呼び出し後のオブジェクトの状態は、呼び出し前のオブジェクトの状態のみに依存するという同様のプロパティを持つことができます。 、およびメソッドの引数。

つまり、機能的な参照透過性:

i = foo(n, m);
// return value depends only on n, m

オブジェクト指向「参照透過性」:

i = obj.foo(n, m);
// return value, and subsequent state of obj, depends 
// only on initial state of obj, n, m

この物件に名前はありますか?

の呼び出し中にの状態がobj変化しない場合、関数のオーバーロードがサポートされている場合、「オブジェクト指向」スタイルは次のように書き直すことができるためfoo()、関数形式と同等です。

i = foo(obj, n, m);
// return value depends only on obj, n, m

ただし、メソッド呼び出しで状態が変化することはかなり一般的であるため、objこれが分析に役立つかどうかはわかりません...

4

4 に答える 4

17

あなたの間違いは、FPとOOがどういうわけか根本的に違うと思っていることです。参照透過性の「OOバージョン」は、単なる参照透過性です。

式は、プログラムの動作に影響を与えることなく、評価された結果で置き換えることができるe場合にのみ、参照透過性があります。e

したがって、式があるo.foo(a)場合、プログラムの動作を変更せずに、コードを変更して呼び出しの結果に置き換えることができれば、参照透過性があります。明らかに、o.fooが無効である場合、それを行うことはできません。の内部状態を変更する場合も同様ですo。したがって、o.foo(a)参照透過性を実現する唯一の方法は、その結果がとの関数である かどうかです。oa

私の考えでは、「関数型コード」は「参照透過性コード」と同義です。

于 2010-07-07T11:59:17.310 に答える
4

あなたが言うように、機能用語は参照透過性です。メソッドの引数とオブジェクトの状態に応じた結果を含む、ここで説明したフォームを参照不透明度と呼ぶことを謙虚に提案します。

于 2010-07-05T10:01:55.470 に答える
4

オブジェクト指向のシナリオで説明したプロパティが、関数型プログラミングで参照透過性が行うものと同様のものを提供するとは思いません。次の呼び出しで、fooメソッドがオブジェクトの状態のみを変更するプロパティを記述しました。obj

i = obj.foo(n, m); 

ただし、参照する別のオブジェクトがある場合、objへの呼び出しfooは他のオブジェクトの動作も変更します。OO ではオブジェクト間の参照が不可欠であるため (これは簡単に回避できない問題であることを意味します)、これは、記述したプロパティがコードについて多くを語らないことを意味します。例えば:

a = new Other(obj);
i = obj.foo(n, m);  // changes state of 'obj' and 'a'

fooメソッドが参照透過的(状態を変更せず、いくつかの結果を返すだけ) である場合、それは興味深いプロパティになりますa

于 2010-07-05T10:08:24.180 に答える
2

メソッド呼び出し後のオブジェクトの状態は、呼び出し前のオブジェクトの状態とメソッドの引数にのみ依存します。

このメソッドには外部依存関係がないと言えると思います。

ただし、参照透過性とは異なり、これによって何が得られるかはわかりません。これは、メソッドが簡単にテストできることを意味していると思います。

于 2010-07-05T09:52:06.540 に答える