🔥

Тред (Тимофей Плотников)


Давайте разберём и эту тему. А то многие молятся на ФП, совершенно не понимая что это. Основные свойства чистых функций: изоляция и идемпотентность. Первое позволяет переиспользовать код, а второе - делает его поведение предсказуемым. Возможно ли это без чистых функций? Ещё как! twitter.com/jsunderhood/st…
Господа, пожалуйста не воспринимайте всерьёз то что написано в этом треде. Нормальная инфа про чистые функции скоро подъедет, сегодня очень загруженный день на работе, но вы держитесь 💪 Если кому есть что сказать - велком в реплаи twitter.com/jin_nin/stat…

Итак, чистые функции. Чистой называется такая функция, которая: Всегда возвращает один и тот же результат при одних и тех же аргументах; Не оказывает никакого влияния на внешний мир - никакого IO, работы с глобальными переменными, бд итд

Выполнив оба этих требования вы получаете чистую функцию. Нарушив хотя бы одно из них, функция теряет некоторые/все свойства, которые делают ее удобной в использовании. Что за свойства?

Облегчённая тестируемость. Так как они не меняют внешний мир и не зависят от окружения, их очень легко тестировать. Просто передайте нужные аргументы и проверяйте что вернулось. Вам не нужны моки, не нужно эмулировать окружение

Referential transparency. Это значит что вы можете заменить вызов этой функции значением которое она возвращает. Например, ваш компилятор может произвести оптимизацию и посчитать функцию во время компиляции, удалить её и на ее место просто поставить результат

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

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

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

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

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

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

При таком раскладе вы точно можете быть уверены, что какой-нибудь Postgres или email api никак не влияют на логику вашего приложения.