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: |

As of Thursday, the SUCK Channel had 34,146 subscribers, with only one message dated August 28, 2020. It was an announcement stating that police had removed all posts on the channel because its content “contravenes the laws of Hong Kong.” bank east asia october 20 kowloon Telegram Android app: Open the chats list, click the menu icon and select “New Channel.” Telegram iOS app: In the “Chats” tab, click the new message icon in the right upper corner. Select “New Channel.” How to Create a Private or Public Channel on Telegram?
from us


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