SlideShare a Scribd company logo
Reactive GUI Implemented in
Clojure
Denys Lebediev
Quick background
«Традиционный» подход
• Шаблон Event-Listener
• Модель данных виджета мутируема
– Example: isPressed/setPressed
• Состояние виджета мутируемо
– Example: isEnabled/setEnabled
Традиционный подход: проблемы
• Сложные GUI контейнеры (диалоги,
мастера, и т.д.) бывает трудно:
– Разрабатывать
– Поддерживать
– Расширять
• Почему?
Традиционный подход: проблемы
• Таким способом мы прячем логику
Традиционный подход: проблемы
• Таким способом мы прячем логику
– Пример: если кнопка стала неактивной, то
может быть неясно почему она так сделала, и
когда, при каких условиях с ней это происходит
Традиционный подход: проблемы
• Таким способом мы прячем логику
– Пример: если кнопка стала неактивной, то
может быть неясно почему она так сделала, и
когда, при каких условиях с ней это происходит
• А также, рассредоточиваем логику
Традиционный подход: проблемы
• Таким способом мы прячем логику
– Пример: если кнопка стала неактивной, то
может быть неясно почему она так сделала, и
когда, при каких условиях с ней это происходит
• А также, рассредоточиваем логику
– Причины произошедшего с кнопкой могут быть
разбросаны по разным местам исходного кода
приложения
Традиционный подход: проблемы
• Таким способом мы прячем логику
– Пример: если кнопка стала неактивной, то
может быть неясно почему она так сделала, и
когда, при каких условиях с ней это происходит
• А также, рассредоточиваем логику
– Причины произошедшего с кнопкой могут быть
разбросаны по разным местам исходного кода
приложения
– Тем более, со временем
Традиционный подход: проблемы
• Incidental complexity
– В результате мы пишем код, несущественный
для исходной задачи (домена)
– Тратим ресурсы на то чтобы решить когда
– А также, на то чтобы разобраться в решениях
коллег
• Трудности автоматизированного
тестирования
– На основе робота
Есть другой способ
• Библиотека берёт часть рутины на себя
– Однажды реализована и оттестирована
– Стремимся к тому, чтобы разработчик
концентрировался на своей задаче (домене)
Есть другой способ
• Библиотека берёт часть рутины на себя
– Однажды реализована и оттестирована
– Стремимся к тому, чтобы разработчик
концентрировался на своей задаче (домене)
• Вся логика одного свойства в одном месте
Есть другой способ
• Библиотека берёт часть рутины на себя
– Однажды реализована и оттестирована
– Стремимся к тому, чтобы разработчик
концентрировался на своей задаче (домене)
• Вся логика одного свойства в одном месте
• Обычные юнит-тесты для кода, который
управляет моделью и состоянием виджета
Hello world with FlatGUI
(defcomponent checkbox :say-hello {:text "Greeting"})
(def nogreeting-text "Greeting not provided")
(def greeting-text "Hello, world!")
(defevolverfn greeting-evolver :text
(if (get-property [:say-hello] :pressed)
greeting-text
nogreeting-text))
(defcomponent label :greeting-label
{:text nogreeting-text
:evolvers {:text greeting-evolver}})
Hello world with FlatGUI
(defcomponent checkbox :say-hello {:text "Greeting"})
(def nogreeting-text "Greeting not provided")
(def greeting-text "Hello, world!")
(defevolverfn greeting-evolver :text
(if (get-property [:say-hello] :pressed)
greeting-text
nogreeting-text))
(defcomponent label :greeting-label
{:text nogreeting-text
:evolvers {:text greeting-evolver}})
Hello world with FlatGUI
(defcomponent checkbox :say-hello {:text "Greeting"})
(def nogreeting-text "Greeting not provided")
(def greeting-text "Hello, world!")
(defevolverfn greeting-evolver :text
(if (get-property [:say-hello] :pressed)
greeting-text
nogreeting-text))
(defcomponent label :greeting-label
{:text nogreeting-text
:evolvers {:text greeting-evolver}})
Чем это отличается?
• greeting-evolver является единым место
для всей логики свойства :text лейбла
Чем это отличается?
• greeting-evolver является единым местом
для всей логики свойства :text лейбла
• Эта функция содержит логику, не рутину
Чем это отличается?
• greeting-evolver является единым место
для всей логики свойства :text лейбла
• Эта функция содержит логику, не рутину
• Эту функцию легко отлаживать
Чем это отличается?
• greeting-evolver является единым место
для всей логики свойства :text лейбла
• Эта функция содержит логику, не рутину
• Эту функцию легко отлаживать
• Эту функцию легко покрыть юнит-тестами
Чем это отличается?
• greeting-evolver является единым место
для всей логики свойства :text лейбла
• Эта функция содержит логику, не рутину
• Эту функцию легко отлаживать
• Эту функцию легко покрыть юнит-тестами
• Разработчику не нужно решать когда её вызвать
Чем это отличается?
• greeting-evolver является единым место
для всей логики свойства :text лейбла
• Эта функция содержит логику, не рутину
• Эту функцию легко отлаживать
• Эту функцию легко покрыть юнит-тестами
• Разработчику не нужно решать когда её вызвать
• Разработчику не нужно её вызывать
Чем это отличается?
• Реактивный движок берёт эти заботы на себя
– С каждым новым GUI контейнером, как бы ни
отличалась его предметная область, по сути мы
решаем одни и те же задачи
– Однажды реализованный движок прячет их под капот
– А также, покрывает тестами
FlatGUI architecture
Engine performs state transition
Option to run as RIA
Setup collaboration sessions
Опыт использования Clojure
• Макросы здесь очень кстати
– Создание типов и объектов виджетов, property
evolver -функций
– Layout management: “ниже” “справа” и т.п.
– Возможностей IDE ещё немного недостаточно
• Было много профилирования
– Появилось немного не-идиоматического
Clojure кода
Что дальше?
• Focus-management – первое, чего не
хватает, и что скоро появится
• Оптимизации для сетевого варианта
• Писать тесты и документацию
• Доводить имеющиеся виджеты и делать
новые
• Пожелания приветствуются
• Участие приветствуется
info@flatgui.org
Ad

