Практически сразу после написания первой программы возникла проблема повышения производительности труда программистов. Несмотря на предпринятые за прошедшее время большие усилия и достигнутые значительные результаты в повышении производительности труда, эта проблема и сейчас является актуальной.
Для решения указанной проблемы применяют разнообразные способы и методы. Основными из них являются организационно-социальные методы, использование разнообразных библиотек, паттернов, шаблонов. Перспективным является применение декларативных языков программирования. К сожалению, существующие декларативные языки ориентированы на ту или иную предметную область.
Сотрудниками компании “Брендер” (г. Харьков) создана библиотека реализующая принципы декларативного программирования при разработке клиент - серверных приложений на андроиде.
В докладе будут рассмотрены основы декларативного программирования клиент-серверных приложений на примере реального коммерческого проекта. Также будет показан анализ производительности и качества разработки приложений традиционными технологиями и с использованием библиотеки декларативного программирования.
Декларативное программирование клиент-серверных приложений на андроид - 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 раз меньше.