151 lines
13 KiB
TeX
151 lines
13 KiB
TeX
\documentclass[a4paper,fontsize=14bp]{article}
|
||
|
||
\input{../common-preamble}
|
||
\input{../fancy-listings-preamble}
|
||
\input{../bmstu-preamble}
|
||
%\setcounter{secnumdepth}{0}
|
||
\numerationTop
|
||
|
||
\begin{document}
|
||
\thispagestyle{empty}
|
||
\makeBMSTUHeader
|
||
|
||
% номер, тема, предмет, ?а, кто
|
||
\makeReportTitle{лаботаторной}{2}{Создание и использование метамоделей}{Моделирование информационных процессов и систем}{а}{Кадырбаева А.Р.}
|
||
\newpage
|
||
\thispagestyle{empty}
|
||
\tableofcontents
|
||
\newpage
|
||
\pagestyle{fancy}
|
||
\section{Цель работы}
|
||
Ознакомление с методами и средствами model-driven development, создания и использования метамоделей, автоматической генерации кода.
|
||
Задание: необходимо ознакомиться с основами работы с метамоделями с использованием Ecore, а также освоить применение инструментов Eclipse EMF.
|
||
|
||
\section{Выполнение}
|
||
Для выполнения работы было установлено программное обеспечение Eclipse Modeling Tools\footnote{прямая ссылка на страницу загрузок: https://www.eclipse.org/downloads/packages/}.
|
||
\begin{enumerate}
|
||
\item Создан новый проект с именем webpage и классами, указанными на рис. \hrf{pic:first-model}
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[height=8cm]{02-frist-model.png}
|
||
\caption{Диаграмма классов с отношениями}
|
||
\label{pic:first-model}
|
||
\end{figure}
|
||
\item Для верхнего уровня модели был задан адрес артефакта \code{com.vogella.emf.webpage.model}.
|
||
\item Был сгенерирован код на языке Java для описанной модели.
|
||
\item Созданы ещё два проекта: \code{webpage.edit} и \code{webpage.editor}. На основе модели в рамках запущенного \code{Webpage.editor} были созданы демонстрационные экземпляры сущностей \code{Web} и \code{Webpage} (рис. \hrf{pic:instance-first-model}).
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[height=8cm]{02-instance-first-model}
|
||
\caption{Экземпляр приложения по модели}
|
||
\label{pic:instance-first-model}
|
||
\end{figure}
|
||
\item В методических указаниях не очевидно, какой именно проект нужно создать и в какую часть манифеста добавить зависимость, пункт пропущен.
|
||
\item Была создана переопределённая функция \code{toString();} При переопределении была отмечена особеность, что сохранить многострочное тело функции в модели недостаточно (в файле \code{genmodel} сохраняется только первая строка), необходимо добавить тело функции полностью непосредственно в свойства функции в файле \code{genmodel}.
|
||
\item Был создан тестовый метод ввода некоторого целого числа.
|
||
\item Были проработаны механизмы наследования классов.
|
||
\end{enumerate}
|
||
|
||
\section{Индивидуальное задание}
|
||
Индивидуальным заданием к лабораторной работе было описание небольшого проекта в приложении для моделирования и создание классов на языке Java по заданному описанию. Было выбрано приложение-расширение для обмена сообщениями в информационных системах.
|
||
|
||
Для обмена сообщениями в системе необходимо хранить:
|
||
\begin{itemize}
|
||
\item Объект сообщения;
|
||
\item Данные сообщения;
|
||
\item Тип данных сообщения;
|
||
\item Метаданные сообщения;
|
||
\item Пользователя;
|
||
\item Роль пользователя;
|
||
\end{itemize}
|
||
|
||
В Eclipse Modeling Framework была создана модель данных, показанная на рис. \hrf{pic:indi-model}
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[width=12cm]{02-mailing.png}
|
||
\caption{Упрощённая модель данных приложения для обмена сообщениями}
|
||
\label{pic:indi-model}
|
||
\end{figure}
|
||
|
||
Поскольку все сообщения сохраняются в БД и сразу доступны всем пользователям, то необходимо определить разделение прав доступа к сообщениям (видимость только отправителю и получателю), что сделано привязкой сообщения к пользователю. Также пользователь может начать писать сообщение, но не отправить его, удалить сообщение или отправить в корзину/избранное/папку. Для всех манипуляций с сообщением создан класс метаинформации о сообщении, содержащий флажки (булевы значения), говорящие о разных состояниях объекта сообщения. Содержание сообщения может быть разнообразным, поэтому принято решение хранить все данные в максимально простом типе: обычный массив байтов, который может быть представлен как текст, изображение, ссылка на сущность в приложении, другое сообщение, пользователя, и так далее. Пользователи в данном варианте приложения могут иметь несколько ролей: самая простая - это просто отправка и получение сообщений, модератор - пользователь, имеющий право изменять метаинформацию чужих сообщений, администратор - пользователь, имеющий право удалять чужие сообщения. Никакие пользователи не могут редактировать сообщения для сохранения достоверности. Все сообщения удаляются с применением технологии soft-delete, которая не удаляет объект из БД, а только помечает его, как удалённый. Сгенерированные структуры представлены на рис. \hrf{pic:descriptors}.
|
||
|
||
\begin{figure}[H]
|
||
\centering
|
||
\begin{subfigure}[b]{0.4\textwidth}
|
||
\centering
|
||
\includegraphics[width=\textwidth]{02-mailing-ecore.png}
|
||
\caption{Ecore}
|
||
\label{pic:ecore}
|
||
\end{subfigure}
|
||
\hfill
|
||
\begin{subfigure}[b]{0.4\textwidth}
|
||
\centering
|
||
\includegraphics[width=\textwidth]{02-mailing-genmodel.png}
|
||
\caption{Genmodel}
|
||
\label{pic:genmodel}
|
||
\end{subfigure}
|
||
\caption{Сгенерированные файлы метамоделей}
|
||
\label{pic:descriptors}
|
||
\end{figure}
|
||
|
||
Полные листинги сгенерированных классов представлены в приложениях \hrf{appendix:interface}, \hrf{appendix:implement}, \hrf{appendix:util}.
|
||
|
||
\section{Контрольные вопросы}
|
||
\subsection{Можно ли установить пустую строку в качестве значения по умолчанию? Как это сделать? Как удалить пустое значение?}
|
||
Это возможно. Чтобы установить пустую строку в качестве значения по умолчанию, необходимо выполнить следующие действия:
|
||
\begin{enumerate}
|
||
\item выбрать атрибут;
|
||
\item в свойствах выбрать поле значения «Литерал значения по умолчанию»;
|
||
\item оставить значение пустым.
|
||
\end{enumerate}
|
||
|
||
Чтобы удалить это пустое значение, необходимо нажать «Восстановить значение по умолчанию» на панели инструментов.
|
||
|
||
\subsection{Что такое модель данных?}
|
||
Модель данных - это совокупность модели и метамодели, описывающих структуру и связи классов и объектов в приложении, составляющих абстрактное представление доступа к данным, с которым взаимодействует пользователь.
|
||
|
||
\subsection{Какие методы генерации классов существуют? Опишите их.}
|
||
Классы на языках программирования можно описывать несколькими способами:
|
||
\begin{itemize}
|
||
\item вручную по мере описания проекта и возникновения необходимости;
|
||
\item вручную согласно заранее описанной модели системы;
|
||
\item автоматизированно приложением codegen на основе описанной модели системы;
|
||
\item автоматизированно на основе метаданных ORM или реляционной БД;
|
||
\item автоматизированно одновременно с моделью БД (liquibase);
|
||
\item автоматизированно на основе описанной модели с помощью приложений для моделирования.
|
||
\end{itemize}
|
||
|
||
\newpage
|
||
\appendix
|
||
%\setcounter{secnumdepth}{0}
|
||
\section*{Приложения}
|
||
\addcontentsline{toc}{section}{Приложения}
|
||
\renewcommand{\thesubsection}{\Alph{subsection}}
|
||
|
||
\subsection{Листинги интерфейсов}
|
||
\label{appendix:interface}
|
||
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MailingFactory.java]{build/src-gen/mailing/MailingFactory.java}
|
||
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MailingPackage.java]{build/src-gen/mailing/MailingPackage.java}
|
||
% \lstinputlisting[language=Java, style=JCodeStyle, caption=Message.java]{build/src-gen/mailing/Message.java}
|
||
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MessageContent.java]{build/src-gen/mailing/MessageContent.java}
|
||
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MessageContentType.java]{build/src-gen/mailing/MessageContentType.java}
|
||
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MessageMeta.java]{build/src-gen/mailing/MessageMeta.java}
|
||
% \lstinputlisting[language=Java, style=JCodeStyle, caption=User.java]{build/src-gen/mailing/User.java}
|
||
% \lstinputlisting[language=Java, style=JCodeStyle, caption=UserRole.java]{build/src-gen/mailing/UserRole.java}
|
||
% \lstinputlisting[language=Java, style=JCodeStyle, caption=UserRolesEnum.java]{build/src-gen/mailing/UserRolesEnum.java}
|
||
\subsection{Листинги реализаций}
|
||
\label{appendix:implement}
|
||
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MailingFactoryImpl.java]{build/src-gen/mailing/impl/MailingFactoryImpl.java}
|
||
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MailingPackageImpl.java]{build/src-gen/mailing/impl/MailingPackageImpl.java}
|
||
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MessageContentImpl.java]{build/src-gen/mailing/impl/MessageContentImpl.java}
|
||
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MessageImpl.java]{build/src-gen/mailing/impl/MessageImpl.java}
|
||
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MessageMetaImpl.java]{build/src-gen/mailing/impl/MessageMetaImpl.java}
|
||
% \lstinputlisting[language=Java, style=JCodeStyle, caption=UserImpl.java]{build/src-gen/mailing/impl/UserImpl.java}
|
||
% \lstinputlisting[language=Java, style=JCodeStyle, caption=UserRoleImpl.java]{build/src-gen/mailing/impl/UserRoleImpl.java}
|
||
\subsection{Листинги утилитарных классов}
|
||
\label{appendix:util}
|
||
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MailingAdapterFactory.java]{build/src-gen/mailing/util/MailingAdapterFactory.java}
|
||
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MailingSwitch.java]{build/src-gen/mailing/util/MailingSwitch.java}
|
||
|
||
\end{document}
|