Побочным эффектом функции называется изменение и использование для вычислений глобальных переменных, выполнение ввода-вывода. Потенциально такая функция является недетерминированной, т.е. при вызове с совпадающими значения аргументов мы можем получить разные результаты. Такой эффект может получиться также из-за ошибки в программе, которая приводит к UB. Функция ``rand()``, возвращающая случайное число, является очевидным примером недетерминированной функции. Функция ``move`` из примера выше также является недерминированной, так как на нее влияют значения глобальных переменных dx и dy.
Чистые функции являются детерминированными и не имеют побочных эффектов, то есть при вычислениях используют только значения, переданные в качестве аргументов, и не могут вводить и выводить. Детерминированными являются все функции в математике.
С одной стороны, использование чистых функций повышает надежность программы и возможность использования такой функции в других программах, с другой стороны, длинные списки аргументов затрудняют понимание программы, снижают её эффективность (на передачу каждого значения тратится время), поэтому нужно выбрать некоторый компромисс. С точки зрения объектно-ориентированного программирования всю программу можно рассматривать как некоторый объект, глобальные переменные -- это поля этой структуры, а функции -- это функции-элементы этой структуры, т.е. все глобальные переменные являются скрытыми параметрами любой функции, также в параметры можно включить вводимые данные, а вывод -- в результаты функции.
Рассматривая проблему чистоты функции с этой точки зрения, все функции, не имеющие ошибок, будут детерминированы и не будут иметь побочных эффектов.
Поэтому ||.u|нужно указывать в качестве параметров только те значения, которые меняются в разных вызовах этой функции||.