ORGPROG Telegram 378
Понимание побочных эффектов

Судя по тому, что сказано в видео, Мартин один из немногих, кто использует термин «побочный эффект» правильно. Есть ощущение, что идею о том, что любое изменение состояния следует считать побочным эффектом, внедрили функциональщики в контексте очернения императивного программирования. Мартин же знает, чем отличается целевое изменение состояние и побочные эффекты, производимые заодно.

Вот такой комментарий оставили под видео с разбором темы функций в книге чистый код. Ну один такой коммент ладно еще никуда не шло, но там их было далеко не один, с таким же посылом. Не могу тут промолчать, потому что это опасная дорожка, которая уводит нас далеко в сторону.

Словосочетание "побочный эффект" (side effects) действительно прочно ассоциируется у нас в обычной жизни с чем-то, что не задумывалось и чего бы лучше не было. И обсуждая логику построения кода мы можем говорить о том, что функция делает какие-то действия, которые выходят за границы того она должна делать. Но! Это все относится к единой ответственности и это более инженерно-философское понятие, в отличии от понятия сайд эффекта.

В англоязычной среде термин side effect это строгое техническое понятие, которое закреплено в университетских курсах, учебниках и даже в стандартах языков. Любой студент CS в США или Европе проходит курсы вроде SICP или использует современные учебники вроде ТАПЛ, где написано: side effect = любое изменение состояния или взаимодействие с внешним миром, помимо возврата значения. Сюда относятся изменения глобального состояния, исключения, работа с памятью и взаимодействие с вводом/выводом (запись чтение файлов, сеть и т.п.)

Structure and Interpretation of Computer Programs (Abelson, Sussman, 1985)

> Side effects are changes of state produced by a procedure in addition to returning a value.

Types and Programming Languages (Benjamin Pierce, 2002)

> A side effect is any observable interaction with the outside world other than producing a return value

ISO C Standard (ISO/IEC 9899:2018, §5.1.2.3)

> Accessing a volatile object, modifying an object, modifying a file, or calling a function that does any of those operations are all side effects.

Термин используется в спецификации, чтобы формально определить поведение выражений и порядок вычислений.

Java Language Specification (Java SE 17, §15.4)

> Evaluation of an expression may produce side effects, which are changes in the state of the execution environment

Rust Reference (раздел Unsafe Code Guidelines)

side effects явно перечисляются: запись в память, вызовы внешних функций, работа с volatile

И Мартин прекрасно понимает что он имеет ввиду под побочными эффектами (естественно он использует термин Side Effects) и более того, описывает это: A function should do one thing. Side effects are things like writing to a file, changing a global variable, throwing an exception

И это важно, потому что одно дело что у функции одна ответственность, другое дело чистота функций и изоляция побочных эффектов. Это самый базовый фундамент, на котором строится вообще все остальное не только на уровне обычных функций, но и больших систем, понятие побочных эффектов, идемпотентности, возможность кеширования, все это сильно связано.

Самый лучший способ по настоящему прочувствовать это, поработать в языках типа Haskell, где сайдэффекты вынесены на уровень системы типов. Как только вы захотите записать в файл внутри вашей функции, вы сразу прочувствуете всю боль и сложность сайд эффектов. Язык вас буквально заставит работать с ними правильно, либо придется страдать. Это одна из ключевых ценностей, которую дает фп и которая значительно влияет на ваш стиль программирования в императивных языках.

p.s На ютубе тьма видео, которые это все подробно и популярно объясняют. Можно начать отсюда: https://www.youtube.com/watch?v=_nG09Z_tdUU

Ссылки: Телеграм | Youtube | VK
👍6430🔥13🥱5



tgoop.com/orgprog/378
Create:
Last Update:

Понимание побочных эффектов

Судя по тому, что сказано в видео, Мартин один из немногих, кто использует термин «побочный эффект» правильно. Есть ощущение, что идею о том, что любое изменение состояния следует считать побочным эффектом, внедрили функциональщики в контексте очернения императивного программирования. Мартин же знает, чем отличается целевое изменение состояние и побочные эффекты, производимые заодно.

