Según tengo entendido, el término "referential transparency" realmente solo se puede aplicar al código funcional. Sin embargo, una llamada de método en un objeto en código orientado a objetos puede tener una propiedad similar, que es que el valor de retorno del método y el estado del objeto después de una llamada a un método depende únicamente del estado del objeto antes de la llamada y los argumentos del método¿Cómo llamar el equivalente de OOP de "transparencia referencial"?
es decir, la transparencia referencial funcional:
i = foo(n, m);
// return value depends only on n, m
OO "transparencia referencial":
i = obj.foo(n, m);
// return value, and subsequent state of obj, depends
// only on initial state of obj, n, m
¿Hay un nombre para esta propiedad?
Si el estado de obj
no cambia durante la llamada a foo()
, entonces el "orientado a objetos" El estilo es equivalente a la forma funcional si se admite function overloading ya que podría ser reescrita como:
i = foo(obj, n, m);
// return value depends only on obj, n, m
Sin embargo , es bastante común para el estado de obj
a cambiar de una llamada a un método, así que no estoy seguro si esto ayuda a que el análisis ...
Además, si a) su programa depende de la identidad del objeto del resultado de 'o.foo (a) ', o b)' o.foo (a) 'tiene algún efecto secundario como E/S, no puede reemplazar la llamada. – retronym
Supongo que es justo decir que es posible una transparencia referencial completa con el código OO. (El getter estándar probablemente tendrá esta propiedad). Pero mi pregunta principal es si hay un nombre para la propiedad más débil pero útil que sigue a una llamada a un método, el valor de retorno y el estado final de 'o' depende solo de la estado inicial de 'o' y los argumentos del método. – mjs
Los captadores estándar son enfáticamente ** no ** referencialmente transparentes. La transparencia referencial significa que sus resultados dependen de los parámetros pasados ** solo **. Un getter ** no tiene ** parámetro pass-in (a menos que quiera comenzar a hablar sobre parámetros implícitos como 'this' /' self' en cuyo caso le falta el punto de la parte "transparent") y su valor devuelto depende del estado del objeto involucrado en la llamada, una entidad externa a la función. La transparencia referencial es, básicamente, "obtienes lo que ves y nada más". Si hay partes invisibles, eso no es transparente. –