Что назвать эквивалент ООП “ссылочной прозрачности”?

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

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

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(), затем "объектно-ориентированный" стиль эквивалентен функциональной форме, если перегрузка функции поддерживается, так как это могло быть переписано как:

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

Однако довольно характерно для состояния obj измениться в вызове метода, таким образом, я не уверен, помогает ли это анализу...

12
задан mjs 5 July 2010 в 09:57
поделиться

4 ответа

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

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

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

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

17
ответ дан 2 December 2019 в 05:39
поделиться

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

4
ответ дан 2 December 2019 в 05:39
поделиться

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

Можно сказать, что метод не имеет внешних зависимостей.

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

2
ответ дан 2 December 2019 в 05:39
поделиться

Я не думаю, что описанное вами свойство в сценарии ОО дает что-то похожее на то, что ссылочная прозрачность дает в функциональном программировании. Вы описали свойство, при котором метод 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.

4
ответ дан 2 December 2019 в 05:39
поделиться