Архитектура и компоненты - Разработка программы для реализации редактора временных графов синхронизации

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

    § Модель полностью изолирована и является исключительно предметно-ориентированной. Фактически, модель можно использовать в отрыве от интерфейса, например при встраивании в другой инструмент; § Presenter извлекает данные из модели и форматирует их для отображения в представлении. В данном случае из внутреннего представления модели сети Петри генерируются наборы графических примитивов, которые рисуются покоординатным способом на стороне отображения, без учета предметной области. В то же время Presenter занимается обработкой пользовательских событий, поступающих из отображения -- нажатие мышкой, нажатие клавиши и так далее. После обработки события Presenter изменяет модель; § Отображение отвечает за пользовательский интерфейс -- отрисовки окна, формы, кнопок и других элементов приложения в операционной среде. Здесь также обрабатываются события, поступающие от операционной среды и в зависимости от типа передаются Presenter'у. Отображение ничего не знает о предметной области, но тем не менее логика пользовательского интерфейса реализуется частично на его стороне (JavaScript, QtQuick).

Иллюстрация находится на рисунке 13.

model-view-presenter

Рисунок 13. Model-View-Presenter

Компоненты на стороне Go.

Исходя из поставленных задач и списка необходимого функционала, приложение поделено на следующие компоненты (пакеты):

Tegview -- изолированный пакет редактора сети Петри, внутри построен при помощи паттерна MVP, на Go написаны Model и Presenter. Первое окно программы создается именно на основе этого модуля. Из окна tegview может вызываться открытие других окон tegview для групп и открываемых файлов.

Planeview -- изолированный пакет редактора входных данных, реализует отображение конусов на плоскости и их редактирование, написан по подобию tegview, используется паттерн MVP, на Go написаны Model и Presenter. Из окна tegview вызывается открытие окон planeview.

Render -- пакет с типами графических примитивов и методами для работы с ними.

Geometry -- пакет с типами геометрических примитивов и методами для работы с ними.

Dioid -- пакет для работы с диоидной алгеброй. Включает в себя парсер выражений вида "g3d2 + g4d7 + g3d4 x (g1d2)*", обертку над библиотекой libminmaxgd, декларацию типов для внутреннего представления элементов алгебры.

Workspace -- пакет для управления набором открытых окон, реализован с целью контролировать максимальное количество открытых одновременно окон (существует намеренное ограничение в go-qml, при необходимости можно обойти), также обеспечить корректное завершение приложения после закрытия последнего окна.

Util -- пакет вспомогательных утилит: реализация стека, генератор UUID, конвертер hex-представления цвета из формата RGB в ARGB.

Компоненты на стороне QtQuick/QML

TegView -- реализация вида, компонент унаследован от QtQuick-компонента ApplicationWindow. Содержит инструментальную панель, панель статуса, полотно с отображением модели (сеть Петри).

PlaneView -- аналогично TegView. Содержит инструментальную панель, панель статуса, текстовое поле для редактирования элементов степенного ряда, панель выбора активного слоя и изменения видимости других, область менеджера слоев.

Plane -- менеджер слоев на декартовой плоскости. Каждый слой отображает модель (коллекцию точек) в виде конусов на плоскости, по ТЗ эти слои должны накладываться друг на друга. Содержит корневой слой (отображающий координатную сетку, оси, подписи) и коллекцию слоев, построенных по модели в Presenter'е.

PlaneLayer -- отображение слоя. Содержит полотно и методы, рисующие графические примитивы из кешированной коллекции. Коллекция кешируется на стороне QML/JavaScript из-за особенностей управления памятью при передачи объектов из Go в QML. В любом случае, без него новые данные будут заменять старые прямо в процессе отрисовки, что неправильно.

XButton, XToggle -- самостоятельная реализация кнопки (с поддержкой иконок) и кнопки-выключателя.

Похожие статьи




Архитектура и компоненты - Разработка программы для реализации редактора временных графов синхронизации

Предыдущая | Следующая