JavaScript и функциональное программирование #тред
Как известно, JavaScript мультипарадигменный ЯП, позволяет писать код в различных стилях:

* событийно-ориентированный - обработка DOM-событий
* объектно-ориентированный - благодаря прототипному наследованию
* императивный - переменные, выражения, условия, циклы

Что насчет ФП?
Из лекции: Лямбда-исчисление
Лямбда исчисления это основа, на которой строятся функциональные языки.

Однако при работе с популярными библиотеками в JavaScript или, решая повседневные для этого языка задачи, как правило, мы не сталкиваемся с понятиям из теории λ-исчислений.

Откуда тогда берется ФП?
λ-исчисления основа для ФП.
Но это не значит, что без Лямбд ФП не бывает

Полная версия доклада:
Получается, что и в JavaScript можно использовать концепции из мира ФП, элементы ФП, как следствие писать в ФП-стиле, если конечно ЯП их поддерживает.

Концепций в мире ФП очень много, упомянутые вне треда map/reduce это лишь крупица всей этой ФП пирамиды

А некоторые абстракции из мира ФП могут лежать на поверхности, и рядовой разработчик скорее всего не будет знать об их существовании

В JavaScript - оператор optional chaining (.?): developer.mozilla.org/en-US/docs/Web…

Полная версия доклада:
Какие ФП концепции нам доступны или мы можем реализовать в JavaScript, языке с динамической и слабой типизацией?

Функции высшего порядка, композиция функций, каррирование, предикаты, частичное применение и так далее

По ссылке все примеры на JavaScript:
habr.com/ru/post/310172/
Касательно абстракций, существует библиотека, которая их реализует

Если синтаксис js для работы с функциями ещё похож на что-то из фп мира, то абстракции непривычно, для так совсем новичка пугающее

github.com/fantasyland/fa…
Зачем нужны эти абстракции? Выглядит далёким от реальной и практической жизни?

Прикладное применение имеется. Например, моноид, может помочь распаралелить вычисления.

Правда в мире JavaScript это все равно какая-то редкая задача, если не уникальная

ru.m.wikipedia.org/wiki/Моноид
Спустимся на землю, вернемся к коду, чтобы продемонстрировать ФП подход в JS, есть задачка:

Реализовать функции:
five, add, one, two, seven, add, subtract

Должны удовлетворяться следующие проверки:
five(add(one())) === 6
seven(subtract(two())) === 5

Вариант решения:
Демонстрацию некоторых основных элементов ФП в JS на практике еще в 2015 году сделал MPJ на своем канале FunFunFunction

Функции высшего порядка, map, reduce, рекурсия, каррирование, функтор и тд

Ссылка на плейлист:
1/3 Помимо упомянутых элементов ФП в JS, в JS можно реализовать то, что называется иммутабельностью,
Это такое поведение, когда при попытке модифицировать объект или данные в какой-то структуре, вместо модификации объекта/структуры создается новый модифицированный
2/3 Как это сделать в JS?
Клонировать объект и модифицировать у него поле.
Для массивов существуют методы которые возвращают новый массив/значение (map, filter, reduce и тд)
developer.mozilla.org/en-US/docs/Web…

Или можно воспользоваться готовой библиотекой:
immutable-js.github.io/immutable-js/d…
3/3 Иммутабельность

+:
Иммутабельные объекты (исходный легко и его модифицированная копия) дешево сравниваться м/у собой, тк сравнение происходит по ссылке

-:
Нагрузка на сборщик мусора, который будет удалять из памяти не используемые оригиналы объектов

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with jsunderh00d

jsunderh00d Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @jsunderhood

14 Oct
JavaScript и Браузер #тред
За 30 лет с момента появления 1ого браузера многое изменилось. Браузеры сегодня это очень сложное прикладное ПО. Об этом можно даже судить в 1ом приближении по кол-ву строк кода

How Many Millions of Lines of Code Does It Take (February 8, 2017)
visualcapitalist.com/millions-lines…
Ни для кого не станет открытием, если я напишу, что на текущий момент браузер Google Chrome, является самым популярным, более того, он занимает около 2/3 рынка.

Read 16 tweets
13 Oct
JavaScript и динамическая типизация #тред Image
Если предпосылки слабой типизации в JavaScript были туманны, то решение сделать JavaScript динамическим языком было изначально. Это решение вдохновлено Self, Scheme и испытало на себе влияние Java, C.

Подробнее об этом:
JavaScript: The First 20 Years. dl.acm.org/doi/pdf/10.114…
Тяжело дать однозначное трактование динамической типизации, но можно через сравнение со статической. Переменные связываются с типов в момент объявления переменной - статическая типизация, при присваивании значения - динамическая типизация.
Read 18 tweets
4 Jul
Давайте попробуем старую практику как мир: лайк этому посту от вас, факт про эффектор, его историю и концепции от меня. Посмотрим насколько меня хватит!
Изначально effector был миддлварой для ридакса и разрабатывался для высоконагруженного клиента реалтайм чата, вроде Телеграм.
Пока флоу не умер, имелась его первоклассная поддержка. Сейчас типы затачиваются под TypeScript.
Read 33 tweets
4 Jul
Каким боком @effectorjs помогает выстроить архитектуру приложений? Очень просто: он является языком описания бизнес-логики. А еще и помогает связать логику с представлением.
К чему мы привыкли? Встраиваем управление состоянием внутрь React. И после этого продолжаем называть REACT библиотекой, хотя он уже давно ФРЕЙМВОРК.
Мне не нравится такое положение. Из-за возраста React нам приходится очень долго ждать ConcurrentMode, терпеть издевательства StrictMode и наглости memo.
Read 18 tweets
29 Jun
Давайте начнем с вопроса. Что такое архитектура фронтенда? Это как директории называются? Правила взаимного импорта? Какой стек используется?
Почему меня вообще беспокоит архитектура и структура проекта? Начну с того, что "хорошая" структура вносит ясность. Где искать конкретный код. Куда положить новый. Как писать код командой не внося изменения одновременно в один файл.
С архитектурой сложнее, ведь она про отношение сущностей вашего проекта. Как выстроить зависимости между сущностями и модулями так, чтобы добавление нового кода не требовало внесения изменений в существующий код.
Read 6 tweets
15 Apr
Байка: когда-то я считал, что эти психологии - лишь выдумки соплежевателей, которые придумали себе что-то там. И проблемы бывают только объективные - ногу сломал, или отравился. Кстати, тогда я был бекендером, и считал фронтендеров соплежуями. Видимо это связано с типизацией 🤔
Это отлично укладывается в характеристику ригидной психики. Люди ригидного склада ума чётко знают, что и как происходит вокруг и с ними самими. Чаще всего это военные, немцы, бекендеры. И быть ригидным неплохо - меньше переживаешь, есть план и ты его придерживаешься
Но вот в случае непредвиденных обстоятельств, когда ваша картина мира рушится - трагедия, пандемия, или оказалось, что С++ не лучший в мире язык, а за JS платят больше - ригидным людям крайне тяжело подстроиться, они продолжают держаться за свои убеждения и планы. А мир в труху.
Read 21 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Too expensive? Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal Become our Patreon

Thank you for your support!

Follow Us on Twitter!