Как стать автором
Обновить

Комментарии 18

Теперь представьте себе, что некие математики пришли к выводу о том, что значением константы PI должно являться число 42, из-за чего было изменено значение этой константы.


А если вернуться в реальный мир, в котором значение константы PI никогда не изменится, то можно ли считать вышеозначенную функцию чистой?
нельзя, вы опираетесь на значение из вне и нет никаких гарантий что кто-то в глобальном контексте не назовет так переменную PI(productIdx, к примеру), кроме того, даже если вы напрямую в теле функции будете обращаться к Math.PI не стоит забывать что это число иррациональное и нельзя гарантировать что кол-во знаков после запятой будет одним и тем же в любом среде выполнение. Ну и опять же никто вам не запрещает переписать 'Math' в глобальном контексте
Это я все понимаю. И определение чистой функции знаю. Я предложил в данном конкретном случае стать реалистом. PI не поменяется, Math никто переопределять не будет в здравом уме, а отсюда следует, что функция всегда будет возвращать одно и то же.
Разные среды выполнения в расчет брать не будем. Ведь если в двух средах PI отличается, то и функция будет возвращать два разных результат хоть ты будешь использовать глобальную переменную, хоть передавать ее параметром. Но эти результаты будут постоянны и неизменны для данной среды выполнения.
Извините, давайте будем реалистами до конца. Реальное PI — да, не поменяется. Но его невозможно записать в полной форме в коде. Оно будет всегда с какой-то точностью. Для одних проектов этой точности будет достаточно. Для других — нет.

В примере описана самопальная константа, а в JS уже есть Math.PI. Уже из этого понятно, что во многих компаниях на коде-ревю такой код будет вернут с примечанием «зачем не используешь уже имеющуюся константу?».

Math.PI — 3.141592653589793
Это приведет к тому, что результаты функции будут отличаться от случая PI = 3.14 уже довольно быстро

НЛО прилетело и опубликовало эту надпись здесь
Да. Этот пункт глупость. С такой же логикой можно представить, что математики сменят механизм умножения, который так же используется внутри функции. А значит надо сменить его на функцию (в js умножение это оператор) и передавать ее параметром.
Да нет. Пункт правильный. Просто пример, на мой взгляд, не самый удачный.
Приведете более удачный пример?
Вы устроились работать над запуском ракет, и теперь «3.14» в колличестве знаков после запятой, вам не достаточно…
+
Полностью согласен. Функция будет чистой даже если её реализация опирается на некоторое множество внешних констант.

К примеру, мы ведь не передаеём весь набор используемых функций ( map, fold, filter… например ) явно, аргументами? А чем они отличаются от PI из примера?

Т.е. функция всё еще будет чистой, если она опирается на константy, и уже не будет, если на переменную.

К тому же, мы обыно говорим о чистоте функции в контексте текущей «сессии» а не вообще. Т.е. если матемаки изменят PI на 42, мы заменим константу, и перезапустим софт.

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

Зато вполне можно представить какие нибудь вычисления, где используется такая физическая константа, как G (гравитационная постоянная). Та самая, которая из формулы всемирного тяготения,
F = G * m1 * m2 / R**2
Величину G, (в отличие от числа Пи) точно вычислить оказывается уже не так просто. Поэтому значение этой константы периодически уточняют (применяя усовершенствованные методы измерений), и она, (хотя это довольно дико звучит), изменяется…
Подробности — в википедии.

Имеют право измениться (хотя скорее, не измениться, а уточниться) и другие константы (такие, как радиус Земли, ее масса, и пр)

И еще припоминается байка времен второй мировой, когда в приказном порядке величину числа ПИ изменили, для того чтобы ускорить выполнение баллистических расчетов.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь

Хотел было возразить, что есть в V8 оптимизация хвостовой рекурсии. Даже написал простенький тест:


tail
const rec = (limit, val = 1, depth = 1) =>
{
    if(depth === limit)
        return val + 1;
    else 
        return rec(limit, val + 1, depth + 1);
}
rec(300000)

Но получил Uncaught RangeError: Maximum call stack size exceeded. Что ж такое? Ага… Он, оказывается был, временно, под флагом, но затем его выпилили по причинам каких-то сложностей. Эх...

НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий