代码之家  ›  专栏  ›  技术社区  ›  mjs

什么叫OOP的“引用透明性”?

  •  12
  • mjs  · 技术社区  · 14 年前

    referential transparency “实际上只能应用于函数代码。但是,在面向对象的代码中,对对象的方法调用可以具有类似的属性,即方法的返回值和方法调用后对象的状态仅取决于调用前对象的状态和方法的参数。

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

    OO“参考透明度”:

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

    这房子有名字吗?

    如果 obj foo() function overloading 支持,因为它可以重写为:

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

    然而,这在美国很常见 目标

    4 回复  |  直到 14 年前
        1
  •  17
  •   Apocalisp    10 年前

    表情 e 当且仅当 e

    所以如果你有一个表达式 o.foo(a) ,则它是引用透明的,如果您可以修改代码以用调用的结果替换它,而不更改程序的行为方式。显然,如果o.foo是空的,你就不能这么做。如果它修改了 o . 所以唯一的办法 如果它的结果是 a .

    在我看来,“函数代码”是“引用透明代码”的同义词。

        2
  •  4
  •   JUST MY correct OPINION    14 年前

    参照透明度 指称晦暗性 .

        3
  •  4
  •   Tomas Petricek    14 年前

    参照透明度 在函数式编程中没有。你描述了一处房产 foo 方法只修改 obj

    i = obj.foo(n, m); 
    

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

    如果 方法是 透明的 (没有修改任何状态-只是返回了一些结果),那么这将是一个有趣的属性-因为它不会修改 a .

        4
  •  2
  •   AakashM    14 年前

    方法调用后对象的状态仅取决于调用前对象的状态以及方法的参数。

    没有外部依赖项 .