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

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

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

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

Добавлен: 12.03.2024

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

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

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

Приложение не требует дополнительных условий для развертывания. Обязательным условием для запуска является наличие JRE (специализированной программы, которое позволяет запускаться Java-программам).

ЗАКЛЮЧЕНИЕ

В современном мире, рынок разнообразных фреймворков, имеющих прямое отношение к мобильным устройствам, достаточно велик. Многие средства сливаются воедино, при этом имея разные технологические функции [2] Из всех существующих фреймворков можно вычеркнуть те, которые предназначены для разработки web-приложений, разнообразные enterprise-решения, средства прототипирования.

Создание приложений на мобильных устройствах развивается весьма активно, рынок мобильных приложений переполнен, разнообразен в разных сферах [1, 3, 5]. Большинство бизнесменов дают согласие на создание мобильных приложений для своего предприятия с целью совершенствования маркетинговой стратегии.

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

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

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

  1. Илюшечкин, В.М. Основы использования и проектирования баз данных: Учебник для академического бакалавриата / В.М. Илюшечкин. – Люберцы: Юрайт, 2016. – 213 c.
  2. Minakov V.F., Ilyina O.P., Lobanov O.S. Concept of the Cloud Information Space of Regional Government // Middle-East Journal of Scientific Research. – 2014. – № 21 (1). – P. 190-196
  3. Барабанова М.И., Воробьев В.П., Минаков В.Ф. Экономико-математическая модель динамики дохода отрасли связи России // Известия Санкт-Петербургского государственного экономического университета. – 2013. – № 4 (82). – С. 24–28.
  4. Венделева, М.А. Информационные технологии в управлении.: Учебное пособие для бакалавров / М.А. Венделева, Ю.В. Вертакова. – Люберцы: Юрайт, 2016. – 462 c.
  5. Гаврилов, М.В. Информатика и информационные технологии: Учебник для прикладного бакалавриата / М.В. Гаврилов, В.А. Климов. – Люберцы: Юрайт, 2016. – 383 c.
  6. Дарков, А.В. Информационные технологии: теоретические основы: Учебное пособие / А.В. Дарков, Н.Н. Шапошников. – СПб.: Лань, 2016. – 448 c.
  7. Згадзай, О.Э. Информационные технологии в юридической деятельности: Учебное пособие / О.Э. Згадзай и др. – М.: ЮНИТИ, 2016. – 335 c.
  8. Коноплева, И.А. Информационные технологии. / И.А. Коноплева, О.А. Хохлова, А.В. Денисов. – М.: Проспект, 2015. – 328 c.
  9. Корнеев, И.К. Информационные технологии в работе с документами: Учебник / И.К. Корнеев. – М.: Проспект, 2015. – 304 c.
  10. Макарчук Т.А., Минаков В.Ф., Щугорева В.А. Облачные решения построения информационных систем управления ресурсами организации // Международный научно-исследовательский журнал = Research Journal of International Studies. – 2014. – № 1-1 (20). – С. 68-69.
  11. Минаков В.Ф., Минакова Т.Е. Информационное общество и проблемы прикладной информатики // Международный научно-исследовательский журнал = Research Journal of International Studies. – 2014. – № 1-1 (20). – С. 69-70.
  12. Саати Т. Принятие решений. Метод анализа иерархий. М.: Радио и связь. – 1993. – 278 с.
  13. Савитч, Уолтер. Язык Java. Курс программирования / Уолтер Савитч. – М.: Вильямс, 2015. – 928 c.
  14. Хабибуллин, Ильдар. Самоучитель Java / Ильдар Хабибуллин. – М.: БХВ-Петербург, 2014. – 768 c.
  15. Шилдт, Герберт. Java 8. Руководство для начинающих / Герберт Шилдт. – М.: Вильямс, 2015. – 720 c.
  16. Эккель, Брюс. Философия Java / Брюс Эккель. – М.: Питер, 2016. – 809 c.

ПРИЛОЖЕНИЯ

Приложение 1

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

Приложение 2

Полный программный код с комментариями

package Game;

import java.util.Arrays;

publicclass SimulationOfLife {

/**

* Главнаядоска

*/

privatebyte[] masterBoard = null;

/**

* Доскадляперерисовывания

*/

privatebyte[] sideBoard = null;

/**

* Ширинаивысотадоски

*/

privateint width, height;

/**

* Направлениядляпоискаграничныхсоседей

*/

privateint[] neighborOffsets = null;

/**

* Направлениядляпоискасоседей

*/

privateint[][] neighborXYOffsets = null;

/**

* Конструктор

*

* @param width Ширина

* @param height Высота

*/

public SimulationOfLife(intwidth, intheight) {

this.width = width;

this.height = height;

masterBoard = newbyte[width * height];

sideBoard = newbyte[width * height];

neighborOffsets = newint[] {-width - 1, -width, -width + 1, -1, 1, width - 1, width, width + 1};

neighborXYOffsets = newint[][] { {-1, -1}, {0, -1}, {1, -1}, {-1, 0}, {1, 0}, {-1, 1}, {0, 1}, {1, 1}};

}

/**

* Получитьширину

*/

publicint getWidth() {

returnwidth;

}

/**

* Получитьвысоту

*/

publicint getHeight() {

returnheight;

}

/**

* Очиститьдоску

*/

publicvoid clear() {

Arrays.fill(masterBoard, (byte) 0);

}

/**

* Получитьзаданнуюклетку

*/

publicbyte getCell(intx, inty) {

returnmasterBoard[y * width + x];

}

/**

* Задатьвыбраннуюклетку

*/

publicvoid setCell(intx, inty, bytevalue) {

masterBoard[y * width + x] = value;

}

/**

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

*/

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;

}

/**

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

*

* @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;

}

/**

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

*

* @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);

}

}

package Game;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Insets;

import java.awt.Toolkit;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.util.Random;

import javax.swing.JPanel;

/**

* Панель для воспроизведения симуляции.

* Посредством зажатия левой кнопки клетки ставятся, правой убираются.

* Возможность редактирования доступна и во время симуляции.

*/

public class DrawingLifePanel extends JPanel implements Runnable {

/**

* Скоростьсимуляциипоумолчанию

*/

private static final int DEFAULT_UPDATE_DRAW = 36;

/**

* Размер клетки на панели по умолчанию

*/

private static final int DEFAULT_CELL_SIZE = 18;

/**

* Размер толщины стенки клетки по умолчанию

*/

private static final int DEFAULT_CELL_BORDER = 1;

/**

* Цвет пустой клетки по умолчанию

*/

private static final int DEFAULT_CELL_EMPTY = 0x505050;

/**

* Цвет живой клетки по умолчанию

*/

private static final int DEFAULT_CELL_LIVE = 0xFFFFFF;

/**

* Потоксимуляции

*/

private Thread simThread = null;

/**

* Модельсимуляции

*/

private SimulationOfLife life = null;

/**

* Задержка в мс между шагами симуляции

*/

private int updateForDraw = DEFAULT_UPDATE_DRAW;

/**

* Размерклеткинаэкране

*/

private int cellSize = DEFAULT_CELL_SIZE;

/**

* Промежутокмеждуклетками

*/

private int cellBorder = DEFAULT_CELL_BORDER;

/**

* Цветмертвойклетки

*/

private static final Color colorEmpty = new Color(DEFAULT_CELL_EMPTY);

/**

* Конструктор

*/

public DrawingLifePanel() {

setBackground(Color.BLACK);

// редакторполя

MouseAdapter ma = new MouseAdapter() {

private boolean pressedLeft = false; // нажаталеваякнопкамыши

private boolean pressedRight = false; // нажатаправаякнопкамыши


@Override public void mouseDragged(MouseEvent e) {

setCell(e);

}

@Override public void mousePressed(MouseEvent e) {

if (e.getButton() == MouseEvent.BUTTON1) {

pressedLeft = true;

pressedRight = false;

setCell(e);

} else if (e.getButton() == MouseEvent.BUTTON3) {

pressedLeft = false;

pressedRight = true;

setCell(e);

}

}

@Override public void mouseReleased(MouseEvent e) {

if (e.getButton() == MouseEvent.BUTTON1) {

pressedLeft = false;

} else if (e.getButton() == MouseEvent.BUTTON3) {

pressedRight = false;

}

}

/**

* Устанавливает/стирает клетку.

*

*/

private void setCell(MouseEvent e) {

if (life != null) {

synchronized (life) {

// рассчитываем координаты клетки, на которую указывает курсор мыши

int x = e.getX() / (cellSize + cellBorder);

int y = e.getY() / (cellSize + cellBorder);

if (x >= 0 && y >= 0 && x < life.getWidth() && y < life.getHeight()) {

if (pressedLeft == true) {

life.setCell(x, y, (byte) 1);

repaint();

}

if (pressedRight == true) {

life.setCell(x, y, (byte) 0);

repaint();

}

}

}

}

}

};

addMouseListener(ma);

addMouseMotionListener(ma);

}

/**

* Получитьмодельсимуляции

*/

public SimulationOfLife getLifeModel() {

return life;

}

/**

* Инициализациямодели

*/

public void initialize(int width, int height) {

life = new SimulationOfLife(width, height);

}

/**

* Установказадержкискоростисимуляции

*/

public void setUpdateDelay(int updateForDraw) {

this.updateForDraw = updateForDraw;

}

/**

* Установкаразмераклеток

*/

public void setCellSize(int cellSize) {

this.cellSize = cellSize;

repaint();

this.setSize(getPreferredSize());

}

/**

* Запусксимуляции

*/

public void startSimulation() {

if (simThread == null) {

simThread = new Thread(this);

simThread.start();

}

}

/**

* Остановкасимуляции

*/

public void stopSimulation() {

simThread = null;

}

/**

* Проверка воспроизведения симуляции

*/

public boolean isSimulating() {

return simThread != null;

}

@Override public void run() {

repaint();

while (simThread != null) {

try {

Thread.sleep(updateForDraw);

} catch (InterruptedException e) {}

// синхронизация используется для того, чтобы метод paintComponent не выводил на экран

// содержимое поля, которое в данный момент меняется

synchronized (life) {

life.iterate();

}

repaint();

}

repaint();

}

/**

* Возвращает размер панели с учетом размера поля и клеток.

*/

@Override public Dimension getPreferredSize() {

Dimension sSize = Toolkit.getDefaultToolkit ().getScreenSize ();Toolkit.getDefaultToolkit ().getScreenSize ();

return sSize;

}

/**

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

*/

@Override protected void paintComponent(Graphics g) {

if (life != null) {

synchronized (life) {

super.paintComponent(g);

Insets b = getInsets();

Random rand = new Random();

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

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

byte c = 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);

}

}

}

}


}

}

