怎么称OOP相当于"参考透明度"?

mjs*_*mjs 12 oop functional-programming referential-transparency

我的理解是," 引用透明度 " 这个术语实际上只能应用于功能代码.但是,对面向对象代码中的对象的方法调用可以具有类似的属性,即方法的返回值和方法调用后的对象的状态仅取决于调用之前的对象的状态,以及方法的论点.

即功能参照透明度:

i = foo(n, m);
// return value depends only on n, m
Run Code Online (Sandbox Code Playgroud)

OO"参考透明度":

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

这个房产有名字吗?

如果obj在调用期间状态没有改变foo(),则"面向对象"样式等同于函数形式,如果支持函数重载,则可以将其重写为:

i = foo(obj, n, m);
// return value depends only on obj, n, m
Run Code Online (Sandbox Code Playgroud)

但是,obj在方法调用中更改状态是很常见的,所以我不确定这是否有助于分析...

Apo*_*isp 17

你的错误在于认为FP和OO在某种程度上是根本不同的.参考透明度的"OO版本"仅仅是参考透明度.

e当且仅当e可以用其评估结果替换而不影响程序的行为时,表达式是引用透明的.

因此,如果您有一个表达式o.foo(a),那么如果您可以修改代码以将其替换为调用结果,而不改变程序的行为方式,则它是引用透明的.显然,如果o.foo无效,你就不能这样做.同上,如果它修改了内部状态o.所以唯一的办法o.foo(a)是引用透明是如果它的结果是一个功能 oa.

在我看来,"功能代码"是"引用透明代码"的同义词.

  • 另外,如果a)你的程序依赖于`o.foo(a)`或b)的结果的对象标识`o.foo(a)`有一些副作用,比如I/O,你不能替换电话. (3认同)