More Related Content

What's hot (7)

ChatOps на практике. Организация работы команды сопровождения / Евгений Потап...
ChatOps на практике. Организация работы команды сопровождения / Евгений Потап...ChatOps на практике. Организация работы команды сопровождения / Евгений Потап...
ChatOps на практике. Организация работы команды сопровождения / Евгений Потап...
Ontico
 
Что такое проект по автоматизации тестирования ПО?
Что такое проект по автоматизации тестирования ПО?Что такое проект по автоматизации тестирования ПО?
Что такое проект по автоматизации тестирования ПО?
Mykhailo Poliarush
 
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
SECON
 
Что такое Robot Framework?
Что такое Robot Framework?Что такое Robot Framework?
Что такое Robot Framework?
Mykhailo Poliarush
 
Грязная автоматизация
Грязная автоматизацияГрязная автоматизация
Грязная автоматизация
SQALab
 
Быстрое расширение Robot Framework под свои нужды с использованием Python
Быстрое расширение Robot Framework под свои нужды с использованием PythonБыстрое расширение Robot Framework под свои нужды с использованием Python
Быстрое расширение Robot Framework под свои нужды с использованием Python
automated-testing.info
 
Robot Framework: универсальный инструмент автоматизатора
Robot Framework: универсальный инструмент автоматизатораRobot Framework: универсальный инструмент автоматизатора
Robot Framework: универсальный инструмент автоматизатора
SQALab
 
ChatOps на практике. Организация работы команды сопровождения / Евгений Потап...
ChatOps на практике. Организация работы команды сопровождения / Евгений Потап...ChatOps на практике. Организация работы команды сопровождения / Евгений Потап...
ChatOps на практике. Организация работы команды сопровождения / Евгений Потап...
Ontico
 
Что такое проект по автоматизации тестирования ПО?
Что такое проект по автоматизации тестирования ПО?Что такое проект по автоматизации тестирования ПО?
Что такое проект по автоматизации тестирования ПО?
Mykhailo Poliarush
 
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
SECON
 
Что такое Robot Framework?
Что такое Robot Framework?Что такое Robot Framework?
Что такое Robot Framework?
Mykhailo Poliarush
 
Грязная автоматизация
Грязная автоматизацияГрязная автоматизация
Грязная автоматизация
SQALab
 