Вот такой комментарий оставили под видео с разбором темы функций в книге чистый код. Ну один такой коммент ладно еще никуда не шло, но там их было далеко не один, с таким же посылом. Не могу тут промолчать, потому что это опасная дорожка, которая уводит нас далеко в сторону.

Словосочетание "побочный эффект" (side effects) действительно прочно ассоциируется у нас в обычной жизни с чем-то, что не задумывалось и чего бы лучше не было. И обсуждая логику построения кода мы можем говорить о том, что функция делает какие-то действия, которые выходят за границы того она должна делать. Но! Это все относится к единой ответственности и это более инженерно-философское понятие, в отличии от понятия сайд эффекта.

В англоязычной среде термин side effect это строгое техническое понятие, которое закреплено в университетских курсах, учебниках и даже в стандартах языков. Любой студент CS в США или Европе проходит курсы вроде SICP или использует современные учебники вроде ТАПЛ, где написано: side effect = любое изменение состояния или взаимодействие с внешним миром, помимо возврата значения. Сюда относятся изменения глобального состояния, исключения, работа с памятью и взаимодействие с вводом/выводом (запись чтение файлов, сеть и т.п.)

Structure and Interpretation of Computer Programs (Abelson, Sussman, 1985)

> Side effects are changes of state produced by a procedure in addition to returning a value.

Types and Programming Languages (Benjamin Pierce, 2002)

> A side effect is any observable interaction with the outside world other than producing a return value

ISO C Standard (ISO/IEC 9899:2018, §5.1.2.3)

> Accessing a volatile object, modifying an object, modifying a file, or calling a function that does any of those operations are all side effects.

Термин используется в спецификации, чтобы формально определить поведение выражений и порядок вычислений.

Java Language Specification (Java SE 17, §15.4)

> Evaluation of an expression may produce side effects, which are changes in the state of the execution environment

Rust Reference (раздел Unsafe Code Guidelines)

side effects явно перечисляются: запись в память, вызовы внешних функций, работа с volatile

И Мартин прекрасно понимает что он имеет ввиду под побочными эффектами (естественно он использует термин Side Effects) и более того, описывает это: A function should do one thing. Side effects are things like writing to a file, changing a global variable, throwing an exception

И это важно, потому что одно дело что у функции одна ответственность, другое дело чистота функций и изоляция побочных эффектов. Это самый базовый фундамент, на котором строится вообще все остальное не только на уровне обычных функций, но и больших систем, понятие побочных эффектов, идемпотентности, возможность кеширования, все это сильно связано.

Самый лучший способ по настоящему прочувствовать это, поработать в языках типа Haskell, где сайдэффекты вынесены на уровень системы типов. Как только вы захотите записать в файл внутри вашей функции, вы сразу прочувствуете всю боль и сложность сайд эффектов. Язык вас буквально заставит работать с ними правильно, либо придется страдать. Это одна из ключевых ценностей, которую дает фп и которая значительно влияет на ваш стиль программирования в императивных языках.

p.s На ютубе тьма видео, которые это все подробно и популярно объясняют. Можно начать отсюда: https://www.youtube.com/watch?v=_nG09Z_tdUU

Ссылки: Телеграм | Youtube | VK

BY Организованное программирование | Кирилл Мокевнин




Share with your friend now:
tgoop.com/orgprog/378

View MORE
Open in Telegram


Telegram News

Date: |

The administrator of a telegram group, "Suck Channel," was sentenced to six years and six months in prison for seven counts of incitement yesterday. Clear Joined by Telegram's representative in Brazil, Alan Campos, Perekopsky noted the platform was unable to cater to some of the TSE requests due to the company's operational setup. But Perekopsky added that these requests could be studied for future implementation. Commenting about the court's concerns about the spread of false information related to the elections, Minister Fachin noted Brazil is "facing circumstances that could put Brazil's democracy at risk." During the meeting, the information technology secretary at the TSE, Julio Valente, put forward a list of requests the court believes will disinformation. Telegram users themselves will be able to flag and report potentially false content.
from us


Telegram Организованное программирование | Кирилл Мокевнин
FROM American