Файл: Критерии выбора средств разработки мобильных приложений (Разработка требований к мобильным приложениям).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 12.03.2024

Просмотров: 22

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Типичное поведение приложение воспроизводит все описанные выше требования, работая в стандартном бесперебойном режиме. В нетипичном поведении приложение завершает свою работу: все находимые нетипичные ситуации обрабатываются программой.

Проектирование программного продукта

Приложение состоит из трех основных компонентов (классов):

  1. симуляция игры (программная логика);
  2. отображение визуальных компонентов (кнопки, надписи и пр.);
  3. прорисовка системы на интерфейс (графический интерфейс).

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

Унифицированный язык моделирования (UML) может помочь моделировать системы различными способами. Одним из наиболее популярных типов в UML является диаграмма классов. Популярный среди разработчиков программного обеспечения для документирования архитектуры программного обеспечения, диаграммы классов – это тип структурной диаграммы, поскольку они описывают, что должно присутствовать в моделируемой системе.

UML был создан как стандартизованная модель для описания подхода объектно-ориентированного программирования. Поскольку классы являются строительным блоком объектов, диаграммы классов являются строительными блоками UML. Различные компоненты диаграммы классов могут представлять классы, которые будут фактически запрограммированы, основные объекты или взаимодействия между классами и объектами.

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

Диаграмма классов:

Рисунок 2. UML-диаграмма классов

Как можно видеть из диаграммы классов (рис. 2.), за симуляцию отвечает класс SimulationOfLife, за отображение симуляции класс DrawingLifePanel, за общую прорисовку MainGUI.

2. Реализация программного продукта


2.1 Используемые библиотеки

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

Библиотека классов выполняет три задачи в рамках платформы Java:

  • Как и другие стандартные библиотеки кода, они предоставляют программисту хорошо известный набор полезных функций, таких как классы контейнеров и обработка регулярных выражений.
  • Библиотека предоставляет абстрактный интерфейс для задач, которые обычно будут в значительной степени зависеть от оборудования и операционной системы, таких как доступ к сети и доступ к файлам.
  • Некоторые базовые платформы могут не поддерживать все функции, ожидаемые Java-приложением. В этих случаях реализация библиотеки может либо эмулировать эти функции, либо обеспечивать последовательный способ проверки наличия конкретной функции.

В приложении активно используется библиотека Swing. Swing – это набор инструментов для виджета GUI для Java. Он является частью Java-классов Oracle (JFC) - API для предоставления графического интерфейса пользователя (GUI) для Java-программ.

Swing был разработан для обеспечения более сложного набора графических компонентов, чем предыдущий абстрактный набор инструментов (AWT). Swing обеспечивает внешний вид, который эмулирует внешний вид нескольких платформ, а также поддерживает привлекательный внешний вид, который позволяет приложениям выглядеть и чувствовать себя несвязанными с базовой платформой. Он имеет более мощные и гибкие компоненты, чем AWT. В дополнение к знакомым компонентам, таким как кнопки, флажки и метки, Swing предоставляет несколько дополнительных компонентов, таких как панель с вкладками, полосы прокрутки, деревья, таблицы и списки.

В отличие от компонентов AWT компоненты Swing не реализуются с помощью кода, специфичного для платформы. Вместо этого они полностью написаны на Java и поэтому не зависят от платформы.

Все последующие библиотеки необходимы в трех случаях;

  • программная логика;
  • графическая визуализация;
  • вспомогательные функции.

В приложении используются следующие библиотеки:

  1. java.awt.Color – для задания цветовой гаммы клеткам;
  2. java.awt.Dimension – для задания размерности клеткам;
  3. java.awt.Graphics – для прорисовки клеток;
  4. java.awt.Insets – для внутренних отступов элементов GUI;
  5. java.awt.Toolkit – для вспомогательных действий;
  6. java.awt.event.MouseAdapter – для реализации работы мыши;
  7. java.awt.event.MouseEvent – для обработки событий мыши;
  8. java.util.Random – для генерации псевдослучайных чисел;
  9. javax.swing.JPanel – для создания панели симуляции;
  10. java.awt.* – все библиотеки компонента awt для работы с фреймом;
  11. importjava.awt.event.* – все библиотеки компонента awt.ewent для обработки событий на фрейме;
  12. importjava.awt.image.BufferedImage – для сохранения изображения текущей симуляции;
  13. java.io.File – для файловой работы.
  14. java.io.FileReader – для загрузки состояния симуляции;
  15. java.io.FileWriter – для сохранения текущей симуляции;
  16. java.io.IOException – для обработки исключительных ситуаций;
  17. java.util.Scanner – для консольного ввода;
  18. javax.imageio.ImageIO – для общей работы с изображениями;
  19. javax.swing.* – дополнительные библиотеки для GUI;
  20. javax.swing.event.* – дополнительные библиотеки для GUI;
  21. java.util.Arrays – для использования безразмерного массива.

2.2 Описание модели приложения

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

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

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

  1. последовательно определим новые состояния для клеток, которые не касаются границ поля;
  2. последовательно определим новые состояния для клеток, которые соприкасаются с границами поля;
  3. применим новые состояния, отобразив их на основной доске.