Быстрое расширение Robot Framework под свои нужды с использованием Python
Быстрое расширение Robot Framework под свои нужды с использованием PythonБыстрое расширение Robot Framework под свои нужды с использованием Python
Быстрое расширение Robot Framework под свои нужды с использованием Python
automated-testing.info
 
Robot Framework: универсальный инструмент автоматизатора
Robot Framework: универсальный инструмент автоматизатораRobot Framework: универсальный инструмент автоматизатора
Robot Framework: универсальный инструмент автоматизатора
SQALab
 

Viewers also liked (20)

JavaFX GUI architecture with Clojure core.async
JavaFX GUI architecture with Clojure core.asyncJavaFX GUI architecture with Clojure core.async
JavaFX GUI architecture with Clojure core.async
Falko Riemenschneider
 
Clojure #1
Clojure #1Clojure #1
Clojure #1
Alexander Podkhalyuzin
 
Функциональное программирование в браузере / Никита Прокопов
Функциональное программирование в браузере / Никита ПрокоповФункциональное программирование в браузере / Никита Прокопов
Функциональное программирование в браузере / Никита Прокопов
Ontico
 
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
CodeFest
 
Построение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascriptПостроение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascript
FDConf
 
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScriptТрансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
Max Klymyshyn
 
Назад в будущее! …и другие мысли о подготовке программистов в ВУЗах
Назад в будущее! …и другие мысли о подготовке программистов в ВУЗахНазад в будущее! …и другие мысли о подготовке программистов в ВУЗах
Назад в будущее! …и другие мысли о подготовке программистов в ВУЗах
Dennis Schetinin
 
2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'е
2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'е2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'е
2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'е
HappyDev
 
JavaScript завтра / Сергей Рубанов (Exante Limited)
JavaScript завтра / Сергей Рубанов  (Exante Limited)JavaScript завтра / Сергей Рубанов  (Exante Limited)
JavaScript завтра / Сергей Рубанов (Exante Limited)
Ontico
 
JSLab. Максим Климишин. "Трансдюсеры, CSP каналы, неизменяемые структуры данных"
JSLab. Максим Климишин. "Трансдюсеры, CSP каналы, неизменяемые структуры данных"JSLab. Максим Климишин. "Трансдюсеры, CSP каналы, неизменяемые структуры данных"
JSLab. Максим Климишин. "Трансдюсеры, CSP каналы, неизменяемые структуры данных"
GeeksLab Odessa
 
Александр Жарков — Эволюция команды разработки: взгляд изнутри
Александр Жарков — Эволюция команды разработки: взгляд изнутриАлександр Жарков — Эволюция команды разработки: взгляд изнутри
Александр Жарков — Эволюция команды разработки: взгляд изнутри
Daria Oreshkina
 
PiterPy 2015 - Трансдюсеры и Python
PiterPy 2015 - Трансдюсеры и PythonPiterPy 2015 - Трансдюсеры и Python
PiterPy 2015 - Трансдюсеры и Python
Max Klymyshyn
 
Валкин, Мокевнин — Развитие IT-среды в Ульяновске
Валкин, Мокевнин — Развитие IT-среды в УльяновскеВалкин, Мокевнин — Развитие IT-среды в Ульяновске
Валкин, Мокевнин — Развитие IT-среды в Ульяновске
Daria Oreshkina
 
Транзакционная память (on Russian)
Транзакционная память (on Russian)Транзакционная память (on Russian)
Транзакционная память (on Russian)
JIghtuse
 
Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»
DevDay
 
ClojureScript Introduction
ClojureScript IntroductionClojureScript Introduction
ClojureScript Introduction
Falko Riemenschneider
 
Clojure+ClojureScript Webapps
Clojure+ClojureScript WebappsClojure+ClojureScript Webapps
Clojure+ClojureScript Webapps
Falko Riemenschneider
 
Some basic FP concepts
Some basic FP conceptsSome basic FP concepts
Some basic FP concepts
Falko Riemenschneider
 
Clojure - Why does it matter?
Clojure - Why does it matter?Clojure - Why does it matter?
Clojure - Why does it matter?
Falko Riemenschneider
 
Making design decisions in React-based ClojureScript web applications
Making design decisions in React-based ClojureScript web applicationsMaking design decisions in React-based ClojureScript web applications
Making design decisions in React-based ClojureScript web applications
Falko Riemenschneider
 
