Что можно назвать эквивалентом ООП «ссылочной прозрачности»? - PullRequest
12 голосов
/ 05 июля 2010

Насколько я понимаю, термин " ссылочная прозрачность " действительно может применяться только к функциональному коду. Однако вызов метода для объекта в объектно-ориентированном коде может иметь аналогичное свойство: возвращаемое значение метода и состояние объекта после вызова метода зависят только от состояния объекта перед вызовом. и аргументы метода.

т.е. функциональная ссылочная прозрачность:

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 ]

17 голосов
/ 07 июля 2010

Ваша ошибка - думать, что FP и OO как-то принципиально отличаются.«OO-версия» ссылочной прозрачности - это просто ссылочная прозрачность.

Выражение e является ссылочно-прозрачным тогда и только тогда, когда e может быть заменено его оцененным результатом без влияния на поведениеprogram.

Так что, если у вас есть выражение o.foo(a), то оно будет прозрачно ссылочным, если вы сможете изменить свой код, чтобы заменить его результатом вызова, без изменения поведения вашей программы.Очевидно, что если o.foo void, вы не сможете этого сделать.То же самое, если оно изменяет внутреннее состояние o.Таким образом, единственный способ для o.foo(a) быть ссылочно-прозрачным, если его результат является функцией o и a.

На мой взгляд, «функциональный код» - этосиноним «ссылочно-прозрачный код».

4 голосов
/ 05 июля 2010

Функциональный термин будет ссылочная прозрачность , как вы говорите.Я бы смиренно предложил, чтобы форма, которую вы описали здесь, с результатами, зависящими от аргументов метода и состояния объекта, была названа непрозрачность ссылки .

4 голосов
/ 05 июля 2010

Я не думаю, что свойство, которое вы описали в сценарии OO, дает вам что-то похожее на то, что ссылочная прозрачность делает в функциональном программировании. Вы описали свойство, в котором метод foo изменяет только состояние объекта obj в следующем вызове:

i = obj.foo(n, m); 

Однако, если у вас есть другой объект, который ссылается на obj, то вызов foo также изменяет поведение другого объекта. Поскольку ссылки на объекты важны в ОО (это означает, что эту проблему трудно избежать), это означает, что свойство, которое вы описали, мало что говорит о коде. Например:

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

Если бы метод foo был относительно прозрачным (не изменял никакого состояния - просто вернул некоторые результаты), тогда это было бы интересным свойством - потому что он не изменял бы состояние a.

2 голосов
/ 05 июля 2010

состояние объекта после вызова метода зависит только от состояния объекта перед вызовом и аргументов метода.

Полагаю, вы могли бы сказать, что метод не имеет внешних зависимостей .

Однако, в отличие от ссылочной прозрачности, я не уверен, что это даст вам. Я полагаю, это означает, что метод легко тестируемый.

...