SlideShare a Scribd company logo
1 of 3
Download to read offline
Тезисы доклада
"Декларативное программирование клиент-серверных приложений на
андроид"
Практически сразу после написания первой программы возникла проблема
повышения производительности труда программистов. Отметим, что сейчас, как и ранее,
нет общепринятого определения термина “производительность труда программиста”.
Несмотря на предпринятые за прошедшее время большие усилия и полученные
значительные результаты в повышении производительности труда, эта проблема и сейчас
является актуальной. Возможно даже в большей степени чем ранее.
Для решения указанной проблемы применяют разнообразные способы и методы.
Основными из них являются организационно-социальные методы, использование
разнообразных библиотек, паттернов, шаблонов. Перспективным является применение
декларативных языков программирования. К сожалению существующие декларативные
языки ориентированы на ту или иную предметную область.
Сотрудниками компании “Брендер” (г. Харьков) разработана библиотека
реализующая принципы декларативного программирования при разработке клиент -
серверных приложений на андроиде. Несмотря на то, что библиотека реализована для
андроида, на заложенных в ней принципах можно разработать библиотеки и для других
платформ.
С использованием предлагаемой библиотеки, в соответствии с принципами
декларативного программирования, мы описываем лишь ЧТО нужно, а не КАК это сделать.
Библиотека существенно уменьшает количество java кода. Файлы ресурсов используются
традиционные.
Основой системы являются экраны. Они могут быть типа активити и типа фрагмент.
В системе они объявляются просто:
activity(MAIN, R.layout.activity_main)
и
fragment(SERVICE, R.layout.fragment_service)
соответственно.
Здесь MAIN и SERVICE – имена экранов (строковые переменные).
Каждый экран содержит несколько компонентов (не менее одного). Компонент это
составная часть экрана, которая характеризуется способом обработки и отображения
данных. В компонентах реализует шаблон MVP. Компоненты также задаются достаточно
просто, например:
.component(​TC​.​RECYCLER​,
model(API.​CATEGORIES​),
view(R.id.​recycler​, R.layout.​item_home​),
navigator(start(​0​, ​CATEGORY​)));
Здесь RECYCLER – тип компонента, который определяет способ обработки и
представления данных. Имеются различные типы, например: PAGER_F, MAP, SPINNER и
другие. По их названиям понятно как отображаются компоненты.
В компоненте модель задается параметром model(API.CATEGORIES) – указывает
источник данных, параметр API.CATEGORIES – строка с адресом.
Вид задается параметром view(R.id.recycler, R.layout.item_home) . Его параметры, в
свою очередь, задают id ресайклера и id соответствующего item лайоута.
Параметр navigator описывает реакцию на действия пользователя. В нашем случае
указывает, что при клике на itemView будет вызван экран CATEGORY
Это общее описание для понимания сущности работы с библиотекой. В реале
существует большое число типов компонентов и не только прямых аналогов андроидных
виджетов и элементов.
Для некоторых компонентов имеется упрощенная нотация, например:
componentMap, componentYoutube и пр.
Модель также имеет различные модификации, например, можно задавать методы:
GET, POST, GET_DB, POST_DB, UPDATE_DB и др. В моделе можно указывать параметры
для запросов, последействия (для запросов с методами POST) и другие параметры.
Представление также имеет несколько модификаций задания параметров view.
И, естественно, имеется большой набор действий для навигатора.
Рассмотрим как выглядит код для пары экранов, изображенных на рисунке. Третий
рисунок это второй экран с прокруткой. Это экраны реального коммерческого приложения
Склад Техника (есть на маркете).
В основном код экранов контекстно понятен. Поэтому буду его комментировать
минимально.
Как видим все экраны имеют внизу единое для всех навигационное меню. Поэтому
приложение реализовано по схеме main активити в котором есть контейнер для фрагментов
и меню.
Его код следующий:
activity(​MAIN​, R.layout.​activity_main​)
.fragmentsContainer(R.id.​content_frame​)
.menuBottom(R.id.​nav​, ​HOME​, ​REPAIRS_MAIN​, ​ABOUT​, ​NEWS​);
Компонент menuBottom задает id соответствующего RadioGroup и перечень названий
экранов, которые показываются при клике на соответствующие пункты.
Экран 1 Экран 2 Экран 2 (продолжение)
Первый экран отображает продукцию категории "Інше". Код для его реализации
следующий:
fragment(​CATEGORY​, R.layout.​fragment_category​).animate(​AS​.​RL​)
.navigator(back(R.id.​back​))
.component(​TC​.​RECYCLER​,
model(API.​PRODUCTS​, ​"categoryId"​),
view(R.id.​recycler​, R.layout.​item_category​),
navigator(start(​0​, ​PRODUCT​)));
Данные (​model​) берутся по адресу API.PRODUCTS с параметром categoryId. При
клике на товар вызывается экран PRODUCT. При этом устанавливаются значения всех
необходимых параметров.
Код реализации экрана PRODUCT следующий:
fragment(​PRODUCT​, R.layout.​fragment_product​).animate(​AS​.​RL​)
.navigator(back(R.id.​back​),
handler(R.id.​apply​, ​ITEM_FORM​, ​PS​.​RECORD_COMPONENT​, R.id.​panel​))
.component(​TC​.​PANEL​,
model(API.​DETAIL​, ​"productId"​),
view(R.id.​panel​)
.visibilityManager(​visibility​(R.id.​video​, ​"videoLink"​),
​visibility​(R.id.​charact​, ​"description.characteristics"​)),
navigator(start(R.id.​video​, ​YOUTUBE​)));
Здесь handler(R.id.apply, ITEM_FORM,… указывает, что при клике на кнопку
"Залишити замовлення" (R.id.apply) необходимо вызвать экран ITEM_FORM.
visibilityManager описывает условия видимости отдельных элементов в зависимости
от значений данных. В частности, если поле videoLink пустое, то не будет показываться
кнопка "переглянути видео". А поле description.characteristics управляет видимостью
группы элементов "Загальні характеристики".
Как видим, количество кода для реализации экранов небольшое и этот код
достаточно простой и интуитивно понятный.
При разработке реального коммерческого приложения "крон авто" (есть на маркете)
параллельно велась разработка по традиционной технологии и разработка с
использованием библиотеки декларативного программирования. Это позволило сделать
следующие выводы:
● Количество кода с использованием библиотеки в 50-60 раз меньше чем при
традиционном подходе.
● Время на разработку java кода в 20 - 25 раз меньше.
● Время на тестирование в 7-10 раз меньше (за счет меньшего количества багов).
● Исправление каждого из багов в 20 - 25 раз меньше.

More Related Content

Similar to Декларативное программирование клиент-серверных приложений на андроид - UA Mobile 2019

Google I/O 2016 для разработчиков
Google I/O 2016 для разработчиковGoogle I/O 2016 для разработчиков
Google I/O 2016 для разработчиковWOX APP
 
Семинар 24-25 апреля 2014 г. «R + TABLEAU. ПРОГНОЗИRОВАНИЕ И BIG DATA АНАЛИЗ»
Семинар 24-25 апреля 2014 г.  «R + TABLEAU. ПРОГНОЗИRОВАНИЕ И BIG DATA АНАЛИЗ»Семинар 24-25 апреля 2014 г.  «R + TABLEAU. ПРОГНОЗИRОВАНИЕ И BIG DATA АНАЛИЗ»
Семинар 24-25 апреля 2014 г. «R + TABLEAU. ПРОГНОЗИRОВАНИЕ И BIG DATA АНАЛИЗ»АНАЛИТИКА ПЛЮС
 
Внедрение CASE-технологий
Внедрение CASE-технологийВнедрение CASE-технологий
Внедрение CASE-технологийОтшельник
 
Проектирование интернет-сайтов и систем в Redsoft
Проектирование интернет-сайтов и систем в RedsoftПроектирование интернет-сайтов и систем в Redsoft
Проектирование интернет-сайтов и систем в RedsoftRedsoft
 
Расчетная работа №2
Расчетная работа №2Расчетная работа №2
Расчетная работа №2_SS22_
 
расчетная работа (усынин в.а. пос 10в)
расчетная работа (усынин в.а. пос 10в)расчетная работа (усынин в.а. пос 10в)
расчетная работа (усынин в.а. пос 10в)Vlad_doc
 
Статья «Формирование универсальных требований к пользовательским программам п...
Статья «Формирование универсальных требований к пользовательским программам п...Статья «Формирование универсальных требований к пользовательским программам п...
Статья «Формирование универсальных требований к пользовательским программам п...ph.d. Dmitry Stepanov
 
C# Web. Занятие 11.
C# Web. Занятие 11.C# Web. Занятие 11.
C# Web. Занятие 11.Igor Shkulipa
 
Dreamwever cs3
Dreamwever cs3Dreamwever cs3
Dreamwever cs3JIuc
 
1С-Битрикс: Управление сайтом Версия .NET
1С-Битрикс: Управление сайтом Версия .NET1С-Битрикс: Управление сайтом Версия .NET
1С-Битрикс: Управление сайтом Версия .NETMedia Gorod
 
Параметрическое моделирование городского озеленения
Параметрическое моделирование городского озелененияПараметрическое моделирование городского озеленения
Параметрическое моделирование городского озелененияIoT Community
 
Android Development Course in HSE lecture #1
Android Development Course in HSE lecture #1Android Development Course in HSE lecture #1
Android Development Course in HSE lecture #1Empatika
 
Расчетная работа по дисциплине МАПО (Кондратюк Т.А.)
Расчетная работа по дисциплине МАПО (Кондратюк Т.А.)Расчетная работа по дисциплине МАПО (Кондратюк Т.А.)
Расчетная работа по дисциплине МАПО (Кондратюк Т.А.)Lita Ford
 
Что нового в Android 5.0
Что нового в Android 5.0Что нового в Android 5.0
Что нового в Android 5.0Kirill Danilov
 

Similar to Декларативное программирование клиент-серверных приложений на андроид - UA Mobile 2019 (20)

Google I/O 2016 для разработчиков
Google I/O 2016 для разработчиковGoogle I/O 2016 для разработчиков
Google I/O 2016 для разработчиков
 
Семинар 24-25 апреля 2014 г. «R + TABLEAU. ПРОГНОЗИRОВАНИЕ И BIG DATA АНАЛИЗ»
Семинар 24-25 апреля 2014 г.  «R + TABLEAU. ПРОГНОЗИRОВАНИЕ И BIG DATA АНАЛИЗ»Семинар 24-25 апреля 2014 г.  «R + TABLEAU. ПРОГНОЗИRОВАНИЕ И BIG DATA АНАЛИЗ»
Семинар 24-25 апреля 2014 г. «R + TABLEAU. ПРОГНОЗИRОВАНИЕ И BIG DATA АНАЛИЗ»
 
Внедрение CASE-технологий
Внедрение CASE-технологийВнедрение CASE-технологий
Внедрение CASE-технологий
 
Проектирование интернет-сайтов и систем в Redsoft
Проектирование интернет-сайтов и систем в RedsoftПроектирование интернет-сайтов и систем в Redsoft
Проектирование интернет-сайтов и систем в Redsoft
 
Lecture 11 1
Lecture 11 1Lecture 11 1
Lecture 11 1
 
Lecture 11 1
Lecture 11 1Lecture 11 1
Lecture 11 1
 
Расчетная работа №2
Расчетная работа №2Расчетная работа №2
Расчетная работа №2
 
расчетная работа (усынин в.а. пос 10в)
расчетная работа (усынин в.а. пос 10в)расчетная работа (усынин в.а. пос 10в)
расчетная работа (усынин в.а. пос 10в)
 
Статья «Формирование универсальных требований к пользовательским программам п...
Статья «Формирование универсальных требований к пользовательским программам п...Статья «Формирование универсальных требований к пользовательским программам п...
Статья «Формирование универсальных требований к пользовательским программам п...
 
C# Web. Занятие 11.
C# Web. Занятие 11.C# Web. Занятие 11.
C# Web. Занятие 11.
 
лек11 2
лек11 2лек11 2
лек11 2
 
Dreamwever cs3
Dreamwever cs3Dreamwever cs3
Dreamwever cs3
 
лек11 1
лек11 1лек11 1
лек11 1
 
1С-Битрикс: Управление сайтом Версия .NET
1С-Битрикс: Управление сайтом Версия .NET1С-Битрикс: Управление сайтом Версия .NET
1С-Битрикс: Управление сайтом Версия .NET
 
Параметрическое моделирование городского озеленения
Параметрическое моделирование городского озелененияПараметрическое моделирование городского озеленения
Параметрическое моделирование городского озеленения
 
Android Development Course in HSE lecture #1
Android Development Course in HSE lecture #1Android Development Course in HSE lecture #1
Android Development Course in HSE lecture #1
 
Расчетная работа по дисциплине МАПО (Кондратюк Т.А.)
Расчетная работа по дисциплине МАПО (Кондратюк Т.А.)Расчетная работа по дисциплине МАПО (Кондратюк Т.А.)
Расчетная работа по дисциплине МАПО (Кондратюк Т.А.)
 
B pwin&ramus
B pwin&ramusB pwin&ramus
B pwin&ramus
 
Что нового в Android 5.0
Что нового в Android 5.0Что нового в Android 5.0
Что нового в Android 5.0
 
лек13 6
лек13 6лек13 6
лек13 6
 

More from UA Mobile

Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...UA Mobile
 
Leave your Room behind - UA Mobile 2019
Leave your Room behind - UA Mobile 2019Leave your Room behind - UA Mobile 2019
Leave your Room behind - UA Mobile 2019UA Mobile
 
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019UA Mobile
 
Google Wear OS watch faces and applications development - UA Mobile 2019
Google Wear OS watch faces and applications development - UA Mobile 2019Google Wear OS watch faces and applications development - UA Mobile 2019
Google Wear OS watch faces and applications development - UA Mobile 2019UA Mobile
 
Історія декількох проектів та що в них пішло не так - UA Mobile 2019
Історія декількох проектів та що в них пішло не так - UA Mobile 2019Історія декількох проектів та що в них пішло не так - UA Mobile 2019
Історія декількох проектів та що в них пішло не так - UA Mobile 2019UA Mobile
 
Working effectively with ViewModels and TDD - UA Mobile 2019
Working effectively with ViewModels and TDD - UA Mobile 2019Working effectively with ViewModels and TDD - UA Mobile 2019
Working effectively with ViewModels and TDD - UA Mobile 2019UA Mobile
 
Managing State in Reactive applications - UA Mobile 2019
Managing State in Reactive applications - UA Mobile 2019Managing State in Reactive applications - UA Mobile 2019
Managing State in Reactive applications - UA Mobile 2019UA Mobile
 
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019UA Mobile
 
Актуальні практики дизайну мобільних додатків - UA Mobile 2019
Актуальні практики дизайну мобільних додатків - UA Mobile 2019Актуальні практики дизайну мобільних додатків - UA Mobile 2019
Актуальні практики дизайну мобільних додатків - UA Mobile 2019UA Mobile
 
До чого прикладати Docker в Android? - UA Mobile 2019
До чого прикладати Docker в Android? - UA Mobile 2019До чого прикладати Docker в Android? - UA Mobile 2019
До чого прикладати Docker в Android? - UA Mobile 2019UA Mobile
 
Building your Flutter apps using Redux - UA Mobile 2019
Building your Flutter apps using Redux - UA Mobile 2019Building your Flutter apps using Redux - UA Mobile 2019
Building your Flutter apps using Redux - UA Mobile 2019UA Mobile
 
Optional. Tips and Tricks - UA Mobile 2019
Optional. Tips and Tricks - UA Mobile 2019Optional. Tips and Tricks - UA Mobile 2019
Optional. Tips and Tricks - UA Mobile 2019UA Mobile
 
Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...UA Mobile
 
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019UA Mobile
 
Flutter: No more boring apps! - UA Mobile 2019
Flutter: No more boring apps! - UA Mobile 2019Flutter: No more boring apps! - UA Mobile 2019
Flutter: No more boring apps! - UA Mobile 2019UA Mobile
 
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019UA Mobile
 
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019UA Mobile
 
Sceneform SDK на практиці - UA Mobile 2019
Sceneform SDK на практиці - UA Mobile 2019Sceneform SDK на практиці - UA Mobile 2019
Sceneform SDK на практиці - UA Mobile 2019UA Mobile
 
Coroutines in Kotlin. UA Mobile 2017.
Coroutines in Kotlin. UA Mobile 2017.Coroutines in Kotlin. UA Mobile 2017.
Coroutines in Kotlin. UA Mobile 2017.UA Mobile
 
Augmented reality on Android. UA Mobile 2017.
Augmented reality on Android. UA Mobile 2017.Augmented reality on Android. UA Mobile 2017.
Augmented reality on Android. UA Mobile 2017.UA Mobile
 

More from UA Mobile (20)

Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...
 
Leave your Room behind - UA Mobile 2019
Leave your Room behind - UA Mobile 2019Leave your Room behind - UA Mobile 2019
Leave your Room behind - UA Mobile 2019
 
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019
 
Google Wear OS watch faces and applications development - UA Mobile 2019
Google Wear OS watch faces and applications development - UA Mobile 2019Google Wear OS watch faces and applications development - UA Mobile 2019
Google Wear OS watch faces and applications development - UA Mobile 2019
 
Історія декількох проектів та що в них пішло не так - UA Mobile 2019
Історія декількох проектів та що в них пішло не так - UA Mobile 2019Історія декількох проектів та що в них пішло не так - UA Mobile 2019
Історія декількох проектів та що в них пішло не так - UA Mobile 2019
 
Working effectively with ViewModels and TDD - UA Mobile 2019
Working effectively with ViewModels and TDD - UA Mobile 2019Working effectively with ViewModels and TDD - UA Mobile 2019
Working effectively with ViewModels and TDD - UA Mobile 2019
 
Managing State in Reactive applications - UA Mobile 2019
Managing State in Reactive applications - UA Mobile 2019Managing State in Reactive applications - UA Mobile 2019
Managing State in Reactive applications - UA Mobile 2019
 
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019
 
Актуальні практики дизайну мобільних додатків - UA Mobile 2019
Актуальні практики дизайну мобільних додатків - UA Mobile 2019Актуальні практики дизайну мобільних додатків - UA Mobile 2019
Актуальні практики дизайну мобільних додатків - UA Mobile 2019
 
До чого прикладати Docker в Android? - UA Mobile 2019
До чого прикладати Docker в Android? - UA Mobile 2019До чого прикладати Docker в Android? - UA Mobile 2019
До чого прикладати Docker в Android? - UA Mobile 2019
 
Building your Flutter apps using Redux - UA Mobile 2019
Building your Flutter apps using Redux - UA Mobile 2019Building your Flutter apps using Redux - UA Mobile 2019
Building your Flutter apps using Redux - UA Mobile 2019
 
Optional. Tips and Tricks - UA Mobile 2019
Optional. Tips and Tricks - UA Mobile 2019Optional. Tips and Tricks - UA Mobile 2019
Optional. Tips and Tricks - UA Mobile 2019
 
Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...
 
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019
 
Flutter: No more boring apps! - UA Mobile 2019
Flutter: No more boring apps! - UA Mobile 2019Flutter: No more boring apps! - UA Mobile 2019
Flutter: No more boring apps! - UA Mobile 2019
 
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019
 
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
 
Sceneform SDK на практиці - UA Mobile 2019
Sceneform SDK на практиці - UA Mobile 2019Sceneform SDK на практиці - UA Mobile 2019
Sceneform SDK на практиці - UA Mobile 2019
 
Coroutines in Kotlin. UA Mobile 2017.
Coroutines in Kotlin. UA Mobile 2017.Coroutines in Kotlin. UA Mobile 2017.
Coroutines in Kotlin. UA Mobile 2017.
 
Augmented reality on Android. UA Mobile 2017.
Augmented reality on Android. UA Mobile 2017.Augmented reality on Android. UA Mobile 2017.
Augmented reality on Android. UA Mobile 2017.
 

Декларативное программирование клиент-серверных приложений на андроид - UA Mobile 2019

  • 1. Тезисы доклада "Декларативное программирование клиент-серверных приложений на андроид" Практически сразу после написания первой программы возникла проблема повышения производительности труда программистов. Отметим, что сейчас, как и ранее, нет общепринятого определения термина “производительность труда программиста”. Несмотря на предпринятые за прошедшее время большие усилия и полученные значительные результаты в повышении производительности труда, эта проблема и сейчас является актуальной. Возможно даже в большей степени чем ранее. Для решения указанной проблемы применяют разнообразные способы и методы. Основными из них являются организационно-социальные методы, использование разнообразных библиотек, паттернов, шаблонов. Перспективным является применение декларативных языков программирования. К сожалению существующие декларативные языки ориентированы на ту или иную предметную область. Сотрудниками компании “Брендер” (г. Харьков) разработана библиотека реализующая принципы декларативного программирования при разработке клиент - серверных приложений на андроиде. Несмотря на то, что библиотека реализована для андроида, на заложенных в ней принципах можно разработать библиотеки и для других платформ. С использованием предлагаемой библиотеки, в соответствии с принципами декларативного программирования, мы описываем лишь ЧТО нужно, а не КАК это сделать. Библиотека существенно уменьшает количество java кода. Файлы ресурсов используются традиционные. Основой системы являются экраны. Они могут быть типа активити и типа фрагмент. В системе они объявляются просто: activity(MAIN, R.layout.activity_main) и fragment(SERVICE, R.layout.fragment_service) соответственно. Здесь MAIN и SERVICE – имена экранов (строковые переменные). Каждый экран содержит несколько компонентов (не менее одного). Компонент это составная часть экрана, которая характеризуется способом обработки и отображения данных. В компонентах реализует шаблон MVP. Компоненты также задаются достаточно просто, например: .component(​TC​.​RECYCLER​, model(API.​CATEGORIES​), view(R.id.​recycler​, R.layout.​item_home​), navigator(start(​0​, ​CATEGORY​))); Здесь RECYCLER – тип компонента, который определяет способ обработки и представления данных. Имеются различные типы, например: PAGER_F, MAP, SPINNER и другие. По их названиям понятно как отображаются компоненты. В компоненте модель задается параметром model(API.CATEGORIES) – указывает источник данных, параметр API.CATEGORIES – строка с адресом. Вид задается параметром view(R.id.recycler, R.layout.item_home) . Его параметры, в свою очередь, задают id ресайклера и id соответствующего item лайоута.
  • 2. Параметр navigator описывает реакцию на действия пользователя. В нашем случае указывает, что при клике на itemView будет вызван экран CATEGORY Это общее описание для понимания сущности работы с библиотекой. В реале существует большое число типов компонентов и не только прямых аналогов андроидных виджетов и элементов. Для некоторых компонентов имеется упрощенная нотация, например: componentMap, componentYoutube и пр. Модель также имеет различные модификации, например, можно задавать методы: GET, POST, GET_DB, POST_DB, UPDATE_DB и др. В моделе можно указывать параметры для запросов, последействия (для запросов с методами POST) и другие параметры. Представление также имеет несколько модификаций задания параметров view. И, естественно, имеется большой набор действий для навигатора. Рассмотрим как выглядит код для пары экранов, изображенных на рисунке. Третий рисунок это второй экран с прокруткой. Это экраны реального коммерческого приложения Склад Техника (есть на маркете). В основном код экранов контекстно понятен. Поэтому буду его комментировать минимально. Как видим все экраны имеют внизу единое для всех навигационное меню. Поэтому приложение реализовано по схеме main активити в котором есть контейнер для фрагментов и меню. Его код следующий: activity(​MAIN​, R.layout.​activity_main​) .fragmentsContainer(R.id.​content_frame​) .menuBottom(R.id.​nav​, ​HOME​, ​REPAIRS_MAIN​, ​ABOUT​, ​NEWS​); Компонент menuBottom задает id соответствующего RadioGroup и перечень названий экранов, которые показываются при клике на соответствующие пункты. Экран 1 Экран 2 Экран 2 (продолжение) Первый экран отображает продукцию категории "Інше". Код для его реализации следующий:
  • 3. fragment(​CATEGORY​, R.layout.​fragment_category​).animate(​AS​.​RL​) .navigator(back(R.id.​back​)) .component(​TC​.​RECYCLER​, model(API.​PRODUCTS​, ​"categoryId"​), view(R.id.​recycler​, R.layout.​item_category​), navigator(start(​0​, ​PRODUCT​))); Данные (​model​) берутся по адресу API.PRODUCTS с параметром categoryId. При клике на товар вызывается экран PRODUCT. При этом устанавливаются значения всех необходимых параметров. Код реализации экрана PRODUCT следующий: fragment(​PRODUCT​, R.layout.​fragment_product​).animate(​AS​.​RL​) .navigator(back(R.id.​back​), handler(R.id.​apply​, ​ITEM_FORM​, ​PS​.​RECORD_COMPONENT​, R.id.​panel​)) .component(​TC​.​PANEL​, model(API.​DETAIL​, ​"productId"​), view(R.id.​panel​) .visibilityManager(​visibility​(R.id.​video​, ​"videoLink"​), ​visibility​(R.id.​charact​, ​"description.characteristics"​)), navigator(start(R.id.​video​, ​YOUTUBE​))); Здесь handler(R.id.apply, ITEM_FORM,… указывает, что при клике на кнопку "Залишити замовлення" (R.id.apply) необходимо вызвать экран ITEM_FORM. visibilityManager описывает условия видимости отдельных элементов в зависимости от значений данных. В частности, если поле videoLink пустое, то не будет показываться кнопка "переглянути видео". А поле description.characteristics управляет видимостью группы элементов "Загальні характеристики". Как видим, количество кода для реализации экранов небольшое и этот код достаточно простой и интуитивно понятный. При разработке реального коммерческого приложения "крон авто" (есть на маркете) параллельно велась разработка по традиционной технологии и разработка с использованием библиотеки декларативного программирования. Это позволило сделать следующие выводы: ● Количество кода с использованием библиотеки в 50-60 раз меньше чем при традиционном подходе. ● Время на разработку java кода в 20 - 25 раз меньше. ● Время на тестирование в 7-10 раз меньше (за счет меньшего количества багов). ● Исправление каждого из багов в 20 - 25 раз меньше.