JavaFX GUI architecture with Clojure core.async
JavaFX GUI architecture with Clojure core.asyncJavaFX GUI architecture with Clojure core.async
JavaFX GUI architecture with Clojure core.async
Falko Riemenschneider
 
Функциональное программирование в браузере / Никита Прокопов
Функциональное программирование в браузере / Никита ПрокоповФункциональное программирование в браузере / Никита Прокопов
Функциональное программирование в браузере / Никита Прокопов
Ontico
 
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
CodeFest
 
Построение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascriptПостроение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascript
FDConf
 
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScriptТрансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
Max Klymyshyn
 
Назад в будущее! …и другие мысли о подготовке программистов в ВУЗах
Назад в будущее! …и другие мысли о подготовке программистов в ВУЗахНазад в будущее! …и другие мысли о подготовке программистов в ВУЗах
Назад в будущее! …и другие мысли о подготовке программистов в ВУЗах
Dennis Schetinin
 
2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'е
2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'е2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'е
2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'е
HappyDev
 
JavaScript завтра / Сергей Рубанов (Exante Limited)
JavaScript завтра / Сергей Рубанов  (Exante Limited)JavaScript завтра / Сергей Рубанов  (Exante Limited)
JavaScript завтра / Сергей Рубанов (Exante Limited)
Ontico
 
JSLab. Максим Климишин. "Трансдюсеры, CSP каналы, неизменяемые структуры данных"
JSLab. Максим Климишин. "Трансдюсеры, CSP каналы, неизменяемые структуры данных"JSLab. Максим Климишин. "Трансдюсеры, CSP каналы, неизменяемые структуры данных"
JSLab. Максим Климишин. "Трансдюсеры, CSP каналы, неизменяемые структуры данных"
GeeksLab Odessa
 
Александр Жарков — Эволюция команды разработки: взгляд изнутри
Александр Жарков — Эволюция команды разработки: взгляд изнутриАлександр Жарков — Эволюция команды разработки: взгляд изнутри
Александр Жарков — Эволюция команды разработки: взгляд изнутри
Daria Oreshkina
 
PiterPy 2015 - Трансдюсеры и Python
PiterPy 2015 - Трансдюсеры и PythonPiterPy 2015 - Трансдюсеры и Python
PiterPy 2015 - Трансдюсеры и Python
Max Klymyshyn
 
Валкин, Мокевнин — Развитие IT-среды в Ульяновске
Валкин, Мокевнин — Развитие IT-среды в УльяновскеВалкин, Мокевнин — Развитие IT-среды в Ульяновске
Валкин, Мокевнин — Развитие IT-среды в Ульяновске
Daria Oreshkina
 
Транзакционная память (on Russian)
Транзакционная память (on Russian)Транзакционная память (on Russian)
Транзакционная память (on Russian)
JIghtuse
 
Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»
DevDay
 
Making design decisions in React-based ClojureScript web applications
Making design decisions in React-based ClojureScript web applicationsMaking design decisions in React-based ClojureScript web applications
Making design decisions in React-based ClojureScript web applications
Falko Riemenschneider
 
Ad

Similar to FlatGUI: Reactive GUI Toolkit Implemented in Clojure (20)

разработка бизнес приложений (6)
разработка бизнес приложений (6)разработка бизнес приложений (6)
разработка бизнес приложений (6)
Alexander Gornik
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...
pgdayrussia
 
BDD
BDDBDD
BDD
Andrey Bibichev
 
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
IT-Portfolio
 
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Oleg Tsarev
 
MagicPlot @ UXSPb @ IT Global Meetup #7
MagicPlot @ UXSPb @ IT Global Meetup #7MagicPlot @ UXSPb @ IT Global Meetup #7
MagicPlot @ UXSPb @ IT Global Meetup #7
Alexander Levantovsky
 
Methods for building dialog agents and the technologies we used
Methods for building dialog agents and the technologies we used Methods for building dialog agents and the technologies we used
Methods for building dialog agents and the technologies we used
Grid Dynamics
 
SPA инструменты
SPA инструментыSPA инструменты
SPA инструменты
Roman Dvornov
 
Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей. Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей.
Levon Avakyan
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrus
Alex Chistyakov
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на Java
Alex Chistyakov
 
2 bdw.key
2 bdw.key2 bdw.key
2 bdw.key
antishmanti
 
