47
@maxmaxmaxmax МАКСИМ КЛИМИШИН CTO GVMachines Inc. Трансдюсеры , CSP- каналы , неизменяемые структуры данных в JavaScript

JSLab. Максим Климишин. "Трансдюсеры, CSP каналы, неизменяемые структуры данных"

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)

iterable

map(f1)

map(f2)

filter(f3)

reducer

sequence

Трансдюсер

Very simple example

Fizz buzz

Выносим за пределы обработки

‣ функцию-трансформер или предикат

‣ функцию-накопитель результата обработки

Простейший трансдюсер готов!

КОМПОЗИЦИЯ

1.Последовательное прохождение

2.Буферизация обработки

3.Произвольное прерывание

1.Буферизация/стриминг

2.Независимость от типа данных и хранилища

3.Композиция хранилищ

НАКОПЛЕНИЕ

Важные фичи

‣ Значение по умолчанию в зависимости от типа накопителя

‣ Прерывание редукции (early termination), будет

‣ Очистка после работы (clean up state), реализовать протокол

Protocol

РАЗДЕЛЕНИЕ ОТВЕТСТВЕННОСТИ FTW!

MAP, FILTER, REDUCE – ЭТО ПРОСТО КРУТО

А ТРАНСДЮСЕРЫ – ЭТО ОФИГЕННО.

ASYNCHRONOUS WORKFLOWS

‣ Promises

‣ Events emitters and handlers

‣ ES6 generators

Стандартный набор

‣ Promises – нужно явно помечать статус .done()

‣ Events emitters and handlers – не очень реюзабельны, много boilerplate кода

‣ ES6 generators – слишком низкий уровень

Слишком низкий уровень.

CSP (Communicating sequential processes) – это формализованный путь описания взаимодействия в асинхронных средах.

Существует две основные модели

‣ Actors model

‣ CSP Channels

Promises

CSP Channels

Actors

Где вам ехать?

НЕИЗМЕНЯЕМЫЕ СТРУКТУРЫ ДАННЫХ

Immutable.js

‣ явное изменения состояния – всегда нужно использовать присваивание

‣ Эффективность: hash map tries, vector tries, минимализирует копирование данных

‣ Линейная

Record type

With transducers

React.js

React.js + FLUX

Performance

http://jsperf.com/plain-js-vs-immutable-vs-mori/2

В ЦЕЛОМ

ПОЧЕМУ ВАЖНО?

чистые функции pure functions

нет побочных эффектов no side-effects

эффективная организация взаимодействия thoughtful concurrency management

Спасибо!

@maxmaxmaxmax