Мое понимание - то, что термин "ссылочная прозрачность" может действительно только быть применен к функциональному коду. Однако вызов метода на объекте в объектно-ориентированном коде может иметь подобное свойство, которое является, что возвращаемое значение метода и состояние объекта после вызова метода зависят только от состояния объекта перед вызовом и аргументами метода.
т.е. функциональная ссылочная прозрачность:
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
измениться в вызове метода, таким образом, я не уверен, помогает ли это анализу...
Ваша ошибка состоит в том, что вы думаете, что FP и OO чем-то принципиально разные. «ОО-версия» ссылочной прозрачности - это просто ссылочная прозрачность.
Выражение e
является ссылочно прозрачным тогда и только тогда, когда e
можно заменить его оцененным результатом, не влияя на поведение программы.
Итак, если у вас есть выражение o.foo (a)
, то оно будет ссылочно прозрачным, если вы можете изменить свой код, чтобы заменить его результатом вызова, без изменения поведения вашей программы. Очевидно, что если o.foo недействителен, вы не можете этого сделать. То же самое, если он изменяет внутреннее состояние o
. Таким образом, единственный способ для o.foo (a)
быть ссылочно прозрачным - это если его результат является функцией o
и a
.
На мой взгляд, «функциональный код» является синонимом «ссылочно прозрачного кода».
Функциональным термином будет ссылочная прозрачность , как вы говорите. Я бы смиренно предложил, чтобы описанная здесь форма с результатами, зависящими от аргументов метода и состояния объекта, была названа ссылочной непрозрачностью .
состояние объекта после вызова метода зависит только от состояния объекта до вызова и аргументов метода.
Можно сказать, что метод не имеет внешних зависимостей.
Однако, в отличие от ссылочной прозрачности, я не совсем понимаю, что это дает. Полагаю, это означает, что метод легко тестируется.
Я не думаю, что описанное вами свойство в сценарии ОО дает что-то похожее на то, что ссылочная прозрачность дает в функциональном программировании. Вы описали свойство, при котором метод 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
.