0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p><strong>В функциональном программировании ссылочная прозрачность обычно означает, что выражение в коде может быть заменено результатом выполнения этого кода (или чем-либо, имеющим такое же значение), при этом результаты выполнения всего кода не изменятся. Это означает, что алгоритм всегда должен возвращать одно и то же значение для данного аргумента без какого-либо другого эффекта. Эта концепция функционального программирования также применима и к императивному программированию, и может помочь<a>сделать код любого программиста более понятным</a>. Мы подробно перевели статью<a>“What Is Referential Transparency?”</a>издания SitePoint и адаптировали примеры кода с Java (которая используется в оригинале) на JavaScript.</strong></p>
1
<p><strong>В функциональном программировании ссылочная прозрачность обычно означает, что выражение в коде может быть заменено результатом выполнения этого кода (или чем-либо, имеющим такое же значение), при этом результаты выполнения всего кода не изменятся. Это означает, что алгоритм всегда должен возвращать одно и то же значение для данного аргумента без какого-либо другого эффекта. Эта концепция функционального программирования также применима и к императивному программированию, и может помочь<a>сделать код любого программиста более понятным</a>. Мы подробно перевели статью<a>“What Is Referential Transparency?”</a>издания SitePoint и адаптировали примеры кода с Java (которая используется в оригинале) на JavaScript.</strong></p>
2
<h2>Содержание</h2>
2
<h2>Содержание</h2>
3
<ul><li><a>Ссылочная прозрачность</a></li>
3
<ul><li><a>Ссылочная прозрачность</a></li>
4
<li><a>Ссылочная прозрачность в математике</a></li>
4
<li><a>Ссылочная прозрачность в математике</a></li>
5
<li><a>Ссылочная прозрачность в программировании</a></li>
5
<li><a>Ссылочная прозрачность в программировании</a></li>
6
<li><a>Ссылочная прозрачность в императивном программировании</a></li>
6
<li><a>Ссылочная прозрачность в императивном программировании</a></li>
7
<li><a>Итог</a></li>
7
<li><a>Итог</a></li>
8
</ul><h2>Ссылочная прозрачность</h2>
8
</ul><h2>Ссылочная прозрачность</h2>
9
<p>Термин<a>ссылочная прозрачность</a>используется в математике, логике, лингвистике, философии и в программировании. В каждой из этих областей он имеет совершенно разные значения. Здесь мы будем иметь дело только с компьютерными программами, хотя и покажем аналогию с математикой (но не волнуйтесь - с достаточно простой математикой). Мы рассмотрим ссылочную прозрачность, используемую функциональными программистами.</p>
9
<p>Термин<a>ссылочная прозрачность</a>используется в математике, логике, лингвистике, философии и в программировании. В каждой из этих областей он имеет совершенно разные значения. Здесь мы будем иметь дело только с компьютерными программами, хотя и покажем аналогию с математикой (но не волнуйтесь - с достаточно простой математикой). Мы рассмотрим ссылочную прозрачность, используемую функциональными программистами.</p>
10
<h2>Ссылочная прозрачность в математике</h2>
10
<h2>Ссылочная прозрачность в математике</h2>
11
<p>В математике ссылочная прозрачность - это свойство выражений, которые могут быть заменены другими выражениями, имеющими такое же значение, без какого-либо изменения результата. Рассмотрим следующий пример:</p>
11
<p>В математике ссылочная прозрачность - это свойство выражений, которые могут быть заменены другими выражениями, имеющими такое же значение, без какого-либо изменения результата. Рассмотрим следующий пример:</p>
12
<p>Мы можем заменить подвыражение (3 * 4) любым другим выражением, имеющим то же значение, при этом не изменяя результат (значение x). Наиболее очевидное выражение, которое следует использовать, конечно же 12:</p>
12
<p>Мы можем заменить подвыражение (3 * 4) любым другим выражением, имеющим то же значение, при этом не изменяя результат (значение x). Наиболее очевидное выражение, которое следует использовать, конечно же 12:</p>
13
<p>При этом мы могли использовать любое другое выражение, имеющее значение 12 (возможно (5 + 7)), не боясь изменения результата. Как следствие, часть этого выражения - (3 * 4), имеет ссылочную прозрачность.</p>
13
<p>При этом мы могли использовать любое другое выражение, имеющее значение 12 (возможно (5 + 7)), не боясь изменения результата. Как следствие, часть этого выражения - (3 * 4), имеет ссылочную прозрачность.</p>
14
<p>Мы можем заменить и выражение 2 + 12 другим выражением, имеющим то же значение - так, чтобы оно оставалось ссылочно-прозрачным:</p>
14
<p>Мы можем заменить и выражение 2 + 12 другим выражением, имеющим то же значение - так, чтобы оно оставалось ссылочно-прозрачным:</p>
15
<h2>Ссылочная прозрачность в программировании</h2>
15
<h2>Ссылочная прозрачность в программировании</h2>
16
<p>В программировании ссылочная прозрачность применяется, соответственно, к программам. Поскольку они обычно состоят из подпрограмм, которые сами являются программами, это применимо и к этим подпрограммам. При этом они могут быть представлены в том числе и функциями. Это означает, что функции могут быть ссылочно-прозрачными - особенно когда вызов этих функций может быть заменен их возвращаемым значением.</p>
16
<p>В программировании ссылочная прозрачность применяется, соответственно, к программам. Поскольку они обычно состоят из подпрограмм, которые сами являются программами, это применимо и к этим подпрограммам. При этом они могут быть представлены в том числе и функциями. Это означает, что функции могут быть ссылочно-прозрачными - особенно когда вызов этих функций может быть заменен их возвращаемым значением.</p>
17
<p>В этом примере функция mult является ссылочно-прозрачной, потому что любой ее вызов может быть заменен соответствующим возвращаемым значением. Это можно увидеть, заменив mult(3, 4) на 12:</p>
17
<p>В этом примере функция mult является ссылочно-прозрачной, потому что любой ее вызов может быть заменен соответствующим возвращаемым значением. Это можно увидеть, заменив mult(3, 4) на 12:</p>
18
<p>Таким же образом add(2, 12) можно заменить на возвращаемое значение 14.</p>
18
<p>Таким же образом add(2, 12) можно заменить на возвращаемое значение 14.</p>
19
<p>Эти изменения не повлияют на результат работы программы, что бы она ни выполняла. Обратите внимание, что вообще мы могли бы использовать любое другое выражение, имеющее аналогичное значение - это свойство очень полезно при рефакторинге.</p>
19
<p>Эти изменения не повлияют на результат работы программы, что бы она ни выполняла. Обратите внимание, что вообще мы могли бы использовать любое другое выражение, имеющее аналогичное значение - это свойство очень полезно при рефакторинге.</p>
20
<p>С другой стороны, рассмотрите следующую функцию:</p>
20
<p>С другой стороны, рассмотрите следующую функцию:</p>
21
<p>Замена вызова функции add возвращаемым значением изменит результат её работы, поскольку больше не будет печататься сообщение с помощью console.log. В этом случае замена просто удалит побочный эффект, но в других случаях она может изменить значение, которое возвращается функцией.</p>
21
<p>Замена вызова функции add возвращаемым значением изменит результат её работы, поскольку больше не будет печататься сообщение с помощью console.log. В этом случае замена просто удалит побочный эффект, но в других случаях она может изменить значение, которое возвращается функцией.</p>
22
<p>Здесь функция next не может быть заменена чем-либо, даже если оно имело бы такое же значение. Это связано с тем, что эта функция предназначена для возврата абсолютно разных значений при каждом вызове.</p>
22
<p>Здесь функция next не может быть заменена чем-либо, даже если оно имело бы такое же значение. Это связано с тем, что эта функция предназначена для возврата абсолютно разных значений при каждом вызове.</p>
23
<p>Использование таких не ссылочно-прозрачных функций требует особого внимания из-за изменяемого состояния, участвующего в вычислении. Функциональный стиль избегает таких функций в пользу их ссылочно-прозрачных версий.</p>
23
<p>Использование таких не ссылочно-прозрачных функций требует особого внимания из-за изменяемого состояния, участвующего в вычислении. Функциональный стиль избегает таких функций в пользу их ссылочно-прозрачных версий.</p>
24
<h2>Ссылочная прозрачность в императивном программировании</h2>
24
<h2>Ссылочная прозрачность в императивном программировании</h2>
25
<p>Функции используются как в<a>императивном, так и в функциональном (декларативном) программировании</a>. Несмотря на то, что функциональное программирование использует только функции, в императивном программировании также используются:</p>
25
<p>Функции используются как в<a>императивном, так и в функциональном (декларативном) программировании</a>. Несмотря на то, что функциональное программирование использует только функции, в императивном программировании также используются:</p>
26
<ul><li>Чистые функции: функции возвращающие значение, и не имеющие побочных эффектов.</li>
26
<ul><li>Чистые функции: функции возвращающие значение, и не имеющие побочных эффектов.</li>
27
<li>Чистые эффекты: функции, не возвращающие ничего, но изменяющие что-то снаружи.</li>
27
<li>Чистые эффекты: функции, не возвращающие ничего, но изменяющие что-то снаружи.</li>
28
<li>Функции с побочными эффектами: функции, возвращающие значение, и при этом изменяющие что-либо из вне.</li>
28
<li>Функции с побочными эффектами: функции, возвращающие значение, и при этом изменяющие что-либо из вне.</li>
29
</ul><p>Как мы все знаем, рекомендуется избегать функций с побочными эффектами. Это оставляет императивным программистам возможность использовать или чистые функции, или чистые эффекты. Таким образом, ссылочная прозрачность является мощным инструментом для императивных программистов, который упрощает понимание программ, а также упрощает их тестирование.</p>
29
</ul><p>Как мы все знаем, рекомендуется избегать функций с побочными эффектами. Это оставляет императивным программистам возможность использовать или чистые функции, или чистые эффекты. Таким образом, ссылочная прозрачность является мощным инструментом для императивных программистов, который упрощает понимание программ, а также упрощает их тестирование.</p>
30
<h2>Итог</h2>
30
<h2>Итог</h2>
31
<p>Ссылочная прозрачность означает, что вызов функции может быть заменен ее значением, либо другим ссылочно-прозрачным вызовом с тем же результатом. Это делает каждую функцию независимой, что значительно упрощает модульное тестирование и рефакторинг. Кроме того, такие ссылочно-прозрачные функции легче читать и понимать - это одна из причин, почему код, написанный в функциональном стиле, нуждается в меньшем количестве комментариев.</p>
31
<p>Ссылочная прозрачность означает, что вызов функции может быть заменен ее значением, либо другим ссылочно-прозрачным вызовом с тем же результатом. Это делает каждую функцию независимой, что значительно упрощает модульное тестирование и рефакторинг. Кроме того, такие ссылочно-прозрачные функции легче читать и понимать - это одна из причин, почему код, написанный в функциональном стиле, нуждается в меньшем количестве комментариев.</p>