Обзор структуры сгенерированных клиентского и серверного приложений, основные рекомендации по написанию кода для возможности его перегенерации

В этом разделе рассматривается пример структуры сгенерированного приложения для следующей диаграммы классов:

Диаграмма классов для рассмотрения сгенерированного `Flexberry Ember`-приложения.

Структура сгенерированного клиентского приложения

Структура сгенерированного Flexberry Ember-приложения по сути расширяет структуру “чистого” Ember-приложения. При генерации Flexberry Ember-приложения сначала происходит генерация “чистого” Ember-приложения, а затем генерируются дополнительные элементы приложения на осове метаданных, соответствующих спроектированной модели предметной области во Flexberry Designer. На скриншоте ниже слева представлена структура “чистого” Ember-приложения, полученная при генерации с использованием инструментов командной строки Ember, справа - с помощью генерации кода клиентского приложения из Flexberry Designer. Как можно заметить, в варианте структуры справа уже установлены bower- и node-модули (из-за установки соответствующих дополнительных пакетов, помимо прочего, генерация из Flexberry Designer может занимать длительное время), а также добавлен файл theme.config для осуществления настройки темы оформления конкретного приложения.

Сравнение структуры «чистого» Ember-приложения и `Flexberry Ember`-приложения.

При сравнении структуры папки app (на скриншоте ниже слева представлено “чистое” Ember-приложение, справа - Flexberry Ember-приложение) также очевидно, что Flexberry Ember-приложение содержит дополнительные элементы.

Cравнение структуры папки APP «чистого» Ember-приложения и `Flexberry Ember`-приложения.

Далее мы подробнее рассмотрим те элементы Ember-приложения, которые генерируются из Flexberry Designer.

Сгенерированные модели

При генерации приложения из Flexberry Designer в клиентское приложение добавляются следующие модели (папка models):

Модели в сгенерированном `Flexberry Ember`-приложении.

На скриншоте выделены модели, соответствующие объектам данных (бизнес-объекты приложения), структура этих моделей описана в отдельной статье.

Помимо самих моделей также генерируется файл custom-inflector-rules.js, где посредством Ember Inflector задаётся соответствие имён моделей в единственном и множественном числе - соответствующие преобразования имен автоматически осуществляются при формировании запросов к серверу (если присмотреться, то можно заметить, что в правилах преобразования указаны последние слова в именах моделей, соответствующих классам данных).

import Inflector from 'ember-inflector';

const inflector = Inflector.inflector;

inflector.irregular('agregator', 'Agregators');
inflector.irregular('child1', 'Child1s');
inflector.irregular('child2', 'Child2s');
inflector.irregular('class', 'Classs');

export default {};

Сгенерированные сериализаторы

При генерации приложения из Flexberry Designer в клиентское приложение добавляются следующие сериализаторы (папка serializers):

Cериализаторы в сгенерированном `Flexberry Ember`-приложении.

Каждой модели соответствует свой сериализатор. Для каждой модели также генерируются офлайн-сериализаторы для работы с офлайн-хранилищем.

Сгенерированные миксины

При генерации приложения из Flexberry Designer в клиентское приложение добавляются следующие миксины (папка mixins):

Миксины в сгенерированном `Flexberry Ember`-приложении.

Миксины при генерации добавляются во вложенную папку regenerated. При каждом запуске перегенерации из Flexberry Designer данные миксины будут обновлены, что нужно учитывать, чтобы новый программный код не был утерян. В миксины вынесены как части моделей, так и сериализаторов, в том числе офлайн-сериализаторов.

Сгенерированные адаптеры

При генерации приложения из Flexberry Designer в клиентское приложение добавляются следующие адаптеры (папка adapters), в том числе адаптер для работы в офлайн-режиме:

Адаптеры в сгенерированном `Flexberry Ember`-приложении.

Сгенерированные сервисы

При генерации приложения из Flexberry Designer в клиентское приложение добавляется переопределенный сервис store (папка services), который позволяет приложению работать как в онлайн-режиме, так и в офлайн-режиме.

Сервисы в сгенерированном `Flexberry Ember`-приложении.

Сгенерированные перечисления и трансформации

При генерации приложения из Flexberry Designer в клиентское приложение добавляются следующие перечисления (папка enums):

Перечисления в сгенерированном `Flexberry Ember`-приложении.

Перечисления соответствуют заданным на диаграмме классов сущностям со стереотипом enumeration. Поскольку перечисления не поддерживаются в Ember-приложениях “из коробки”, то для каждого перечисления генерируется также соответствующая трансформация (папка transforms):

