SlideShare a Scribd company logo
ПРИЁМЫ
ФУНКЦИОНАЛЬНОГО ПРОГРАММИРОВАНИЯ
В
ОБЫЧНОМ JAVASCRIPT
КТО ВООБЩЕ Я
Паша Клименков
Senior Software Developer @ Geotab Inc.
Oakville, ON, Canada
О ЧЁМ БУДЕТ ЭТА ПРЕЗЕНТАЦИЯ
• Возьмём некоторые идеи из ФП
• Упростим их до предела
• Применим в JavaScript
• Посмотрим, в чём выгода
О ЧЁМ БУДЕТ ЭТА ПРЕЗЕНТАЦИЯ
• Возьмём некоторые идеи из ФП
• Упростим их до предела
• Применим в JavaScript
• Посмотрим, в чём выгода
О ЧЁМ БУДЕТ ЭТА ПРЕЗЕНТАЦИЯ
• Возьмём некоторые идеи из ФП
• Упростим их до предела
• Применим в JavaScript
• Посмотрим, в чём выгода
О ЧЁМ БУДЕТ ЭТА ПРЕЗЕНТАЦИЯ
• Возьмём некоторые идеи из ФП
• Упростим их до предела
• Применим в JavaScript
• Посмотрим, в чём выгода
О ЧЁМ НЕ БУДЕТ ЭТА ПРЕЗЕНТАЦИЯ
• ООП - дно, ФП - мессия
• Подробная инструкция к ФП
• “Монада - это моноид в категории эндофункторов”
О ЧЁМ НЕ БУДЕТ ЭТА ПРЕЗЕНТАЦИЯ
• ООП - дно, ФП - мессия
• Подробная инструкция к ФП
• “Монада - это моноид в категории эндофункторов”
О ЧЁМ НЕ БУДЕТ ЭТА ПРЕЗЕНТАЦИЯ
• ООП - дно, ФП - мессия
• Подробная инструкция к ФП
• “Монада - это моноид в категории эндофункторов”*
ПЛАН НА ВЕЧЕР
•Immutability
•Просто функции
•Непросто функции
•Комбинация ООП/ФП
•Функторы
•Монады
ЧТО ТАКОЕ ФП?
Такой декларативный стиль программирования, где
все функции - без побочных эффектов, а данные -
readonly.
sql, кстати, тоже декларативный
1. IMMUTABILITY
Объекты не меняют своего состояния
Переменные не меняют свои значения
IMMUTABILITY
• Оперируем только read-only данными
• Если нужно что-то изменить - создаём новый,
измененный экземпляр
ПРИМЕР
Перевод GPS координат в оконные
ПРИМЕР: ИСХОДНЫЕ ДАННЫЕ
ПРИМЕР: МЯСОРУБКА
ПРИМЕР: ЧТО МОЖЕТ МЕНЯТЬСЯ
ПРИМЕР: БЕЗ ПЕРЕМЕННЫХ
ПРИМЕР
Редактирование Entity
ПРИМЕР: КОНСТРУКТОР ENTITY
ПРИМЕР: ЧТО МОЖЕТ МЕНЯТЬСЯ
ПРИМЕР: READ-ONLY ОБЪЕКТ
КАК УМЕНЬШИТЬ СОБЛАЗН
• const либо let вместо var
• filter/map/reduce вместо for
• Object.freeze - контрольный выстрел
IMMUTABILITY: ПЛЮСЫ
• Проще понимать код
• Меньше багов
• Атомарность создания объектов (объект либо готов, либо его еще нет)
• Меньше временного связывания (когда порядок инициализации важен)
• Проще кэшировать
• Потокобезопасность*
IMMUTABILITY: МИНУСЫ
• Дополнительная нагрузка на CPU (больше действий)
• Дополнительная нагрузка на память (больше GC)
• Дополнительная нагрузка на мозг (ООП любит state)
2. ПРОСТО ФУНКЦИИ
Функции первого класса
Чистые функции
ФУНКЦИИ ПЕРВОГО КЛАССА
могут быть переданы в качестве параметра
могут быть присвоены как значения
ЧИСТЫЕ ФУНКЦИИ
• Без побочных эффектов
• Зависят только от входных параметров
(детерминированные)
ПРИМЕР: ПОБОЧНЫЕ ЭФФЕКТЫ
ПРИМЕР: НЕДЕТЕРМИНИРОВАННАЯ
ФУНКЦИЯ
ПРИМЕР: ДЕТЕРМИНИРОВАННАЯ
ФУНКЦИЯ
ПРОСТО ФУНКЦИИ: ПЛЮСЫ
• Нет побочных эффектов
• Меньше багов
• Очень просто тестировать
• Очень просто понимать
• Абсолютная потокобезопасность
• Абсолютная распараллеливаемость
ПРОСТО ФУНКЦИИ: МИНУСЫ
• Нет побочных эффектов
• Наша работа - делать побочные эффекты
• Ввод/вывод, кэш - это всё побочные эффекты
3. НЕПРОСТО ФУНКЦИИ
Композиция функций
Карринг функций
КОМПОЗИЦИЯ ФУНКЦИЙ
Композиция - умное слово, похожее на сложение.
Но для функций.
ПРИМЕР: КОМПОЗИЦИЯ
ПРИМЕР: КОМПОЗИЦИЯ
ПРИМЕР: КОМПОЗИЦИЯ
2 промежуточных массива
ПРИМЕР: КОМПОЗИЦИЯ
Один массив. Совсем один.
ПРИМЕР: ЕЩЕ КОМПОЗИЦИЯ
ПРИМЕР: ЕЩЕ КОМПОЗИЦИЯ
КАРРИНГ
Карринг (каррирование) - частичный вызов функции.
Это когда аргументов мало, а вызвать хочется
ПРИМЕР: КАРРИНГ
ПРИМЕР: КАРРИНГ
ПРИМЕР: КАРРИНГ
ПРИМЕР: КАРРИНГ
ПРИМЕР: КАРРИНГ
ПРИМЕР: КАРРИНГ
НЕПРОСТО ФУНКЦИИ: ПЛЮСЫ
• Большая гибкость в использовании функций
• Функции становятся меньше
• Мемоизация (не влезло в плюсы “просто” функций)
НЕПРОСТО ФУНКЦИИ: МИНУСЫ
• Иногда код становится загадочнее
• Можно ухудшить производительность кода
КОМБИНАЦИЯ ООП/ФП
Оболочка - ООП, ввод/вывод,
побочные эффекты
Ядро - ФП, логика, чистые
функции
Core
Shell
ОСНОВНЫЕ ПРИНЦИПЫ
• Императивная оболочка
• оболочка работает с вводом/выводом
• оболочка очень тонкая
ОСНОВНЫЕ ПРИНЦИПЫ
• Функциональное ядро
• ядро работает с immutable данными и чистыми
функциями
• ядро содержит всю логику приложения
ПРИМЕР: ДВИЖУЩИЕСЯ МАШИНКИ
ПРИМЕР: ДВИЖУЩИЕСЯ МАШИНКИ
ввод/вывод,
оболочка
ПРИМЕР: ДВИЖУЩИЕСЯ МАШИНКИ
логика,
чистые функции
ОБОЛОЧКА/ЯДРО: ПЛЮСЫ
• Основные баги будут в оболочке, которая ужата до
минимума
• Ядро очень просто тестировать. Юнит-тестов достаточно
• Оболочке достаточно нескольких интеграционных тестов
• Command query responsibility segregation из коробки
ОБОЛОЧКА/ЯДРО: МИНУСЫ
• Хоть один?
ФУНКТОРЫ
Умные контейнеры для
значений
ПРИМЕР: СКЛАДЫВАЕМ КАРТИНКИ
ПРИМЕР: СКЛАДЫВАЕМ КАРТИНКИ
ПРИМЕР: СКЛАДЫВАЕМ КАРТИНКИ
ПРИМЕР: СКЛАДЫВАЕМ КАРТИНКИ
ПРИМЕР: СКЛАДЫВАЕМ КАРТИНКИ
??? 3.png ???
ФУНКТОР
• Контейнер вокруг данных,
• который умеет применять к ним функции,
• сохраняя при этом контейнер (результат останется в
контейнере)
ФУНКТОР
• Контейнер - это массив, async, nullable - что угодно
• Внутренние данные - это числа, объекты, функторы -
всё, что угодно
• Функции применяются к данным через map()
ARRAY - ЭТО ФУНКТОР!
PROMISE - ЭТО ТОЖЕ ПОЧТИ ФУНКТОР!
НАЗАД К ПРИМЕРУ
.png
ПОЛЕЗНЫЕ ФУНКТОРЫ
• Maybe
• Either
• IO
• Writer
• State
MAYBE - ПОЧТИ КАК NULLABLE
MAYBE - ПОЧТИ КАК NULLABLE*
MAYBE - ПОЧТИ КАК NULLABLE
MAYBE ПРИМЕР
MAYBE ПРИМЕР
EITHER = LEFT ♥ RIGHT
EITHER = LEFT ♥ RIGHT
EITHER = LEFT ♥ RIGHT
EITHER = LEFT ♥ RIGHT
EITHER = LEFT ♥ RIGHT
EITHER = LEFT ♥ RIGHT
EITHER ♥ РЕЛЬСО-ОРИЕНТИРОВАННОЕ
ПРОГРАММИРОВАНИЕ
Right
Left
f(x) g(x) h(x)
Картинка и концепция взяты отсюда
И НА САМОМ ДЕЛЕ…
Классический Maybe = Just ♥ Nothing
ДРУГИЕ ФУНКТОРЫ
• IO - для ввода/вывода
• Writer - для логов
• State - для… состояний
ФУНКТОРЫ: ПЛЮСЫ
• Удобное управление вычислением
• Разделение контекста и логики
ФУНКТОРЫ: МИНУСЫ
• Крутоватая кривая обучения
• Есть соблазн вставлять функторы туда, где они не
нужны
ПРОПУЩЕННЫЕ ГЛАВЫ
• Аппликативные функторы
• Моноиды
МОНАДЫ
МОНАДЫ ПРОКЛЯТЫ. ЛИБО ВЫ ИХ НЕ
ПОНИМАЕТЕ, ЛИБО НЕ МОЖЕТЕ ОБЪЯСНИТЬ
ПРИМЕР: ВЛОЖЕННЫЕ МАССИВЫ
ПРИМЕР: ВЛОЖЕННЫЕ MAYBE
ПРИМЕР: ВЛОЖЕННЫЕ MAYBE
MAYBE СТАНЕТ МОНАДОЙ, ЕСЛИ
MAYBE СТАНЕТ МОНАДОЙ, ЕСЛИ
MAYBE СТАНЕТ МОНАДОЙ, ЕСЛИ
ВСЁ. ВЫ ЗНАЕТЕ МОНАДЫ.
Whoa!
ARRAY СТАНЕТ МОНАДОЙ, ЕСЛИ
В ECMAScript добавят flatten или flatMap (скоро)
И ДА, PROMISE - ПОЧТИ МОНАДА
Приёмы функционального программирования в обычном JavaScript
ИТОГО
• Immutability - всё read-only, меньше багов
• Чистые функции - без побочных эффектов, еще меньше багов
• Композиция, карринг - переиспользуем функции
• Функторы - разделение контекста и вычислений
• Монады - “правильные” функторы
СПАСИБО!
DotsAndBrackets.com
/pasha.klimenkov
/in/pavelklimenkov
slideshare.com/pashaklimenkov
Вопросы?