package Game;

import java.awt.*;

import java.awt.event.*;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

import java.util.Scanner;

import javax.imageio.ImageIO;

import javax.swing.*;

import javax.swing.event.*;

public class MainGUI extends JFrame {

/**

* Минимальныйразмердоски

*/

private static final int MIN_BOARD_SIZE = 15;

/**

* Максимальныйразмердоски

*/

private static final int MAX_BOARD_SIZE = 50;

/**

* Размердоскипоумолчанию

*/

private static final int DEF_BOARD_SIZE = 30;

/**

* Минимальная скорость обновления симуляции в мс

*/

private static final int MIN_UPDATE_MS = 1;

/**

* Максимальная скорость обновления симуляции в мс

*/

private static final int MAX_UPDATE_MS = 100;

/**

* Скорость обновления симуляции в мс по умолчанию

*/

private static final int DEF_UPDATE_MS = 80;

/**

* Панельдлярисования

*/

private DrawingLifePanel lifePanel = null;

/**

* КнопкаЗапусксимуляции

*/

private JButton btnStart = null;

/**

* КнопкаОстановкасимуляции

*/

private JButton btnStop = null;

/**

* КнопкаЗагрузкаизфайла

*/

private JButton btnLoadFromFile = null;

/**

* КнопкаСохранениевфайл

*/

private JButton btnSaveToFile = null;

/**

* СлайдерВремяобновления

*/

private JSlider sliderUpdate = null;

/**

* СлайдерРазмерполя

*/

private JSlider sliderSize = null;

/**

* ПанельИнструменты

*/

private JToolBar toolPanel = null;

/**

* Инициализация

*/

private void Initate() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setResizable(false);

lifePanel = new DrawingLifePanel();

lifePanel.initialize(DEF_BOARD_SIZE, DEF_BOARD_SIZE);

add(lifePanel);

sliderUpdate = new JSlider(MIN_UPDATE_MS, MAX_UPDATE_MS);

sliderUpdate.setValue(DEF_UPDATE_MS);

lifePanel.setUpdateDelay(sliderUpdate.getValue());

sliderSize = new JSlider(MIN_BOARD_SIZE, MAX_BOARD_SIZE);

sliderSize.setValue(DEF_BOARD_SIZE);

lifePanel.setUpdateDelay(sliderSize.getValue());

btnSaveToFile = new JButton("Сохранитьвфайл");

btnLoadFromFile = new JButton("Загрузитьизфайла");

toolPanel = new JToolBar();

toolPanel.setFloatable(false);

add(toolPanel, BorderLayout.NORTH);

toolPanel.addSeparator();

btnStart = new JButton("Запустить");

toolPanel.add(btnStart);

toolPanel.addSeparator();

btnStop = new JButton("Очиститьполе");

toolPanel.add(btnStop);

}

/**

* Добавление обработчиков событий

*/

private void AddListeners() {

sliderUpdate.addChangeListener(new ChangeListener() {

@Override public void stateChanged(ChangeEvent e) {

lifePanel.setUpdateDelay(sliderUpdate.getValue());

}

});

sliderSize.addChangeListener(new ChangeListener() {

@Override public void stateChanged(ChangeEvent e) {

lifePanel.initialize(sliderSize.getValue(), sliderSize.getValue());

lifePanel.getLifeModel().clear();

lifePanel.repaint();

}

});

btnStart.addActionListener(new ActionListener() {

@Override public void actionPerformed(ActionEvent e) {

if (lifePanel.isSimulating()) {

lifePanel.stopSimulation();

btnStart.setText("Запустить");

} else {

lifePanel.startSimulation();

btnStart.setText("Остановить");