Трансформации в сгенерированном `Flexberry Ember`-приложении.

Сгенерированные контроллеры

При генерации в клиентское приложение добавляются следующие контроллеры (папка controllers):

Контроллеры в сгенерированном `Flexberry Ember`-приложении.

Контроллеры генерируются для форм и приложений, заданных на соответствующей диаграмме классов во Flexberry Designer. Также для форм создания записей отдельно генерируется контроллер new в папку с именем соответствующей формы редактирования.

Диаграмма форм и приложений для рассмотрения сгенерированного `Flexberry Ember`-приложения.

В контроллер application сгенерирован код для работы с меню (в нем определяется структура меню, заданная во Flexberry Designer), а также необходимый для смены локализации код.

Сгенерированные роуты

При генерации приложения из Flexberry Designer в клиентское приложение добавляются следующие роуты (папка routes):

Роуты в сгенерированном `Flexberry Ember`-приложении.

Роуты генерируются для списковых форм, форм редактирования, заданных на соответствующей диаграмме классов во Flexberry Designer (эту диаграмму мы рассматривали ранее, когда говорили о сгенерированных контроллерах). Для форм создания записей по аналогии с генерацией контроллеров отдельно генерируется роут new в папку с именем соответствующей формы редактирования.

Сгенерированные шаблоны

При генерации приложения из Flexberry Designer в клиентское приложение добавляются следующие шаблоны (папка templates):

Шаблоны в сгенерированном `Flexberry Ember`-приложении.

Шаблоны генерируются для списковых форм и форм редактирования, заданных на соответствующей диаграмме класов во Flexberry Designer (эту диаграмму мы рассматривали ранее, когда говорили о сгенерированных контроллерах).

Для списковых форм отдельно генерируется также шаблон loading в папку с именем соответствующей списковой формы, этот шаблон отображается в процессе перехода на соответствующий роут (этот шаблон генерируется также и на уровень всего приложения).

Также генерируется шаблон для отображения сообщения об ошибках (шаблон error). Этот шаблон генерируется только на уровень всего приложения.

Стандартый для “чистого” Ember-приложения шаблон application также заменяется на шаблон, разметка которого используется в темах оформления Flexberry Ember-приложений. Кроме того, генерируется также вариант шаблона application, который будет использоваться при запуске приложения на мобильных устройствах (генерация осуществляется в папку mobile; по аналогии во вложенных папках mobile могут быть созданы и другие элементы приложения, если их работу требуется переопределить при запуске приложения на мобильных устройствах).

По сравнению с рассмотренной структурой папки templates в “чистом” Ember-приложении присутствует только шаблон application со стандартной разметкой “из коробки”.

Сгенерированные файлы локализации

При генерации приложения из Flexberry Designer в клиентское приложение добавляются следующие файлы локализации (папка locales):

Файлы локализации в сгенерированном `Flexberry Ember`-приложении.

Генерируются файлы локализации для русского и английского языков для форм (папка forms) и моделей (папка models), а также для приложения в целом (translations.js).

Сгенерированные стили

При генерации приложения из Flexberry Designer в клиентское приложение добавляются следующие стили (папка styles):

Стили в сгенерированном `Flexberry Ember`-приложении.

В “чистом” Ember-приложении “из коробки” присутствует только пустой файл app.css.

Сгенерированные компоненты

При генерации приложения из Flexberry Designer в клиентское приложение не добавляются новые компоненты (папка components). Однако на сгенерированных формах используются компоненты, которые определены в аддоне ember-flexberry.

Сгенерированные хэлперы

При генерации приложения из Flexberry Designer в клиентское приложение не добавляются хэлперы (папка helpers). Однако в шаблонах сгенерированных форм используются хелперы, которые определены в аддоне ember-flexberry.

Структура сгенерированного серверного приложения

Сгенерированное решение для бэкенда состоит из двух основных проектов. Первый - это проект с объектами данных, соответствующих сущностям модели предметной области во Flexberry Designer (то есть классам на диаграммах классов). Второй - это непосредственно Web API-приложение с OData-сервисом, которое предоставляет серверный API для клиентского приложения.

Структура сгенерированного серверного приложения.

Правила написания кода

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

Код для объектов данных на бэкенде должен быть заключён в скобки программиста. Аналогичного механизма для остальных частей сгенерированных приложений (как клиентского, так и серверного) пока не предусмотрено, поэтому возможны следующие варианты решения данной проблемы:

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