More Related Content

PDF
Tofu и его окружение
PDF
SECON'2016. Васильков Василий, Серверное программирование сегодня
PDF
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
PPTX
разработка бизнес приложений (7)
PPTX
мир без Jsp. thymeleaf 2.0
PPTX
Java 8. Autotests in a functional way.
PPTX
Правильная работа с динамической памятью в высоконагруженных проектах (Максим...
PPTX
Нагрузочное тестирование JMeter Кожухов
Tofu и его окружение
SECON'2016. Васильков Василий, Серверное программирование сегодня
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
разработка бизнес приложений (7)
мир без Jsp. thymeleaf 2.0
Java 8. Autotests in a functional way.
Правильная работа с динамической памятью в высоконагруженных проектах (Максим...
Нагрузочное тестирование JMeter Кожухов

What's hot (20)

PDF
Нагрузочное тестирование с помощью Яндекс.Танка
PDF
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
PPT
Presentation_1369080393540
PPTX
FlatGUI: Reactive GUI Toolkit Implemented in Clojure
PDF
Uawebchallenge.yandex.tank
PPTX
Введение в Akka
PPTX
Тестирование отклика Web-интерфейса с JMeter и Selenium
PDF
"Модель акторов и параллелизм с использованием Akka" Зубов Максим, Naumen
PDF
Курс Java-2016. Занятие 09. Web
PPTX
Какой фреймворк нам нужен для Web? Денис Цыплаков
PDF
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
PDF
сервис нагрузочного тестирования Ddosme.ru, иван самсонов
PDF
Григорий Липин: Автоматизация нагрузочного тестирования
PDF
Всему своё время / Роман Ивлиев (Банки.ру)
PDF
ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)
PPTX
Вебинар на тему знакомство с Ansible. популярные практики и ошибки
PDF
Веб-сервер Phantom
PDF
Введение в Python и Django
PDF
PPTX
Высокоуровневый параллелизм
Нагрузочное тестирование с помощью Яндекс.Танка
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
Presentation_1369080393540
FlatGUI: Reactive GUI Toolkit Implemented in Clojure
Uawebchallenge.yandex.tank
Введение в Akka
Тестирование отклика Web-интерфейса с JMeter и Selenium
"Модель акторов и параллелизм с использованием Akka" Зубов Максим, Naumen
Курс Java-2016. Занятие 09. Web
Какой фреймворк нам нужен для Web? Денис Цыплаков
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
сервис нагрузочного тестирования Ddosme.ru, иван самсонов
Григорий Липин: Автоматизация нагрузочного тестирования
Всему своё время / Роман Ивлиев (Банки.ру)
ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)
Вебинар на тему знакомство с Ansible. популярные практики и ошибки
Веб-сервер Phantom
Введение в Python и Django
Высокоуровневый параллелизм
Ad

