22
"Переход от коллбеков к событиям" Веретенников А. Семаков И.

SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям

Embed Size (px)

DESCRIPTION

«Расскажем о нашем опыте перехода к событийной модели при разработке одного из проектов заказчика. О том, какие подходы использовали, с какими проблемами столкнулись, как с ними боролись и что в итоге получили. А также о том, как бы сделали подобный проект, уже имея текущую экспертизу :) Целевая аудитория: frontend-разработчики, познавшие боль при реализации сложных интерфейсных решений на базе коллбеков; использующие JS в качестве инструмента для разработки, а не только для подключения готовых скриптов».

Citation preview

Page 1: SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям

"Переход от коллбеков к событиям"

Веретенников А.Семаков И.

Page 2: SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям

Задача: разработать frontend-часть для нового проекта заказчика

Public API

Backend FrontendAJAX

Page 3: SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям

Задача: разработать frontend-часть для нового проекта заказчика

Frontend

Page 4: SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям

Задача: разработать frontend-часть для нового проекта заказчика

Пути решения

Callback

Page 5: SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям

Задача: разработать frontend-часть для нового проекта заказчика

Пути решения

Event-driven

Page 6: SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям

Задача: разработать frontend-часть для нового проекта заказчика

Пути решения

Callback Event-driven

?

Page 7: SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям

CallbackСначала все выглядит вот так

Component_1 = { update : function( callback ){ callback() }, reset : function( callback ){ callback() }};

Component_2 = { business : function(){ Component_1.update(Component_2.callback); }, callback : function(){ ... }};

Page 8: SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям

CallbackПоявляются новые требованияComponent_1 = { update : function( callback ){ callback() }, reset : function( callback ){ callback() }};

Component_2 = { business : function(){ Component_1.update(Component_2.callback); }, callback : function(){ ... }};

Component_3 = { business : function(){ Component_1.reset(Component_3.callback); }, callback : function(){ ... }};

Page 9: SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям

Callback... и еще:Component_1 = { update : function( callback ){ callback() }, reset : function( callback ){ callback() }};

Component_2 = { business : function(){ Component_1.update(Component_2.callback); }, callback : function(){ ... }};

Component_3 = { business : function(){ Component_1.reset(Component_3.callback); }, callback : function(){ ... }};

Component_4 = { business : function(){ Component_2.business(); }};

Page 10: SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям

Callback.. а в итоге получаем

Page 11: SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям

Callback

Хорошо работают на несложных проектах

Слабая гибкость из-за постоянно возрастающих зависимостей

Page 12: SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям

Event-driven. Теория

Page 13: SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям

Event-driven. Теория

<ОБРАЗЕЦ КОДА>

Page 14: SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям

Event-driven. Практика

С точки зрения кода Manager - тот же Module

В нашем случае, часть функций менеджера выполняется jQuery

Другая часть выполняется одним из компонентов

Manager "размазало" по коду :)Но дискомофорта из-за этого не испытываем

Page 15: SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям

Event-driven. Практика

Шина

Непосредственно на компоненте

Специально созданный объект (proxy)

Генерируем сразу на компоненте.Избавились от посредников

Вызов событий

Page 16: SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям

Event-driven. Практика

События привязаны к компонентам.

Некоторые события существуют вне компонентов (один элемент - один эвент - несколько компонентов)

Разные компоненты могут вызывать один и тот же эвент

Проблема зоны видимости событий

Page 17: SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям

Event-driven. Практика

Каждому источнику - уникальное событие

Передавать источник события

Источник события — параметр события

Кто вызвал событие на компоненте?

Page 18: SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям

Event-driven. Практика

Получатель - не всегда источник.

Каждому получателю - уникальное событие

Передавать получателя

Получатель события - параметр события

Для кого предназначено событие?

Page 19: SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям

Event-driven. Практика

Как быть с дефолтными событиями?

Как быть с событиями конкретных компонентов?

Что делать с общими событиями?

Имена события - параметризуемые.

Проблема именования событий

Page 20: SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям

Event-driven. Практика

Событие предназначено для связывания компонентов

Компонент слушает сам себя

Кто кого: метод вызывает событие или же событие вызывает метод?

Проблемы внутри компонента

Page 21: SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям

Event-driven. Итоги

Одинаково работают на любых проектах

Меньше зависимостей, больше гибкости

Лучшая отказоустойстойчивость

Сложность восприятия

Page 22: SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям

Забыть нельзя использовать