Судя по тому, что сказано в видео, Мартин один из немногих, кто использует термин «побочный эффект» правильно. Есть ощущение, что идею о том, что любое изменение состояния следует считать побочным эффектом, внедрили функциональщики в контексте очернения императивного программирования. Мартин же знает, чем отличается целевое изменение состояние и побочные эффекты, производимые заодно.
Вот такой комментарий оставили под видео с разбором темы функций в книге чистый код. Ну один такой коммент ладно еще никуда не шло, но там их было далеко не один, с таким же посылом. Не могу тут промолчать, потому что это опасная дорожка, которая уводит нас далеко в сторону.
Словосочетание "побочный эффект" (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, где сайдэффекты вынесены на уровень системы типов. Как только вы захотите записать в файл внутри вашей функции, вы сразу прочувствуете всю боль и сложность сайд эффектов. Язык вас буквально заставит работать с ними правильно, либо придется страдать. Это одна из ключевых ценностей, которую дает фп и которая значительно влияет на ваш стиль программирования в императивных языках.
Присоединяйтесь — мы покажем вам много интересного
Присоединяйтесь к ОК, чтобы подписаться на группу и комментировать публикации.
Нет комментариев