SOLID Principles in the real world
SOLID Principles in the real worldSOLID Principles in the real world
SOLID Principles in the real world
EPAM
 
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
Alex Chistyakov
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013
Serguei Gitinsky
 
Собеседование на позицию Java Developer
Собеседование на позицию Java DeveloperСобеседование на позицию Java Developer
Собеседование на позицию Java Developer
Olexandra Dmytrenko
 
Ключевые навыки успешной Agile-команды / Дмитрий Лобасев (lobasev.ru)
Ключевые навыки успешной Agile-команды / Дмитрий Лобасев (lobasev.ru)Ключевые навыки успешной Agile-команды / Дмитрий Лобасев (lobasev.ru)
Ключевые навыки успешной Agile-команды / Дмитрий Лобасев (lobasev.ru)
Ontico
 
разработка бизнес приложений (6)
разработка бизнес приложений (6)разработка бизнес приложений (6)
разработка бизнес приложений (6)
Alexander Gornik
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...
pgdayrussia
 
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
IT-Portfolio
 
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Oleg Tsarev
 
MagicPlot @ UXSPb @ IT Global Meetup #7
MagicPlot @ UXSPb @ IT Global Meetup #7MagicPlot @ UXSPb @ IT Global Meetup #7
MagicPlot @ UXSPb @ IT Global Meetup #7
Alexander Levantovsky
 
Methods for building dialog agents and the technologies we used
Methods for building dialog agents and the technologies we used Methods for building dialog agents and the technologies we used
Methods for building dialog agents and the technologies we used
Grid Dynamics
 
SPA инструменты
SPA инструментыSPA инструменты
SPA инструменты
Roman Dvornov
 
Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей. Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей.
Levon Avakyan
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrus
Alex Chistyakov
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на Java
Alex Chistyakov
 
SOLID Principles in the real world
SOLID Principles in the real worldSOLID Principles in the real world
SOLID Principles in the real world
EPAM
 
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
Alex Chistyakov
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013
Serguei Gitinsky
 
Собеседование на позицию Java Developer
Собеседование на позицию Java DeveloperСобеседование на позицию Java Developer
Собеседование на позицию Java Developer
Olexandra Dmytrenko
 
Ключевые навыки успешной Agile-команды / Дмитрий Лобасев (lobasev.ru)
Ключевые навыки успешной Agile-команды / Дмитрий Лобасев (lobasev.ru)Ключевые навыки успешной Agile-команды / Дмитрий Лобасев (lobasev.ru)
Ключевые навыки успешной Agile-команды / Дмитрий Лобасев (lobasev.ru)
Ontico
 
Ad

