SlideShare ist ein Scribd-Unternehmen logo
1 von 30
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

Weitere ähnliche Inhalte

Was ist angesagt?

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 под свои нужды с использованием Pythonautomated-testing.info
 
Robot Framework: универсальный инструмент автоматизатора
Robot Framework: универсальный инструмент автоматизатораRobot Framework: универсальный инструмент автоматизатора
Robot Framework: универсальный инструмент автоматизатораSQALab
 

Was ist angesagt? (7)

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

Andere mochten auch

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.asyncFalko 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 javascriptFDConf
 
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScriptТрансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScriptMax 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 - Трансдюсеры и PythonMax 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 applicationsFalko Riemenschneider
 

Andere mochten auch (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
 
Clojure #1
Clojure #1Clojure #1
Clojure #1
 
Функциональное программирование в браузере / Никита Прокопов
Функциональное программирование в браузере / Никита ПрокоповФункциональное программирование в браузере / Никита Прокопов
Функциональное программирование в браузере / Никита Прокопов
 
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
 
Построение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascriptПостроение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascript
 
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScriptТрансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
 
Назад в будущее! …и другие мысли о подготовке программистов в ВУЗах
Назад в будущее! …и другие мысли о подготовке программистов в ВУЗахНазад в будущее! …и другие мысли о подготовке программистов в ВУЗах
Назад в будущее! …и другие мысли о подготовке программистов в ВУЗах
 
2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'е
2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'е2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'е
2014.12.06 05 Антон Плешивцев — Разбираем естественные языки на Lisp'е
 
JavaScript завтра / Сергей Рубанов (Exante Limited)
JavaScript завтра / Сергей Рубанов  (Exante Limited)JavaScript завтра / Сергей Рубанов  (Exante Limited)
JavaScript завтра / Сергей Рубанов (Exante Limited)
 
JSLab. Максим Климишин. "Трансдюсеры, CSP каналы, неизменяемые структуры данных"
JSLab. Максим Климишин. "Трансдюсеры, CSP каналы, неизменяемые структуры данных"JSLab. Максим Климишин. "Трансдюсеры, CSP каналы, неизменяемые структуры данных"
JSLab. Максим Климишин. "Трансдюсеры, CSP каналы, неизменяемые структуры данных"
 
Александр Жарков — Эволюция команды разработки: взгляд изнутри
Александр Жарков — Эволюция команды разработки: взгляд изнутриАлександр Жарков — Эволюция команды разработки: взгляд изнутри
Александр Жарков — Эволюция команды разработки: взгляд изнутри
 
PiterPy 2015 - Трансдюсеры и Python
PiterPy 2015 - Трансдюсеры и PythonPiterPy 2015 - Трансдюсеры и Python
PiterPy 2015 - Трансдюсеры и Python
 
Валкин, Мокевнин — Развитие IT-среды в Ульяновске
Валкин, Мокевнин — Развитие IT-среды в УльяновскеВалкин, Мокевнин — Развитие IT-среды в Ульяновске
Валкин, Мокевнин — Развитие IT-среды в Ульяновске
 
Транзакционная память (on Russian)
Транзакционная память (on Russian)Транзакционная память (on Russian)
Транзакционная память (on Russian)
 
Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»
 
ClojureScript Introduction
ClojureScript IntroductionClojureScript Introduction
ClojureScript Introduction
 
Clojure+ClojureScript Webapps
Clojure+ClojureScript WebappsClojure+ClojureScript Webapps
Clojure+ClojureScript Webapps
 
Some basic FP concepts
Some basic FP conceptsSome basic FP concepts
Some basic FP concepts
 
Clojure - Why does it matter?
Clojure - Why does it matter?Clojure - Why does it matter?
Clojure - Why does it matter?
 
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
 

Ähnlich wie FlatGUI: Reactive GUI Toolkit Implemented in Clojure

разработка бизнес приложений (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 #7Alexander 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 #devrusAlex Chistyakov
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaAlex Chistyakov
 
SOLID Principles in the real world
SOLID Principles in the real worldSOLID Principles in the real world
SOLID Principles in the real worldEPAM
 
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++ 2013Alex Chistyakov
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Serguei Gitinsky
 
Собеседование на позицию Java Developer
Собеседование на позицию Java DeveloperСобеседование на позицию Java Developer
Собеседование на позицию Java DeveloperOlexandra Dmytrenko
 
Ключевые навыки успешной Agile-команды / Дмитрий Лобасев (lobasev.ru)
Ключевые навыки успешной Agile-команды / Дмитрий Лобасев (lobasev.ru)Ключевые навыки успешной Agile-команды / Дмитрий Лобасев (lobasev.ru)
Ключевые навыки успешной Agile-команды / Дмитрий Лобасев (lobasev.ru)Ontico
 

Ähnlich wie FlatGUI: Reactive GUI Toolkit Implemented in Clojure (20)

разработка бизнес приложений (6)
разработка бизнес приложений (6)разработка бизнес приложений (6)
разработка бизнес приложений (6)
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...
 
BDD
BDDBDD
BDD
 
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
 
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
 
MagicPlot @ UXSPb @ IT Global Meetup #7
MagicPlot @ UXSPb @ IT Global Meetup #7MagicPlot @ UXSPb @ IT Global Meetup #7
MagicPlot @ UXSPb @ IT Global Meetup #7
 
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
 
Tdd php
Tdd phpTdd php
Tdd php
 
SPA инструменты
SPA инструментыSPA инструменты
SPA инструменты
 
Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей. Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей.
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrus
 
Gitlab devconf
Gitlab devconfGitlab devconf
Gitlab devconf
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на Java
 
2 bdw.key
2 bdw.key2 bdw.key
2 bdw.key
 
SOLID Principles in the real world
SOLID Principles in the real worldSOLID Principles in the real world
SOLID Principles in the real world
 
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
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013
 
Собеседование на позицию Java Developer
Собеседование на позицию Java DeveloperСобеседование на позицию Java Developer
Собеседование на позицию Java Developer
 
Sivko
SivkoSivko
Sivko
 
Ключевые навыки успешной Agile-команды / Дмитрий Лобасев (lobasev.ru)
Ключевые навыки успешной Agile-команды / Дмитрий Лобасев (lobasev.ru)Ключевые навыки успешной Agile-команды / Дмитрий Лобасев (lobasev.ru)
Ключевые навыки успешной Agile-команды / Дмитрий Лобасев (lobasev.ru)
 

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 – первое, чего не хватает, и что скоро появится • Оптимизации для сетевого варианта • Писать тесты и документацию • Доводить имеющиеся виджеты и делать новые • Пожелания приветствуются • Участие приветствуется