Функциональное программирование: побочные эффекты

Большинство учебников / статей / книг говорят о побочных эффектах при представлении функционального программирования. Возьмите этот код Python:

def isPrime(n):
    k = 2
    while k < n:
        if n % k == 0:
            return False
        k += 1
    return True

В тексте говорится, что вышеуказанная функция имеет локальные побочные эффекты, и я этого не понимаю. Я вижу, что переменная "k" меняется, я не понимаю, что из этого получается плохого.

Может ли кто-нибудь привести наглядный пример плохого побочного эффекта и как его избежать при функциональном программировании?

2 ответа

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

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

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

Изменить: Теперь я вижу ваше замечание о "плохих" побочных эффектах. Я бы не сказал, что побочные эффекты плохие. На большинстве основных языков трудно программировать без них, и я думаю, что многие программисты думают с точки зрения побочных эффектов. Но в больших программных проектах слишком сильное использование побочных эффектов может сделать вашу жизнь довольно несчастной. Вот хороший пример с участием синглетонов (лучший способ вызвать побочные эффекты)

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

Побочные эффекты (в частности, отсутствие ссылочной прозрачности) делают результат вашего кода зависимым от порядка выполнения операторов. Таким образом, изменение порядка вызова некоторой пары вызовов функций может привести к изменению поведения в отключенной области вашей программы. Это потому, что они не были на самом деле отключены из-за взаимного обмена побочными эффектами.

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

Другие вопросы по тегам