Viewers also liked (16)

PPTX
А готов ли ваш проект к лету?
PPTX
Web app syncronizations, Sockets, tricks and hacks
PDF
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
PDF
1 grammar preintermediate
PPTX
Yeoman generator своими руками
PPTX
Браузерные API обмена данными: какие и зачем
PDF
Functional programming techniques in regular JavaScript
PDF
Basis.js – «под капотом»
PDF
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
PDF
Remote (dev)tools своими руками
PPTX
Performance: в борьбе за миллисекунды
PPTX
Методологии верстки
PDF
Vue.js - реактивный фронтенд фреймворк для людей
PPTX
Что такое Docker
PPTX
PDF
Railway Oriented Programming
А готов ли ваш проект к лету?
Web app syncronizations, Sockets, tricks and hacks
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
1 grammar preintermediate
Yeoman generator своими руками
Браузерные API обмена данными: какие и зачем
Functional programming techniques in regular JavaScript
Basis.js – «под капотом»
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
Remote (dev)tools своими руками
Performance: в борьбе за миллисекунды
Методологии верстки
Vue.js - реактивный фронтенд фреймворк для людей
Что такое Docker
Railway Oriented Programming
Ad

Similar to Приёмы функционального программирования в обычном JavaScript (20)

PDF
Отладка и эксплуатация Rails-приложений
PPTX
Оптимизация производительности нагруженных веб-систем на Java
PPTX
MagicPlot @ UXSPb @ IT Global Meetup #7
PDF
[jeeconf-2011] Java Platform Performance BoF
PPTX
Highload++2013: TopGun - архитектура терабитной платформы DPI
PPT
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
PPT
Git in Sky presentation @ HighLoad++ 2013
PPTX
Декларативно функциональный стиль в PHP
PPTX
Functional reactive full stack development in java/js (JPoint ed.)
PDF
«​Масштабируемый DevOps​» Александр Колесень
PDF
Масштабируемый DevOps
PPTX
Agile methodologies workshop
PDF
Java Platform Performance BoF
PDF
"Девопс - это не только для программистов. Практические примеры из жизни одно...
PDF
Cергей Константинов, Яндекс
PDF
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
PPTX
Программирование как способ выражения мыслей.
PDF
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
PPTX
Java Ahead-Of-Time compilation
Отладка и эксплуатация Rails-приложений
Оптимизация производительности нагруженных веб-систем на Java
MagicPlot @ UXSPb @ IT Global Meetup #7
[jeeconf-2011] Java Platform Performance BoF
Highload++2013: TopGun - архитектура терабитной платформы DPI
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
Git in Sky presentation @ HighLoad++ 2013
Декларативно функциональный стиль в PHP
Functional reactive full stack development in java/js (JPoint ed.)
«​Масштабируемый DevOps​» Александр Колесень
Масштабируемый DevOps
Agile methodologies workshop
Java Platform Performance BoF
"Девопс - это не только для программистов. Практические примеры из жизни одно...
Cергей Константинов, Яндекс
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Программирование как способ выражения мыслей.
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Java Ahead-Of-Time compilation

More from Pavel Klimiankou (7)

PPTX
Troubleshooting .net core on linux
PPTX
Browser APIs for data exchange: types and application
PPTX
Кратчайшая история JavaScript
PPTX
What is Docker
PPTX
Chrome Extensions
PPTX
Game physics in JavaScript
PPTX
Игровая физика в JavaScript
Troubleshooting .net core on linux
Browser APIs for data exchange: types and application
Кратчайшая история JavaScript
What is Docker
Chrome Extensions
Game physics in JavaScript
Игровая физика в JavaScript

Приёмы функционального программирования в обычном JavaScript