SlideShare ist ein Scribd-Unternehmen logo
1 von 36
Downloaden Sie, um offline zu lesen
Observable как атом приложения
Я
Артем Бей - разработчик интерфейсов
@defly_self
http://tweereal.com/
http://youscan.ru/ (мониторинг соц. медиа)
“we believe that the essential material to be
addressed by a subject at this level is not the
syntax of particular programming-language
constructs, nor clever algorithms for
computing particular functions efficiently, nor
even the mathematical analysis of
algorithms and the foundations of
computing, but rather the techniques used to
control the intellectual complexity of
large software systems.”
Structure and Interpretation of Computer Programs
<button onclick=‘handler()’>
$(‘.click-button’).click(handler);
фреймворки, AMD и даже новые языки
программирования (Dart, ClojureScript,
CoffeeScript, TypeScript и тд).
В чем сложность?
В событиях!
• Сложно компоновать несколько событий
• Сложно соблюдать очередность
• Одни события могут создавать другие и
за этим всем сложно следить
Способы борьбы
• Дисциплина
• Control-flow библиотеки
• Promises
Control-flow
async.parallel([
function(callback){
setTimeout(function(){
callback(null, 'one');
}, 200);
},
function(callback){
setTimeout(function(){
callback(null, 'two');
}, 100);
}
],// optional callback
function(err, results){
// the results array will equal ['one','two'] even though
// the second function had a shorter timeout.
});
Promises
Q.fcall(step1)
.then(step2)
.then(step3)
.then(step4)
.then(function (value4) {
// Do something with value4
}, function (error) {
// Handle any error from step1 through step4
})
.done();
Functional Reactive Programming
FRP
Обработка данных
которые меняются со
временем
События оборачиваются в потоки,
которые возможно
• Фильтровать
• Объединять (merge)
• Комбинировать (zip)
• Тротлить (throttle)
• Преобразовывать
• Буферизировать
• и так далее...
Сервис подсказок (RxJS)
/* Only get the value from each key up */var keyups =
Rx.Observable.fromEvent(input, 'keyup')
.select(function (e) {
return e.target.value;
})
.where(function (text) {
return text.length > 2;
});/* Now throttle/debounce the input for 500ms */
var throttled = keyups
.throttle(500 /* ms */);/* Now get only distinct values,
so we eliminate the arrows */
var distinct = keyups
.distinctUntilChanged();
Сервис подсказок - 2 (RxJS)
var suggestions = distinct
.select(function (text) {
return searchWikipedia(text);
})
.switchLatest()
.where(function (data) {
return data.length == 2 && data[1].length > 0;
});
Ещё проще!
(уменьшаем наши требования)
Данные + события
Данные которые меняются
Данные + событие
Observable
Observable на js-псевдокоде
function Observable () {
var value; // value
var subscribers; // [sub1, sub2, ...]
function notifySubscribers() {
subscibers.forEach(notify);
}
this.addSubscriber = function(subscriber) {
//...
subscribers.push(subscriber);
}
this.removeSubscriber = function(subscriber) {
// scan and remove subscriber
}
this.setValue = function(newValue) {
//...
if (!equal(value, newValue)) {
notifySubscribers();
}
}
this.getValue = function() {
//..
}
}
Knockout style API
observableExample = observable(); // create observable
observableExample(value); //set value
observableExample(); //get value
observableExample.subscribe(newValueHandler);
Подписчики или
зависимые observables
Подписчик - тот же observable, у
которого значение всегда
соответствует значению заданной
функции, аргументы которой другие
observable.
Computed
var x = observable(0);
var y = observable(0);
var r = computed(function() {
return Math.sqrt(x()*x() + y()*y());
});
Computed. Обратная операция
var r = computed({
read: readHandler,// previous
write: function(r) {
if (r >= 0) {
x(r*Math.cos(Math.PI/4));
y(r*Math.sin(Math.PI/4));
} else {
throw new Error(‘Не может быть отрицательным’);
}
}
});
Computed. Пример из жизни
var isFormValid = computed(function() {
return (login().length > 2) && (password().length > 5);
});
var canSend = computed(function() {
return !messageSent() && !loading() && isFormValid();
});
Observable коллекции – скажут
подписчикам, что изменился
набор её элементов (а не сами
элементы)
id1 id2 id2
user1 user2 user2
fullProfile1 fullProfile2 fullProfile3
id1 id2
user1 user2
fullProfile1 fullProfile3
В масштабах приложения
WebSockets Repository Workers
Observables
UI (data binding)
Возможные проблемы
• Иногда необходим computed.dispose()
• Throttle
• Производительность (много работы за
бортом)
Profit
• Декларативность
• Тестируемость
• Круто работает в связке с data binding
• Snapshots
Что посмотреть и почитать?
RxJS, Bacon.js;
Knockout (Knockup, Durandal);
obs (https://github.com/pluma/obs) + Rivets;
Прочитать SICP
http://awelonblue.wordpress.com/2012/07/01/why-not-
events/
http://elm-lang.org/
https://speakerdeck.com/search?q=frp

Weitere ähnliche Inhalte

Was ist angesagt?

О построении иерархического ролевого управления доступом (SibeCrypt 2012)
О построении иерархического ролевого управления доступом (SibeCrypt 2012)О построении иерархического ролевого управления доступом (SibeCrypt 2012)
О построении иерархического ролевого управления доступом (SibeCrypt 2012)Denis Kolegov
 
Процессы и потоки. Планирование и взаимоблокировки
Процессы и потоки. Планирование и взаимоблокировкиПроцессы и потоки. Планирование и взаимоблокировки
Процессы и потоки. Планирование и взаимоблокировкиEvgeniy Mironov
 
Процессы и потоки
Процессы и потокиПроцессы и потоки
Процессы и потокиEvgeniy Mironov
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5Technopark
 
Java осень 2014 занятие 7
Java осень 2014 занятие 7Java осень 2014 занятие 7
Java осень 2014 занятие 7Technopark
 
Making Scalable JavaScript Application
Making Scalable JavaScript ApplicationMaking Scalable JavaScript Application
Making Scalable JavaScript ApplicationMikhail Davydov
 
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации..."Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...Yandex
 
Kvc, kvo
Kvc, kvoKvc, kvo
Kvc, kvoNoveo
 
Клиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталяхКлиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталяхKirill Zotin
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node jsAlex Tumanoff
 
Web весна 2012 лекция 9
Web весна 2012 лекция 9Web весна 2012 лекция 9
Web весна 2012 лекция 9Technopark
 
HTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft Ukraine
HTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft UkraineHTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft Ukraine
HTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft UkraineVolha Banadyseva
 

Was ist angesagt? (12)

О построении иерархического ролевого управления доступом (SibeCrypt 2012)
О построении иерархического ролевого управления доступом (SibeCrypt 2012)О построении иерархического ролевого управления доступом (SibeCrypt 2012)
О построении иерархического ролевого управления доступом (SibeCrypt 2012)
 
Процессы и потоки. Планирование и взаимоблокировки
Процессы и потоки. Планирование и взаимоблокировкиПроцессы и потоки. Планирование и взаимоблокировки
Процессы и потоки. Планирование и взаимоблокировки
 
Процессы и потоки
Процессы и потокиПроцессы и потоки
Процессы и потоки
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
Java осень 2014 занятие 7
Java осень 2014 занятие 7Java осень 2014 занятие 7
Java осень 2014 занятие 7
 
Making Scalable JavaScript Application
Making Scalable JavaScript ApplicationMaking Scalable JavaScript Application
Making Scalable JavaScript Application
 
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации..."Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
 
Kvc, kvo
Kvc, kvoKvc, kvo
Kvc, kvo
 
Клиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталяхКлиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталях
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node js
 
Web весна 2012 лекция 9
Web весна 2012 лекция 9Web весна 2012 лекция 9
Web весна 2012 лекция 9
 
HTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft Ukraine
HTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft UkraineHTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft Ukraine
HTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft Ukraine
 

Ähnlich wie Observable как атом приложения

High Load 2009 Dimaa Rus Ready
High Load 2009 Dimaa Rus ReadyHigh Load 2009 Dimaa Rus Ready
High Load 2009 Dimaa Rus ReadyHighLoad2009
 
LvivJS 2014 - Win-win c React.js
LvivJS 2014 - Win-win c React.jsLvivJS 2014 - Win-win c React.js
LvivJS 2014 - Win-win c React.jsMax Klymyshyn
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.Igor Shkulipa
 
Reactive Extensions
Reactive ExtensionsReactive Extensions
Reactive ExtensionsGetDev.NET
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...solit
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Yandex
 
Subprograms in VHDL, Procedures in VHDL
Subprograms in VHDL, Procedures in VHDLSubprograms in VHDL, Procedures in VHDL
Subprograms in VHDL, Procedures in VHDLvitaliykulanov
 
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыТехнологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыPositive Development User Group
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияRuslan Shevchenko
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о BoostSergey Platonov
 
Web internship java script
Web internship   java scriptWeb internship   java script
Web internship java scriptNoveo
 

Ähnlich wie Observable как атом приложения (20)

High Load 2009 Dimaa Rus Ready
High Load 2009 Dimaa Rus ReadyHigh Load 2009 Dimaa Rus Ready
High Load 2009 Dimaa Rus Ready
 
LvivJS 2014 - Win-win c React.js
LvivJS 2014 - Win-win c React.jsLvivJS 2014 - Win-win c React.js
LvivJS 2014 - Win-win c React.js
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
 
Apache spark
Apache sparkApache spark
Apache spark
 
Reactive Extensions
Reactive ExtensionsReactive Extensions
Reactive Extensions
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
 
Aspect Oriented Approach
Aspect Oriented ApproachAspect Oriented Approach
Aspect Oriented Approach
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"
 
Расширение библиотеки Slick
Расширение библиотеки SlickРасширение библиотеки Slick
Расширение библиотеки Slick
 
C sharp deep dive
C sharp deep diveC sharp deep dive
C sharp deep dive
 
C# Deep Dive
C# Deep DiveC# Deep Dive
C# Deep Dive
 
Agile Instrumentation
Agile InstrumentationAgile Instrumentation
Agile Instrumentation
 
Subprograms in VHDL, Procedures in VHDL
Subprograms in VHDL, Procedures in VHDLSubprograms in VHDL, Procedures in VHDL
Subprograms in VHDL, Procedures in VHDL
 
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыТехнологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестирования
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Async
AsyncAsync
Async
 
Luxoft async.net
Luxoft async.netLuxoft async.net
Luxoft async.net
 
Web internship java script
Web internship   java scriptWeb internship   java script
Web internship java script
 

Observable как атом приложения