Новое состояние для клетки рассчитывается следующим образом:

  1. Если клетка мертва:
    1. Если живых соседей ровно три – оживить, иначе оставить мертвой;
  2. Если клетка жива:
    1. Если живых соседей два или три – оставить жить, иначе убить.

Программный код итерации приведен на рисунке 3.:

/**

* Итерациясимуляции

*/

publicvoid iterate() {

// обрабатываемклетки, некасающиесякраевполя

for (inty = 1; y<height - 1; y++) {

for (intx = 1; x<width - 1; x++) {

intj = y * width + x;

byten = countNeighbors(j);

sideBoard[j] = iterateCell(masterBoard[j], n);

}

}

// обрабатываемграничныеклетки

// верхняя и нижняястроки

for (intx = 0; x<width; x++) {

intj = width * (height - 1);

byten = countBorderNeighbors(x, 0);

sideBoard[x] = iterateCell(masterBoard[x], n);

n = countBorderNeighbors(x, height - 1);

sideBoard[x + j] = iterateCell(masterBoard[x + j], n);

}

// крайниелевыйиправыйстолбцы

for (inty = 1; y<height - 1; y++) {

intj = width * y;

byten = countBorderNeighbors(0, y);

sideBoard[j] = iterateCell(masterBoard[j], n);

n = countBorderNeighbors(width - 1, y);

sideBoard[j + width - 1] = iterateCell(masterBoard[j + width - 1], n);

}

// обмениваемполяместами

byte[] t = masterBoard;

masterBoard = sideBoard;

sideBoard = t;

}

Рисунок 3. Программный код итерации

Приведем программный код решения о новом состоянии клетки (рис. 4.):


/**

* Симуляциядляоднойклетки.

*

* @param self собственноесостояниеклетки: 0/1

* @param neighbors кол-вососедей

* @returnновоесостояниеклетки: 0/1

*/

privatebyte iterateCell(byteself, byteneighbors) {

return (byte) (self == 0 ? (neighbors == 3 ? 1 : 0) : neighbors == 2 || neighbors == 3 ? 1 : 0);

}

Рисунок 4. программный код решения о новом состоянии клетки

Приведем программный код подсчета соседей (рис. 5.):

/**

* Подсчетсоседей, которыенекасаютсякраевклеток.

*

* @param j смещениеклетки в массиве

* @returnкол-вососедей

*/

privatebyte countNeighbors(intj) {

byten = 0;

for (inti = 0; i< 8; i++) {

n += masterBoard[j + neighborOffsets[i]];

}

returnn;

}

/**

* Подсчетсоседейдляграничныхклеток.

*

*/

privatebyte countBorderNeighbors(intx, inty) {

byten = 0;

for (inti = 0; i< 8; i++) {

intbx = (x + neighborXYOffsets[i][0] + width) % width;

intby = (y + neighborXYOffsets[i][1] + height) % height;

n += masterBoard[by * width + bx];

}

returnn;

}

Рисунок 5. Программный код подсчета соседей

2.3. Описание панели приложения

Панель представляет собой область, на которой располагается прорисовки симуляции. Соответственно, панель предназначена для отображения системы (игры «Жизнь»).

У панели следующие характеристики:

  • задержка между перерисовыванием;
  • размер клетки;
  • толщина границы клетки;
  • цвет живой клетки;
  • цвет мертвой клетки.

Приведем программный код прорисовки панели (рис. 6.). Выполняется следующий алгоритм:

  1. Базовая прорисовка компонента;
  2. Перебор всех клеток в симуляции:
  3. Если клетка жива – присвоить ей случайный цвет, иначе присвоить ей пустой цвет.
  4. Прорисовать границу для клетки заданной толщины.

/**

* Прорисовкасодержимогопанели.

*/

@Overrideprotectedvoid paintComponent(Graphics g) {

if (life != null) {

synchronized (life) {

super.paintComponent(g);

Insets b = getInsets();

Random rand = new Random();

for (inty = 0; y<life.getHeight(); y++) {

for (intx = 0; x<life.getWidth(); x++) {

bytec = life.getCell(x, y);

//g.setColor(c == 1 ? colorLive : colorEmpty);

g.setColor(c == 1 ? new Color(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256)) : colorEmpty);

g.fillRect(b.left + cellBorder + x * (cellSize + cellBorder), b.top + cellBorder + y

* (cellSize + cellBorder), cellSize, cellSize);


}

}

}

}

}

Рисунок 6. Программный код прорисовки панели

Примерпанелисзаданнымсостоянием (рис. 7.):

Рисунок 7. Панель приложения

2.4. Описание формы приложения

Форма предназначена для взаимодействия с пользователем. Так, на форме располагаются следующие компоненты для взаимодействия:

  • панель для прорисовки симуляции;
  • слайдеры для изменения размера и скорости обновления;
  • кнопки загрузки/сохранения симуляции;
  • кнопка очистки поля;
  • кнопка запуска симуляции.

Панель с компонентами (рис. 8.):

Рисунок 8. Настраиваемые параметры приложения

Полный вид формы по время симуляции (рис. 9.):

Рисунок 9. Работающее приложение

3. Тестирование

3.1. Разработка плана тестирования

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

Однако, слабым местом в программе является загрузка из файла.

3.2. Тестирования приложение

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

Программа выдаст ошибку о не распознаваемости состояния системы.

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

3.3. Развертывание приложения