Побочные эффекты такие же, как и у любого другого оружия. Они, несомненно, полезны и потенциально очень опасны при неправильном обращении.
Как и у оружия, у вас есть побочные эффекты всех видов всех степеней летальности.
В C ++ побочные эффекты абсолютно неограничены благодаря указателям. Если переменная объявлена как «приватная», вы все равно можете получить к ней доступ или изменить ее, используя приемы указателей. Вы даже можете изменять переменные, которые не находятся в области видимости, такие как параметры и локальные параметры вызывающей функции. С небольшой помощью операционной системы (mmap) вы даже можете изменить машинный код вашей программы во время выполнения! Когда вы пишете на таком языке, как C ++, вы повышены до уровня Бит-бога, мастера всей памяти в вашем процессе. Все оптимизации, которые компилятор вносит в ваш код, сделаны при условии, что вы не злоупотребляете своими полномочиями.
В Java ваши возможности более ограничены. Все переменные в области видимости находятся под вашим контролем, включая переменные, используемые разными потоками, но вы всегда должны придерживаться системы типов. Тем не менее, благодаря тому, что в вашем распоряжении есть подмножество ОС и наличие статических полей, ваш код может иметь нелокальные эффекты. Если отдельный поток как-то закрывает System.out, это будет похоже на магию. И это будет магией: магия побочного действия.
У Haskell (несмотря на пропаганду о чистоте) есть монада IO, которая требует, чтобы вы зарегистрировали все свои побочные эффекты в системе типов. Включение вашего кода в монаду ввода / вывода похоже на трехдневный период ожидания для пистолетов: вы все равно можете отмахнуться, но только после того, как вы согласитесь с правительством. Также есть unsafePerformIO и тому подобное, которые являются черным рынком Haskell IO, предоставляя вам побочные эффекты без вопросов.
Миранда, предшественница Haskell, является чисто функциональным языком, созданным до того, как монады стали популярными. Миранда (насколько я узнал ... если я ошибаюсь, заменим лямбда-исчисление) вообще не имеет IO-примитивов. Единственный ввод-вывод - это компиляция программы (входные данные), запуск программы и печать результата (выходных данных). Здесь у вас есть полная чистота. Порядок исполнения совершенно не имеет значения. Все «эффекты» являются локальными для функций, которые их объявляют, то есть никогда не могут две непересекающиеся части кода влиять друг на друга. Это утопия (для математиков). Или, что то же самое, дистипия. Это скучно. Ничего не происходит Вы не можете написать сервер для этого. Вы не можете написать ОС в нем. Вы не можете написать SNAKE или Tetris в нем. Все просто сидят и смотрят математически.