Рекомендуется хранить вычисление значений (выражений) отдельно от выполнения действий (выражений). Нам нужен точный контроль над тем, где и когда будут предприняты действия (например, отображение сообщений), но при расчете значений мы предпочли бы работать на более абстрактном уровне и не должны заботиться о том, как эти значения рассчитываются.
Функция, которая только вычисляет возвращаемое значение, используя только аргументы, которые она дает, называется чистой .
«Функция», которая выполняет действие, на самом деле является процедурой , которая оказывает влияние .
Любые эффекты, возникающие при вычислении значения, называются побочными эффектами , и лучше избегать их, где это возможно («Мне просто нужна была эта строка, я не знал, что это приведет к разрушению базы данных!»).
Чтобы свести к минимуму вероятность побочных эффектов, мы должны избегать отправки слишком большого количества данных в наши процедуры или каких-либо расчетов в них; если какое-то вычисление необходимо выполнить заранее, обычно лучше сделать это отдельно в чистой функции, а затем передать в процедуру только требуемый результат. Это сохраняет цель процедуры ясной и снижает вероятность того, что она будет позже использована позже как часть вычисления (вместо этого можно использовать чистую функцию).
По той же причине мы должны избегать обработки результатов внутри процедуры. Лучше вернуть результат (если есть) нашего нашего действия и выполнить любую последующую обработку с чистыми функциями.
Если мы будем следовать этим правилам, мы можем получить такую процедуру sayHello
, которая не требует каких-либо данных и не дает результата. Следовательно, лучший интерфейс для этого - не иметь аргументов и не возвращать значение. Это предпочтительнее, например, для вызова «console.log» во время некоторых вычислений.
Чтобы уменьшить потребность в эффектах во время вычислений, у нас могут быть вычисления, которые возвращают процедуры ; например. если нам нужно определиться с действием, которое нужно предпринять, мы можем иметь чистую функцию, которая выбирает процедуру и возвращает ее, а не выполняет ее напрямую.
Аналогично, чтобы уменьшить потребность в вычислениях во время процедур, у нас могут быть процедуры, принимающие другие процедуры в качестве параметров (возможно, результат функции); например. взятие множества процедур и выполнение одной за другой.