BMSTU/02-ipsm-lab-02-report.tex

151 lines
13 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

\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}