@maxmaxmaxmaxМАКСИМ КЛИМИШИН
CTO GVMachines Inc.
Трансдюсеры,
CSP-каналы,неизменяемые
структуры данных в JavaScript
Обомне
‣ 11+ летопытавебразработки,5летJavaScript,
6летPython
‣ Работалв oDesk,Helios,42cc.
‣ Со-организаторконференцийPyConUkraine,
KyivJS
‣ 3годаработаютехническимдиректоромв
ZAKAZ.UA
Нехочувас расстраивать,но у
менявсехорошо
‣ Transducers
‣ Asynchronousworkflows
‣ Immutabledatastructures
ТРАНСДЮСЕРЫ –
НОВАЯ
КОНЦЕПЦИЯ ПО
РАБОТЕ С
ДАННЫМИ
Rich Hickey
6 августа 2014
пост о трансдюсерах в
Clojure
Transducers – composable algorithmic transformations
ТРАНСДЮСЕРЫПОШЛИ
ХОРОШО
Концепциятакхорошопошла,что
сейчасестьреализациидля Python,
Ruby,Erlang, C++итакдалее
Ithinkthislibrarywasoriginallydesigned
tofixajavascriptproblem,notaPython
problem.
alcalde, reddit
Гдепригодится
трансдюсеры
‣ Любойкодссерьезным анализомили
преобразованиемпоследовательностей
‣ Обработка потоковданных
‣ Параллельныевычисления(Fork-Joinmodel)
Ростсложностилюбойпрограммы
ограничентемпределом,докоторого
можносохранятьконтрольнадней:…
MartinWard,«Language Oriented Programming»
Мой взгляд
‣ Современемкомпонентовв системе
становится больше,временинаподдержку
этихкомпонентовуходитбольше
‣ Поэтомучитабельностькода ипростотаего
отладкиярассматриваюкакинвестицию,
возможностьтратитьменьшевремени на
поддержку (сейчасиливбудущем)
‣ Ибольшевременитратитьна новыефичи
REDUCE
Array.prototype.reduce(reducer[,initial])
whatever,input ->whatever
reduceболеефундаментальнаяфункция,
чемmapилиfilter.
Спомощьюreduceихлегкореализовать
TransformReducer
функция,которая принимаетредюсер,
преобразуетего ивозвращает новыйредюсер
(whatever,input ->whatever)->(whatever,input->
whatever)
iterable
map(f1)
map(f2)
filter(f3)
reducer
sequence
Трансдюсер
Verysimpleexample
Fizzbuzz
Выносимзапределы
обработки
‣ функцию-трансформерилипредикат
‣ функцию-накопительрезультатаобработки
Простейшийтрансдюсерготов!
КОМПОЗИЦИЯ
1. Последовательное
прохождение
2. Буферизацияобработки
3. Произвольноепрерывание
1. Буферизация/стриминг
2. Независимость от типа
данныхихранилища
3. Композицияхранилищ
НАКОПЛЕНИЕ
Важныефичи
‣ Значениепоумолчаниювзависимостиоттипа
накопителя
‣ Прерываниередукции(earlytermination),будет
‣ Очисткапослеработы(cleanupstate),
реализоватьпротокол
Protocol
РАЗДЕЛЕНИЕ
ОТВЕТСТВЕННОСТИ
FTW!
MAP, FILTER, REDUCE – 
ЭТО ПРОСТО КРУТО
А ТРАНСДЮСЕРЫ –
ЭТО ОФИГЕННО.
ASYNCHRONOUSWORKFLOWS
‣ Promises
‣ Events emittersandhandlers
‣ ES6generators
Стандартныйнабор
‣ Promises– нужноявнопомечатьстатус.done()
‣ Events emittersandhandlers – неочень
реюзабельны,многоboilerplateкода
‣ ES6generators– слишкомнизкийуровень
Слишкомнизкийуровень.
CSP(Communicatingsequential
processes)– этоформализованныйпуть
описаниявзаимодействияв
асинхронныхсредах.
Существуетдве основные
модели
‣ Actors model
‣ CSPChannels
Promises
CSPChannels
Actors
Где вамехать?
НЕИЗМЕНЯЕМЫЕСТРУКТУРЫ
ДАННЫХ
Immutable.js
‣ явное изменениясостояния– всегданужно
использовать присваивание
‣ Эффективность:hashmaptries,vectortries,
минимализируеткопированиеданных
‣ Линейная
Recordtype
With transducers
React.js
React.js +FLUX
Performance
http://jsperf.com/plain-js-vs-immutable-vs-mori/2
ВЦЕЛОМ
ПОЧЕМУВАЖНО?
чистыефункции
purefunctions
нетпобочныхэффектов
noside-effects
эффективнаяорганизациявзаимодействия
thoughtfulconcurrencymanagement
Спасибо!
@maxmaxmaxmax
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript

Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript