Cross-Platform Model-Driven Development of Mobile Applications with MD2

Henning Heitkötter University of Münster, Münster, Germany Tim A. Majchrzak University of Münster, Münster, Germany Herbert Kuchen University of Münster, Münster, Germany. ACM, 2013. http://dl.acm.org/citation.cfm?id=2480362.2480464&coll=DL&dl=GUIDE&CFID=349386071&CFTOKEN=50567512

Данная статья посвящена методу MD2, с помощью которого осуществляется кроссплатформенная разработка мобильных приложений. MD2, позволяет программисту построить необходимую модель и точно описать соответствующее приложение с помощью высокоуровневого предметно-ориентированного языка, созданного для лаконичного описания бизнес-приложения. При помощи этой модели автоматически генерируются приложения под Android и iOS. В отличие от подходов, использующих сетевые технологии, в данном случае не наблюдается низкий уровень абстракции и такая потеря персональных качеств платформы. MD2 была создана в тесном сотрудничестве с отраслью и предоставляет средства для разработки приложений, управляемых данными (data-driven). Приложения также могут взаимодействовать с удаленными серверами.

Мобильные устройства набрали огромную популярность в последнее время. Это способствует огромному количеству выпускаемых приложений для различных целей. На данный момент существует 5 основных платформ с достаточно большим количеством пользователей и для каждой из них приложение нужно разрабатывать отдельно. Такой процесс затрачивает большое количество времени и ресурсов, которые можно было бы использовать более эффективно. Таким образом, вводится понятие кросс-платформенной разработки для одновременного создания приложения на несколько платформ.

На текущий момент популярные структуры для разработки таких кросс-платформенных приложений либо основаны на Сетевых Технологиях, либо интерпретируют среду с использованием исходных компонент платформ. MD2 относится ко второму типу структур. Такие методы практически достигают натуральный вид для каждой платформы, но все они имеют серьезный недостаток в отношении уровня абстракции, производительности, функциональности и ошибок.

MDSD – использующий модели разработчик ПО работает хорошо для ПК и серверных сценариев. Идея MDSD – это представить проблему с помощью модели и сгенерировать ПО, используя эту модель. MDSD обладает способностями разработки нескольких приложений для разных платформ, которые имеют одинаковую функциональность и общее поведение. Для оценки полезности MDSD авторы статьи разработали MD2 как прототипный каркас для кросс-платформенной разработки с помощью моделей. Первоначально приложения описаны с помощью предметно-ориентированного языка, затем подвергаются трансформации и приходят к платформо-ориентированному коду.

Для разработки кроссплатформенных приложений отлично подходит задача разработки с помощью моделей. Автоматические трансформации генерируют исходный код из модели, определенной разработчиком. Разработчики описывают свои приложения на достаточно высоком уровне, и эти определения транслируются в код для различных мобильных платформ.

Описанная в статье структура MD2 реализует идею в области бизнес приложений, работающих с данными. Этот метод удовлетворяет основным потребностям разработчиков бизнес приложений, что было выявлено с помощью опросов и других средств сбора данных.

Для бизнес приложений с данными, разработчикам необходимо:

  1. определять типы данных, иметь возможность создавать, обновлять и удалять операции для этих типов, как на устройстве, так и на сервере
  2. имплементировать пользовательский интерфейс с различными макетами, особенно интерфейсы с таблицами и с различными основными компонентами
  3. управлять последовательностью различных видов интерфейса
  4. определять связь данных и проверку входных данных
  5. реагировать на изменения состояний и событий
  6. использовать характеристики устройства такие как GPS

Разработку приложения можно разделить на три логические части и только первая из них является умственной работой для разработчиков, когда необходимо описать приложение с помощью текстовой модели. Другие две части состоят в кодогенерации и компиляции сгенерированного кода.

MD2 в свою очередь используется в первых двух фазах: поддерживает разработку и выполняет генерацию кода. Авторы определяют предметно-ориентированный язык для выражения приложения как высокоуровневой модели, что необходимо для выполнения первой фазы. Абстрактный синтаксис и текстовые обозначения определены и получены с помощью Xtext. Помимо синтаксического анализатора, также создается редактор, который поддерживает подсвечивание синтаксиса, дополнение кода и его проверка.

В момент сохранения разработчиком модели, автоматически запускается кодогенерация. Анализатор создает абстрактный синтаксис и представляет множество элементов, а также связи между ними. Также перед генерацией кода происходит предобработка для упрощения последующей генерации. Затем получаем исходный код для каждой из платформ. Также создаются файлы в XML, генерируются проектные файлы и настройки.

MD2 и созданные с его помощью приложения используют принцип Model-View-Controller (MVC). Разделение обязанностей отображено во всех компонентах: модель приложения разделена на модель, вид и контроллер. В сгенерированных приложениях контроллер основан на системе событий и работает с действиями пользователя также как и с внутренними событиями. В модели разработчики определяют, какие действия необходимо предпринять в случае, если определенное событие имеет место.

Предметно-ориентированный язык это центральная часть MD2 и он создает основу для всех остальных частей. Спецификация языка определяет понятия, которые в дальнейшем используются разработчиками для описания модели. Таким образом, можно исследуя этот язык, можно сделать вывод о возможностях MD2, т.е. множестве характеристик.

Одной из целей этого продукта была значительное увеличение уровня абстракции приложений сравнимая с ручной реализацией. Таким образом, язык должен описывать пространство задач приложения, а не пространство решений. Предметно-ориентированный язык, построенный для DSL, следует 4 главным принципам построения: разделение MVC компонент, декларативный стиль, соглашение прежде состава (convention over configuration) и модульность.

Как определено общей архитектурой MVC, модель приложения разделена на три пакета, каждый для соответствующей компоненты MVC. Пакет использует только те части языка, которые связаны с данной компонентой.

Язык является декларативным в том смысле, что разработчик определяет что приложение должно выполнять, вместо того предписывать как выполнять это алгоритмически. Таким образом, все компоненты сфокусированы на пространстве задачи. Например, модель вида описывает, как пользовательский интерфейс должен выглядеть, т.е. элементы и их композиция, а не как построить интерфейс в виде последовательности обязательных выражений.

Где возможно, язык следует принципу соглашение прежде состава, принимая параметры по умолчанию для текущих аспектов. Благодаря модульности, текущие моменты могут быть определены только однажды и использованы еще несколько раз.

Ниже будут представлены отрывки из просто библиотечного приложения, которое позволяет взять взаймы книгу.

package org.example.library.models
    entity Book {
        title : string
        author : string (optional)
        isbn : string { name ”ISBN” }
    }
    entity LoanRequest {
        bookRequested : Book
        email : string
    }

Выше описана модель данных.

Сущности – это главная составляющая языка. Как большинство элементов они имеют имена, которые следуют сразу за ключевыми словами. Они также имеют атрибуты с предопределенными типами, такими как String, Integer и Date и ссылки на другие сущности. Кроме сущностей MD2 позволяет определение численных типов. В общем, часть языка, которую представляют данные, предполагает, что типизированные переменные описывают модель данных приложения.

Часть, которая называется Вид отвечает за пользовательский интерфейс приложения.

package org.example.library.views

FlowLayoutPane MainView (vertical) {
    Label bookHeader { 
        text ”Book”
        styleHeaderStyle 
    }

    AutoGenerator bookInfoPart {
        contentProvider bookProvider 
    }
    
    Button loadBookBtn (”Load_book_from_ISBN”)
    Label loanHeader { 
        text "Request_Loan"
        style HeaderStyle 
    }
    
    TextInput loanEMail { 
        label ”Email_address”
        tooltip ”Please_provide_your_email_...” 
    }
 
    Button loanBtn (”Loan_this_book”)
}
... % Infoview
TabbedPane TabbedView {
    MainView −> Main
    InfoView (tabTitle ”Info”)
}

style HeaderStyle {
    fontSize 20 
    textStyle bold 
}

Язык предоставляет 2 типа элементов для Вида: индивидуальное содержимое (individual content) и контейнер. Элементы с содержимым, такие как метки, поля для форм и кнопки сгруппированы и расположены внутри элементов-контейнеров. Эти контейнеры связаны с определенными макетами (например решеточный макет), которые определяют как элементы из контейнера будут расположены.

Большинство элементов из части Вид могут быть параметризованы для достижения желаемого внешнего вида. Особенная черта MD2 это способность быстро создавать представления со значением по умолчанию для типа сущность. Для этого разработчику необходимо добавить AutoGenerator. AutoGenerator позволяет разработчикам быстро имплементировать приложение, при условии, что оно не имеет специальных особенностей.

Компонента контроллера языка соединяет вместе модель и вид и позволяет описывать поведение приложения. Она также используется для определения общих свойств, таких как изображение видов и выполнение действий. Действия – центральный элемент контроллера. Понятие действия – единственный элемент языка, который не подчиняется декларативному стилю, потому что действия описывают поведение приложения.

package org.example.library.controllers

main {
    appName ”Library_Application”
    ... % version information etc.
    startView TabbedView.Main
    onInitialized init
}

action CombinedAction init {
    actions bindEvents mapFields 
}

action CustomAction bindEvents {
    bind action loadBook on MainView.loadBookBtn.onTouch
    bind action sendLoanRequest on MainView.loanBtn.onTouch
}

action CustomAction mapFields {
    map MainView.loanEMail to loanProvider.email
    bind validator RegExValidator
    % simplified and erroneous regex
    ( regEx ”[ a−z ]+@ [ a−z ] + \\.[ a−z ]+ ”)
    on MainView.loanEMail
}

... % actions loadBook, sendLoanRequest
contentProvider Book bookProvider {
    providerType someServer
    filter first where Book.isbn equals
    MainView.bookInfoPart [Book.isbn]
}

contentProvider LoanRequest loanProvider {
    providerType someServer 
}

remoteConnection someServer {
    uri ”http :...” 
}

Действия могут быть привязаны к событиями (11-14 строки). MD2 имеет три типа событий:

  1. Те, что являются результатом непосредственно из взаимодействия с пользователем
  2. Глобальные события
  3. Условные события

Центральная часть MD2 - это использующая данные составляющая структуры. Связь в приложении между внутренним и удаленным ресурсами данных предоставляется с помощью поставщика информации (content provider) как соответствующего элемента языка. Локальный поставщик относится к базе данных, управляемой приложением. Удаленный провайдер связан с сервером с помощью специального интерфейса (25, 31 строки). Такие провайдеры определяют тип данных, который они предоставляют, который относится либо к определенной ранее в модели сущности, либо к некоторому из примитивных типов.

Контроллер также занимается связывание модели и вида через отображение данных (data mapping).