Upload
max-klymyshyn
View
466
Download
2
Embed Size (px)
Citation preview
@maxmaxmaxmaxМАКСИМ КЛИМИШИНCTO GVMachines Inc.
Трансдюсеры, CSP-каналы, неизменяемые структуры данных в JavaScript
Обо мне‣ 11+ лет опыта веб разработки, 5 лет JavaScript,
6 лет Python
‣ Работал в oDesk, Helios, 42cc.
‣ Со-организатор конференций PyCon Ukraine, KyivJS
‣ 3 года работаю техническим директором в ZAKAZ.UA
Не хочу вас расстраивать, но у меня все хорошо
‣ Transducers
‣Asynchronous workflows
‣ Immutable data structures
Rich Hickey6 августа 2014
пост о трансдюсерах в Clojure
Transducers – composable algorithmic transformations
ТРАНСДЮСЕРЫ ПОШЛИ ХОРОШО
Концепция так хорошо пошла, что сейчас есть реализации для Python, Ruby, Erlang, C++ и так далее
I think this library was originally designed to fix a javascript problem, not a Python problem.
alcalde, reddit
Где пригодится трансдюсеры
‣ Любой код с серьезным анализом или преобразованием последовательностей
‣ Обработка потоков данных
‣ Параллельные вычисления (Fork-Join model)
Рост сложности любой программы ограничен тем пределом, до которого можно сохранять контроль над ней: …
Martin Ward, «Language Oriented Programming»
Мой взгляд
‣ Со временем компонентов в системе становится больше, времени на поддержку этих компонентов уходит больше
‣ Поэтому читабельность кода и простота его отладки я рассматриваю как инвестицию, возможность тратить меньше времени на поддержку (сейчас или в будущем)
‣ И больше времени тратить на новые фичи
REDUCE
Array.prototype.reduce(reducer[, initial])
whatever, input -> whatever
reduce более фундаментальная функция, чем map или filter.
С помощью reduce их легко реализовать
Transform Reducerфункция, которая принимает редюсер, преобразует его и возвращает новый редюсер
(whatever, input -> whatever) -> (whatever, input -> whatever)
Выносим за пределы обработки
‣ функцию-трансформер или предикат
‣ функцию-накопитель результата обработки
Простейший трансдюсер готов!
КОМПОЗИЦИЯ
1.Последовательное прохождение
2.Буферизация обработки
3.Произвольное прерывание
1.Буферизация/стриминг
2.Независимость от типа данных и хранилища
3.Композиция хранилищ
НАКОПЛЕНИЕ
Важные фичи
‣ Значение по умолчанию в зависимости от типа накопителя
‣ Прерывание редукции (early termination), будет
‣ Очистка после работы (clean up state), реализовать протокол
‣ Promises – нужно явно помечать статус .done()
‣ Events emitters and handlers – не очень реюзабельны, много boilerplate кода
‣ ES6 generators – слишком низкий уровень
CSP (Communicating sequential processes) – это формализованный путь описания взаимодействия в асинхронных средах.
Immutable.js
‣ явное изменения состояния – всегда нужно использовать присваивание
‣ Эффективность: hash map tries, vector tries, минимализирует копирование данных
‣ Линейная
ПОЧЕМУ ВАЖНО?
чистые функции pure functions
нет побочных эффектов no side-effects
эффективная организация взаимодействия thoughtful concurrency management