Pull to refresh

Comments 18

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


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

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

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

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

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

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

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

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

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

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

И еще припоминается байка времен второй мировой, когда в приказном порядке величину числа ПИ изменили, для того чтобы ускорить выполнение баллистических расчетов.
UFO just landed and posted this here
UFO just landed and posted this here

Хотел было возразить, что есть в 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. Что ж такое? Ага… Он, оказывается был, временно, под флагом, но затем его выпилили по причинам каких-то сложностей. Эх...

UFO just landed and posted this here
UFO just landed and posted this here
Sign up to leave a comment.