FlatGUI: Reactive GUI Toolkit Implemented in Clojure

  • 1. Reactive GUI Implemented in Clojure Denys Lebediev
  • 3. «Традиционный» подход • Шаблон Event-Listener • Модель данных виджета мутируема – Example: isPressed/setPressed • Состояние виджета мутируемо – Example: isEnabled/setEnabled
  • 4. Традиционный подход: проблемы • Сложные GUI контейнеры (диалоги, мастера, и т.д.) бывает трудно: – Разрабатывать – Поддерживать – Расширять • Почему?
  • 5. Традиционный подход: проблемы • Таким способом мы прячем логику
  • 6. Традиционный подход: проблемы • Таким способом мы прячем логику – Пример: если кнопка стала неактивной, то может быть неясно почему она так сделала, и когда, при каких условиях с ней это происходит
  • 7. Традиционный подход: проблемы • Таким способом мы прячем логику – Пример: если кнопка стала неактивной, то может быть неясно почему она так сделала, и когда, при каких условиях с ней это происходит • А также, рассредоточиваем логику
  • 8. Традиционный подход: проблемы • Таким способом мы прячем логику – Пример: если кнопка стала неактивной, то может быть неясно почему она так сделала, и когда, при каких условиях с ней это происходит • А также, рассредоточиваем логику – Причины произошедшего с кнопкой могут быть разбросаны по разным местам исходного кода приложения
  • 9. Традиционный подход: проблемы • Таким способом мы прячем логику – Пример: если кнопка стала неактивной, то может быть неясно почему она так сделала, и когда, при каких условиях с ней это происходит • А также, рассредоточиваем логику – Причины произошедшего с кнопкой могут быть разбросаны по разным местам исходного кода приложения – Тем более, со временем
  • 10. Традиционный подход: проблемы • Incidental complexity – В результате мы пишем код, несущественный для исходной задачи (домена) – Тратим ресурсы на то чтобы решить когда – А также, на то чтобы разобраться в решениях коллег • Трудности автоматизированного тестирования – На основе робота
  • 11. Есть другой способ • Библиотека берёт часть рутины на себя – Однажды реализована и оттестирована – Стремимся к тому, чтобы разработчик концентрировался на своей задаче (домене)
  • 12. Есть другой способ • Библиотека берёт часть рутины на себя – Однажды реализована и оттестирована – Стремимся к тому, чтобы разработчик концентрировался на своей задаче (домене) • Вся логика одного свойства в одном месте
  • 13. Есть другой способ • Библиотека берёт часть рутины на себя – Однажды реализована и оттестирована – Стремимся к тому, чтобы разработчик концентрировался на своей задаче (домене) • Вся логика одного свойства в одном месте • Обычные юнит-тесты для кода, который управляет моделью и состоянием виджета
  • 14. Hello world with FlatGUI (defcomponent checkbox :say-hello {:text "Greeting"}) (def nogreeting-text "Greeting not provided") (def greeting-text "Hello, world!") (defevolverfn greeting-evolver :text (if (get-property [:say-hello] :pressed) greeting-text nogreeting-text)) (defcomponent label :greeting-label {:text nogreeting-text :evolvers {:text greeting-evolver}})
  • 15. Hello world with FlatGUI (defcomponent checkbox :say-hello {:text "Greeting"}) (def nogreeting-text "Greeting not provided") (def greeting-text "Hello, world!") (defevolverfn greeting-evolver :text (if (get-property [:say-hello] :pressed) greeting-text nogreeting-text)) (defcomponent label :greeting-label {:text nogreeting-text :evolvers {:text greeting-evolver}})
  • 16. Hello world with FlatGUI (defcomponent checkbox :say-hello {:text "Greeting"}) (def nogreeting-text "Greeting not provided") (def greeting-text "Hello, world!") (defevolverfn greeting-evolver :text (if (get-property [:say-hello] :pressed) greeting-text nogreeting-text)) (defcomponent label :greeting-label {:text nogreeting-text :evolvers {:text greeting-evolver}})
  • 17. Чем это отличается? • greeting-evolver является единым место для всей логики свойства :text лейбла
  • 18. Чем это отличается? • greeting-evolver является единым местом для всей логики свойства :text лейбла • Эта функция содержит логику, не рутину
  • 19. Чем это отличается? • greeting-evolver является единым место для всей логики свойства :text лейбла • Эта функция содержит логику, не рутину • Эту функцию легко отлаживать
  • 20. Чем это отличается? • greeting-evolver является единым место для всей логики свойства :text лейбла • Эта функция содержит логику, не рутину • Эту функцию легко отлаживать • Эту функцию легко покрыть юнит-тестами
  • 21. Чем это отличается? • greeting-evolver является единым место для всей логики свойства :text лейбла • Эта функция содержит логику, не рутину • Эту функцию легко отлаживать • Эту функцию легко покрыть юнит-тестами • Разработчику не нужно решать когда её вызвать
  • 22. Чем это отличается? • greeting-evolver является единым место для всей логики свойства :text лейбла • Эта функция содержит логику, не рутину • Эту функцию легко отлаживать • Эту функцию легко покрыть юнит-тестами • Разработчику не нужно решать когда её вызвать • Разработчику не нужно её вызывать
  • 23. Чем это отличается? • Реактивный движок берёт эти заботы на себя – С каждым новым GUI контейнером, как бы ни отличалась его предметная область, по сути мы решаем одни и те же задачи – Однажды реализованный движок прячет их под капот – А также, покрывает тестами
  • 25. Engine performs state transition
  • 26. Option to run as RIA
  • 28. Опыт использования Clojure • Макросы здесь очень кстати – Создание типов и объектов виджетов, property evolver -функций – Layout management: “ниже” “справа” и т.п. – Возможностей IDE ещё немного недостаточно • Было много профилирования – Появилось немного не-идиоматического Clojure кода
  • 29. Что дальше? • Focus-management – первое, чего не хватает, и что скоро появится • Оптимизации для сетевого варианта • Писать тесты и документацию • Доводить имеющиеся виджеты и делать новые • Пожелания приветствуются • Участие приветствуется