» »

Разработка структурных и функциональных схем. Структурное проектирование программ. Разработка структуры программного обеспечения

21.12.2021

После ввода данных необходимо дать пользователю возможность распечатки бланка справки и копии клиента. данная операция должна быть выполнена в обязательном порядке. Печать может быть осуществлена на два типа принтеров: ударного действия (матричные) и струйные. Печать справки на лазерных принтерах невозможна из-за повышенных требований к качеству бумаги. При печати справки на матричном принтере можно осуществить печать двух экземпляров (справка+копия) за один проход с применением копировальной бумаги. На струйном принтере необходимо печатать каждый экземпляр отдельно. Таки м образом нужно предусмотреть изменяемый пользователем счетчик числа копий или специальную функцию настройки на тип принтера.

Рис.2 Схема взаимодействия и сязей данных

Разработка функциональной схемы программы.

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

Примерный перечень функций системы.

1) Регистрация обменной операции

· Ввод данных по покупке валюты

· Ввод данных по продаже валюты

· Ввод данных по конверсии валюты

· Печать справки клиента

2) Просмотр документов

· Просмотр списка документов дня

· Просмотр списка архивных документов

3) Ведение справочников

· Ввод данных по кодам ценностей

· Ввод данных по видам документов

· Ввод данных по кодам валют

· Ввод курсов валют по датам

4) Генерация отчетных документов

· Печать реестра наличной иностранной валюты, купленной за наличные рубли;

· Печать реестра наличной иностранной валюты, проданной за наличные рубли;

· Печать реестра по обмену (конверсии) наличной иностранной валюты;

5) Прочие функции

· Ввод данных в поле ввода из справочника

· Перевод числа из цифровой формы в строчную (сумма прописью)

· Изменение вида курсора

· Сохранение данных в архивных файлах

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

Разработка структурной схемы программы.

Структурная схема программного комплекса определяет в основных чертах и внешний вид проектируемой системы и принципы взаимодействия с пользователем. Схема проектируемой системы будет представлять собой иерархическую древовидную структуру, описывающую процедуры ввода, обработки и вывода данных. Построение программ информационно-справочного класса по такому принципу позволяет довольно легко производить модификацию системы в целом и облегчает восприятие и понимание принципа работы программы. Для построения структурной схемы необходимо определить иерархию и связь перечисленных выше процедур обработки данных. Естественно установить иерархию процедур в том виде, в каком они были описаны в предыдущей главе, поскольку таковая схема соответствует схеме «важности» и «употребимости» процедур. Структурная схема программы, с учетом всего вышеизложенного, представлена на рис 2.

Разработка экранного интерфейса программы

Существующие подходы к проектированию экранного интерфейса

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

Наиболее практичными и удобными с точки зрения пользователя можно считать системы, имеющие экранный интерфейс, построенный на основе системы всплывающих меню. Наиболее распространенными в настоящее время являются две идеологии (имеются в виду DOS-приложения), включающие в себя и определенную форму экранных окон и цветовую гамму и вид всплывающих списков. Это инструментальные Среды фирмы Borland, и операционная оболочка Norton, фирмы Symantec. Обе идеологии предусматривают определенное разбиение экранного пространства на области или зоны, предназначенные для конкретных информационных объектов и действий. Зоны могут быть в некоторой степени переконфигурированы по желанию пользователя: изменены размеры и положение на экране. Команды обработки данных вызываются из системы меню, присутствующего на экране постоянно (Borland), или вызываемого по функциональной клавише (Symantec).

И в том и в другом случае все команды системы распределены по функциональному признаку на группы и в главном меню присутствуют

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

Таким образом, создается система многоуровневого всплывающего меню. Применение такой идеологии обеспечивает удобство ориентировки в системе, имеющей достаточно сложное, многоуровневое меню с множеством выборов. Естественно, что увеличение вложенности и размеров списков выбора, должно иметь разумные границы, которые к счастью имеются в виде ограниченности экранного пространства монитора. В большинстве систем заложена также возможность настройки цветовой палитры по желанию пользователя. В операционной оболочке Norton предлагается выбор гаммы из нескольких стандартных вариантов, в системах фирмы Borland можно создать свою собственную цветовую гамму, вплоть до мельчайших деталей. Примерный вид некоторых экранных объектов приведен на рис.4,5.

Выбор идеологии экранного интерфейса

3. СТРУКТУРНАЯ СХЕМА ПРОГРАММЫ

Основные функции, которые необходимо реализовать в нашей программе, следуют из постановки и анализа задачи:

1)Отображение данных пользователя в виде таблицы и работа с ней.

2)Добавления и удаления типов объектов.

3)Графическое представление плана с возможностью масштабирования.

4)Работа с файлами и вывод результатов на печать.

5)Удобный пользовательский интерфейс.

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

Рис. 3.1. Функциональная структура программы.

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


4. ОСНОВНЫЕ АЛГОРИТМЫ

Основным является алгоритм построения изображения по данным из главной таблицы, реализованный в виде метода plandraw().

Ниже приведены его блок-схема и описание.

4.1 Описание алгоритма

Если не активирована вкладка, на которой находится наше изображение плана, мы ее активируем.

Подготавливаем таблицу расстояний, очистив ее от предыдущих записей.

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

С помощью свойства таблицы RecordCount находим количество строк в главной таблице.

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

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

Если номер маршрута равен нулю, тогда выполняется условие рисования координатной сетки – меридианов и параллелей. Сначала выполняется цикл рисования меридианов – мы проходим от 0 до 360 градусов с шагом, зависящим от степени увеличения (15, 6, 3, или 1 градусов), причем возле каждого меридиана подписывается соответствующий ему градус долготы (восточная долгота – со знаком "+", западная – со знаком "-"). Нулевой меридиан изображается черным цветом. Аналогичные действия осуществляются и в цикле рисования параллелей, единственное отличие – цикл проходит от 0 до 180 градусов. Со знаком "+" обозначается северная широта, со знаком "-" - южная.

Меняем толщину линии на 2, для изображения линий маршрутов.

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

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

Задаем цвет линии в зависимости от номера маршрута. И организуем цикл, рисующий линии.

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

Затем вычисляется расстояние между точками, находящимися на Земном шаре, проекции которых мы только что изобразили на нашей карте. Расстояния вычисляются в километрах, радиус Земли берется равным 6371км. Вычисление расстояния производится в том случае, если i не равно 0, те не первое прохождение по циклу. Это условие необходимо, так как мы используем координаты предыдущей точки, чтобы найти расстояние до текущей.

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

Рассматриваются три случая:

1)если точки находятся на одной долготе, угол определить просто - он будет равен разности между большим и меньшим значением широты.

2)если точки находятся на одинаковой широте, то тут его определение тоже не представляет сложности – он равен разности между большим и меньшим значением долготы, умноженной на поправку cos(f), где f – текущая широта.

3)если точки располагаются на разной широте и долготе, этот случай нахождения угла является более сложным. Рассмотрим его подробно.

Сначала находим разность долгот точек, как если бы они находились на одной широте, помножаем на поправку cos(f), и вычисляем линейное расстояние между ними по теореме косинусов (другие две стороны треугольника – радиусы Земли). Таким же образом рассчитываем расстояние между точками, как если бы они находились на одной долготе. Эти расстояния обозначим l1 и l2.

Теперь у нас есть прямоугольный треугольник с катетами l1, l2, гипотенузой которого является расстояние l3. Вычисляем ее по теореме Пифагора. Нашей целью является найти угол a. С помощью теоремы косинусов находим косинус этого угла. Вычислив по нему арккосинус, мы получаем угол! Ниже приводится поясняющий рисунок.


Рис. 4.1. Пояснение к расчету расстояния на различных широте и долготе.

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

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

Все упомянутые формулы даны в Приложении Д.

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

Также на карте отображаются тип объекта для данной точки, если флажок "показывать тип объекта" установлен.

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

После того, как все маршрут отрисованы, освобождаем память, отведенную под массивы индексов и координат.


4.2 Блок-схема алгоритма

Рис. 4.2. Блок-схема алгоритма рисования плана.


5. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ 5.1 Выбор среды разработки программы

Как уже говорилось в "Постановке задачи", для создания этой программы была выбрана среда разработки Borland C++Builder 5. Это решение обуславливается тем, что в ней процесс создания интерфейса не представляет труда даже для программиста, столкнувшегося с Builder’ом впервые, и там хорошо поставлена работа с базами данных и графикой, что как раз и нужно для разработки нашей программы.

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

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

5.2 Работа с таблицами

В качестве драйвера базы данных используем Paradox. Этот тип базы данных был выбран, во-первых, потому, что Builder имеет встроенные средства для работы с таблицами Paradox, такие как Borland Database Engine, а также с ним поставляется программа Database Desktop. Во-вторых, преимущество Paradox состоит еще и в том, что в качестве имени базы данных можно указывать путь к каталогу, где находится файл таблицы, причем все таблицы хранятся в отдельных файлах. В третьих, они занимают мало места и являются наиболее простыми из локальных таблиц. В-четвертых, именно таблицы Paradox позволяют создавать ключевые поля.

Чтобы обеспечить работу с таблицей мы установили на форме следующие компоненты:

Сетка DBGrid, с помощью которой мы можем вставлять, удалять, или редактировать данные в таблице, или просто отображать их.

Список DBComboBox, с помощью которого мы можем вставлять данные из таблицы объектов в текущую запись главной таблицы. Перед использованием этого списка его нужно заполнить значениями из таблицы объектов. Для этого при запуске программы проходим по всем ее записям и заносим их содержимое в поле Items этого списка.

Навигатор DBNavigator – с помощью него можно удалять, добавлять, редактировать записи в таблице, а также перемещаться по ним. Связываем его с сеткой, в которой будет отображаться наша таблица.

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

1)Active – показывает, активна ли таблица. Если попытаться обратиться к ней, если это свойство отключено, то программа выдаст ошибку "Cannot perform this operation on closed dataset". При тестировании все возможные ситуации, которые могли привести к этой ошибке, были отслежены и обработаны.

2)DatabaseName – имя базы данных, в качестве него берется путь к каталогу, из которого открыта или создана таблица.

3)TableName – имя таблицы - файл с расширением.db, в котором храниться таблица.

Все эти свойства меняются в процессе выполнения программы.

Компонент Table нужен нам для того, чтобы избавиться от конкретизации. Те мы можем под видом Table открыть любую конкретную таблицу, и изменить при этом только свойства Table, не затрагивая других компонентов. Например, при открытии таблицы мы закрываем и дезактивируем предыдущую, при этом имя базы данных и имя таблицы в свойствах компонента Table удаляются, и открываем и активируем новую, при открытии записав в DatabaseName и TableName новые имена каталога и файла. (См. методы TBOpenFileClick и TBCloseFileClick в Приложении А).

Компоненты DataSourse и Table располагаются на форме, но они видны только при работе с программой в Builder’е.

5.3 Работа с графикой

Для рисования плана мы используем компонент Image. Этот объект обладает двумя важными свойствами:

1)Picture – представляет собой объект класса TPicture, который является контейнером для графики любого вида. Т.е. этот компонент может хранить bitmap-графику, иконку или другой вид графики, определенный пользователем. В Picture как раз и находится наш рисунок. С его помощью мы сохраняем в файл полученный рисунок. (См Приложение А, метод TBSaveFileClick). Также следует учесть, что размер Picture и Image могут не совпадать. Об этой проблеме более подробно будет рассказано ниже.

2)Canvas – канва. Весь процесс рисования осуществляется именно на канве компонента Image. Canvas позволяет устанавливать параметры пера, кисти, шрифта, выполнять рисование таких объектов, как линии, прямоугольники, эллипсы, а также выводить текст.

В нашей программе мы используем рисование линий с помощью методов канвы MoveTo и LineTo, рисование точек с помощью Ellipse, а также вывод текста методом TextOut. (см. Приложение А, plandraw).

Т.е. канва позволяет нам работать с функциями Windows GDI, не обращаясь к ним непосредственно, что значительно упрощает работу с графикой.


5.4 Разработка интерфейса

Разработке интерфейса также следует уделить особое внимание, так как необходимо сделать его удобным для пользователя. Средства Builder"а позволяют легко реализовать интерфейс в стандартах Windows.

Основные элементы стандартного интерфейса Windows-программ:

1) Меню - обеспечивают простой путь для выполнения пользователями логически сгруппированных команд.

Главное меню создается с помощью компонента MainMenu, причем его очень удобно редактировать при создании программы, так как для проверки не нужно запускать ее - все его содержимое отображается уже на форме.

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

Панель инструментов реализуется с помощью компонента ToolBar, позволяющего быстро добавлять и размещать кнопки. Все кнопки инструмента на инструментальной панели имеют одинаковую ширину и высоту.

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

В соответствие со стандартом Windows, я создала на панели кнопки, соответствующие пунктам меню "Новый", "Открыть", "Сохранить", "Печать".

3) Кнопки – с их помощью пользователь запускает выполнение действия, приписанного этой кнопке.

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

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

К тому же на них можно сделать подписи, объясняющие их назначение, что тоже удобн.

Кнопка создается размещением на форме компонента Button. При разработке программы используется его свойство Caption – надпись на кнопке, а во время выполнения - свойство Enabled, чтобы сделать кнопку неактивной или наоборот активировать ее. (см. Приложение А, HideButtons() и ShowButtons()). Например, при открытии таблицы мы активируем кнопки рисования плана, а при закрытии – делаем их неактивными.

4) Выпадающие списки – применяются, чтобы пользователь мог выбрать элемент из списка. Это гораздо удобнее, чем вводить его вручную.

В данной программе поле со списком используется для внесения типа объекта в таблицу (DBComboBox, о нем говорилось выше), и для удаления типа объекта из таблицы объектов (ComboBox).

Отличие DBComboBox от ComboBox заключается в том, что первый связан с полем таблицы, а второй является простым списком. Использование простого списка ComboBox позволяет решить проблемы взаимодействия с таблицей и DBComboBox, которые возникают при удалении объекта из таблицы.

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

6) Флажки (переключатели) – определяют, включена или нет представляемая ими опция.

В Builder’e это компонент CheckBox.

В программе флажки определяют включение или выключение следующих возможностей:

Рисование линий маршрутов;

Отображение расстояния на плане;

Отображение типа объекта на плане;

Показать таблицу расстояний.

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

7) Вкладки – в данной программе таблица и рисунок плана располагаются на разных вкладках. Я считаю, что так для пользователя будет удобнее, так как вся программа содержится в одном окне, и при этом и область таблицы, и область рисунка располагаются не в ущерб друг другу.

В Builder есть два типа вкладок: TabControl и PageControl.

В программе используется PageControl, так как в отличие от первого, этот компонент может содержать на вкладках разнородные элементы управления. У TabControl все страницы одинаковы.

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

Все необходимые диалоги размещаются на форме, но для пользователя остаются невидимыми. Они вызываются программой и реализуют стандартный интерфейс Explorer’а.

С помощью диалогов OpenDialog и SaveDialog программа получает имя файла и каталога, который выбирает пользователь. С помощью диалога печати PrintDialog вызываются настройки печати. А ColorDialog помогает выбрать цвет (он используется для выбора цвета фона рисунка).

Назначение каждого видимого для пользователя компонента интерфейса описано в руководстве пользователя.

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

Использование свойства Align удобно тем, что уж на этапе проектирования можно расположить компоненты так, как нужно, и чтобы потом не задавать вручную их размеры при каждом изменении формы.

5.5 Некоторые особенности алгоритмов

Алгоритм рисования

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

Этот вид проекции был выбран потому, что для него проще всего осуществить рисование координатной сетки, так как она состоит из прямых линий. (Более подробно о картографических проекциях и координатной сетке см. Приложение Е.)

Расстояния же рассчитываются в реальных размерах.

Алгоритм расчета расстояния.

О нем также подробно рассказывается в "Описании алгоритма". Он является частью алгоритма рисования.

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

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

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

Создание таблицы

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

Но все-таки этот алгоритм был найден в помощи Builder’а, хотя там он содержал ошибки.

В программе же представлен его рабочий пример (см. Приложение А, TBNewFileClick).

В качестве особенности этого алгоритма следует отметить то, что до того, как вызвать процедуру создания таблицы CreateTable(), нужно проинициализировать все поля, указав их название, тип, длину (если требуется), и требуемость значения (те обязательно его наличие или нет). После инициализации полей объявляем ключевое поле, и только потом вызываем процедуру создания таблицы. После этого необходимо привязать новую таблицу к компоненту Table, чтобы можно было с ней работать с помощью сетки и навигатора. Имя файла новой таблицы запрашивается с помощью SaveDialog.

Проблема размера графики

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

Причиной было то, что размер компонента Image все-таки изменялся, а вот размер картинки Picture оставался прежним. В связи с этим была создана процедура ResizeForm (см. Приложение А), которая реагировала на изменение размеров формы и менял размер картинки в соответствии с изменившимся размером компонента Image.

5.6 Тестирование

В течение всего времени проектирования программы выполнялись ее тестирования и отладка. Особое внимание уделялось двум моментам – правильности работы с таблицами и правильности рисования плана.

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

Еще одной важной ошибкой, которая была устранена – проблема размера графики (см. выше).

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

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

1) при компиляции программы необходимо включить в нее все используемые библиотеки. Это достигается с помощью отключения двух опций в настройках компилятора. Исполняемый код программы при этом становится больше, но зато она сможет работать и на машине без Builder’а.

2) для работы программы требуется Borland Database Engine. Если его нет на компьютере, его необходимо установить.


6. ОПИСАНИЕ ПРОГРАММЫ

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

Программа создана для операционной системы Windows, и обладает стандартизованным под нее и удобным для пользователя интерфейсом. Вместе с ней поставляется пример в виде таблицы с маршрутами поездов.


7. ИНСТРУКЦИЯ ПО УСТАНОВКЕ

Для установки программы должны быть выполнены требования: процессор 233МГц и выше, оперативная память от 16Мб, ОС Windows98 и выше.

Чтобы установить программу, необходимо проделать следующие действия:

1) Создать новую папку для программы.

2) С носителя, на котором находится архив программы (дискета или диск), скопировать его в эту папку.

3) Распаковать архив в эту папку.

4) Убедитесь, что фалы objects.db и rasst.db находятся в той же папке, что и программа.

5) Убедитесь, что у этих файлов снят атрибут "Только чтение". Если нет, снимите его.

6) Распакуйте архив с библиотеками в папку Windows.

7) Теперь можно запустить программу и пользоваться ею.


8. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ 8.1 Главное меню Меню "Файл"

Для того, чтобы начать работу в программе, необходимо открыть файл с таблицей или создать новый. Это можно выполнить с помощью пунктов меню "Файл" "Открыть" и "Новый".

"Открыть" - открыть уже существующую таблицу. Вызывает диалог, а котором пользователь должен выбрать файл с расширением.db.

"Новый" - создание новой таблицы. Вызывается диалог, в котором пользователь задает имя новой таблицы.

"Печать" - в зависимости от открытой вкладки печатает рисунок или таблицу. При выборе этого пункта открывается диалоговое окно настройки печати, после нажатия кнопки "ОК", задание отправляется на печать.

Меню "Таблица"

"Построить план" - если таблица открыта, активирует вкладку "План" и рисует план.

"Добавить тип объекта" - вызывает форму добавления типа объекта.

"Удалить тип объекта" - вызывает форму удаления типа объекта.

Меню "Помощь"

"О программе" - выводит название программы и сведения об авторе.


8.2 Панель быстрых кнопок

Действия этих кнопок аналогичны одноименным пунктам меню "Файл".

- "Новый" - создание новой таблицы.

- "Открыть" - открыть уже существующую таблицу.

- "Печать" - вывести на печать рисунок или таблицу.

8.3 Вкладка "Таблица"

Сетка таблицы – в нее загружается таблица. С помощью этой сетки пользователь может редактировать и просматривать записи таблицы.

Навигатор – располагается под сеткой, позволяет редактировать и просматривать таблицу.

Кнопки навигатора

- "Первая запись" - выполняет переход на первую запись в таблице.

- "Предыдущая запись" - выполняет переход на предыдущую запись в таблице.

- "Следующая запись" - выполняет переход на следующую запись в таблице.

- "Последняя запись" - выполняет переход на последнюю запись в таблице.

- "Добавить запись" - таблица переводится в режим редактирования, перед активной записью вставляется новая пустая запись.

- "Удалить запись" - удаляет текущую запись, предварительно запросив подтверждение.

- "Редактировать" - редактирование текущей записи.

- "Отменить изменения" - отменяет изменения текущей записи, возвращая ее предыдущее значение.

- "Обновить". Обновляет таблицу в сетке.

Под навигатором находятся Список объектов и кнопки удаления и добавления объектов.

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

Добавить тип объекта – вызывает форму добавления типа. При его добавлении он тут же заносится в список.

Удалить тип объекта – вызывает форму удаления типа объекта.

Форма добавления типа объекта

Содержит поле редактирования для ввода текста, в которое заносится название нового типа.

"Добавить" - добавляет тип объекта к списку и в таблицу, не закрывая форму.

"Ок" - если объект не был добавлен, заносит его в список и таблицу, и закрывает форму.

"Отмена" - закрывает форм без добавления.

Форма удаления типа объекта

Список объектов – из него пользователь выбирает, какой объект нужно удалить.

"Удалить" - удаляет выбранный тип объекта из таблицы и списка.

"Удалить все" - полностью очищает таблицу объектов и списки.

"ОК" - закрывает форму.


8.4 Вкладка "План"

Поле рисунка – область, на которую выводится рисунок плана.

Полосы прокрутки – появляются при увеличении изображения нажатием на кнопку "Увеличить". Позволяют прокручивать увеличенное изображение.

Таблица расстояний – показывает для каждого маршрута его номер и длины отрезков, в километрах. Таблица видима, если снят флажок "Скрыть таблицу расстояний".

"Очистка карты" - очищает поле рисунка.

"Нарисовать" - рисует план.

"Цвет фона" - позволяет выбрать цвет фона рисунка. При нажатии на эту кнопку выводится диалоговое окно выбора цвета.

"+ Увеличить" - увеличивает изображение на плане.

"- Уменьшить" - уменьшение изображения на плане. Эта кнопка становиться активной при нажатии кнопки увеличения.

"По умолчанию" - устанавливает изначальный размер изображения.

"Рисовать линии маршрутов" - если он установлен, на плане будут рисоваться маршруты, если нет – будут обозначаться только точки.

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

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

"Скрыть таблицу расстояний" - если флажок установлен, таблица расстояний невидима. Если снят, таблица появится справа от поля рисунка.

Все флажки по умолчанию установлены.


9. КОНТРОЛЬНЫЙ ПРИМЕР

В качестве контрольного примера изобразим маршруты нескольких поездов Горьковской железной дороги.

Возьмем следующие поезда:

N 497Г Горький-Моск - Адлер

N 471Г Горький-Моск - Новороссийск

N 431Г Горький-Моск - Адлер

N 367Г Горький-Моск - Самара

N 059A Горький-Моск - Санкт-Петербург-Главн

N 039Г Горький-Моск - Москва Курская

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

Рис. 9.1. Общий вид программы на вкладке "Таблица", ввод в запись названия объекта с помощью списка.


Ранее мы занесли в таблицу объектов станцию Красный Узел, но так как она нам не понадобиться, мы ее удалим.

Рис. 9.2. Удаление типа объекта.

При наборе маршрута поезда 431 нам понадобиться Владимир. Так как его нет в списке, нужно его добавить.

Рис. 9.3. Добавление типа объекта.


Итак, мы набрали все маршруты, какие хотели. В итоге у нас получилась такая таблица.

Рис. 9.4. Таблица

Теперь по нашей табличке построим план.

Рис. 9.5. Изображение плана со всеми надписями.


По умолчанию у нас отображаются и линии, и расстояния, и названия городов.

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

Рис. 9.6. Изображение плана без всех надписей.

Теперь посмотрим только расстояния.

Рис. 9.7. Изображение плана только с расстояниями.


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

Теперь посмотрим наш план только с названиями городов.

Рис. 9.8. Изображение плана с выводом только типов объектов.

Рис. 9.9. Изображение плана в виде точек со всеми подписями.


Можно посмотреть и таблицу расстояний.

Рис. 9.11. Общий вид программы на вкладке "План" с видимой таблицей расстояний.


ЗАКЛЮЧЕНИЕ

Задача, поставленная в задании бакалаврской работы, была успешно выполнена. Разработанная программа полностью удовлетворяет начальным условиям, описанным в постановке задачи. В частности в программе были реализованы работа с таблицами, графикой и файлами.

Работа пользователя программы осуществляется с помощью несложного интерфейса, выполненного по стандартам интерфейса программ Windows.

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


СПИСОК ЛИТЕРАТУРЫ

1. П. Густавсон, М. Кэшмэн, Б. Сворт, Дж. Холингворт. Borland C++ Builder 6. Руководство разработчика. – Вильямс, 2004.

2. А. Архангельский. Программирование в C++ Builder 6. – Бином, 2002.

3. Т.А. Павловская. С/С++. Программирование на языке высокого уровня. – Питер, 2001.


ПРИЛОЖЕНИЕ ПРИЛОЖЕНИЕ Е. Картографические проекции и координатная сетка

Сферическую поверхность развернуть на плоскости без разрывов и складок невозможно, то есть ее плановое изображение на плоскости нельзя представить без искажений, с полным геометрическим подобием всех ее очертаний. Полного подобия спроектированных на уровненную поверхность очертаний островов, материков и различных объектов можно добиться лишь на шаре (глобусе). Изображение поверхности Земли на шаре (глобусе) обладает равномасштабностью, равноугольностью и равновеликостью.

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

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

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

Равноугольные, сохраняющие равенство углов, между направлениями на карте и в натуре. На рис.Е.1 показана карта мира, на которой картографическая сетка сохраняет свойство равноугольности. На карте сохранено подобие углов, но искажены размеры площадей. Например, площади Гренландии и Африки на карте почти одинаковы, а в действительности площадь Африки примерно в 15 раз больше площади Гренландии.

Рис.Е.1 Карта мира в равноугольной проекции.

Равновеликие, сохраняющие пропорциональность площадей на карте соответствующим площадям на земном эллипсоиде. На рис Е.2 показана карта мира, составленная в равновеликой проекции. На ней сохранена пропорциональность всех площадей, но искажено подобие фигур, то есть отсутствует равноугольность. Взаимная перпендикулярность меридианов и параллелей на такой карте сохраняется только по среднему меридиану.

Равнопромежуточные, сохраняющие постоянство масштаба по какому-либо направлению;

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


Рис. Е. 2 Карта мира в равновеликой проекции.

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

Личных подсобных хозяйств Агинского Бурятского автономного округа на 2005 - 2010 гг.», который подготовлен в проектом варианте. 4. Основные направления совершенствования деятельности органов государственного управления по поддержке личных подсобных хозяйств сельского населения в Агинском Бурятском автономном округе 4.1 Проблемы и приоритеты развития личных подсобных хозяйств в Агинском...

Изучения семей привели к разработке таких психологических, педагогических, социологических методов, которые углубляют и расширяют представления о современной семье. ГЛАВА 3. СОЦИАЛЬНЫЕ ПРОБЛЕМЫ И ПЕРСПЕКТИВЫ СОЦИАЛЬНОЙ РАБОТЫ С МОЛОДЫМИ СЕМЬЯМИ СЕЛА ВОРОНОВКА 3.1 Общая характеристика с. Вороновка Шегарского района Томской области Шегарский район расположен в южной части Томской...




Положения и поддержку детей; - в настоящее время в России разработан и реализован механизм финансирования целевых программ по поддержке материнства и детства. 2. Финансовый механизм реализации государственной политики по поддержке материнства и детства 2.1 Порядок и условия выплаты социальных пособий К настоящему времени в России сложилась достаточно развитая система пособий, ...


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

  • неправильный выбор архитектуры ведет к риску срыва всего проекта в будущем;

  • данный этап является базовым для всего процесса разработки;

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

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

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

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

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

Пользовательский интерфейс часто проектируется на этапе выработки требований. Если это не так, его следует определить на этапе разработки архитектуры. Архитектура должна описывать главные элементы формата web-страниц, графического интерфейса (GUI) и т.д. Удобство интерфейса может в итоге определить популярность или провал программы.

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

Программу обработки анкет опроса студентов можно условно разделить на две части с разными функциями и уровнем доступа для пользователей:


  • система проведения анкетирования студентов;

  • система обработки результатов анкетирования;

  • система управления.
Все части связаны в единую программу общей базой данных.



Рисунок 2.1. - Структура системы


Система анкетирования содержит следующие функции:

  • выдачи вопроса из анкеты;

  • автоматической проверки типа и корректности вводимых данных;

  • сохранения данных в базу данных.
Система обработки результатов анкетирования позволяет:

  • выводить на экран или распечатывать отчёты по проведению анкетирования;

  • просматривать информацию о проведении анкетирования конкретного студента;

  • сравнивать результаты текущего и предыдущих анкетирований с этими же вопросами.
Система управления позволяет:

  • контролировать проведение анкетирования;

  • управлять данными – добавлять, удалять и изменять;
В свою очередь каждую из систем можно разделить на две подсистемы исходя из среды, в которой они выполняются:

  • cерверная часть, написанная на языке программирования PHP и выполняющаяся на сервере;

  • клиентская часть, написанная на языке разметки HTML и языке программирования JavaScript с использованием библиотеки jQuery и выполняющаяся в браузере пользователя.
С
ерверная часть программы по своей структуре соответствует архитектуре MVC (Model-View-Controller) или модель-представление-контроллер. MVC представляет собой архитектуру программного обеспечения, в которой модель данных приложения, пользовательский интерфейс и управляющая логика разделены на три отдельных компонента, так, что модификация одного из компонентов оказывает минимальное воздействие на другие компоненты.
Рисунок 2.2. – Архитектура «Модель-Представление-Контроллер»
Такой подход позволяет разделить данные, представление и обработку действий пользователя на три отдельных компонента.

  • Model (Модель) - модуль, отвечающий за непосредственный расчёт чего-либо на основе полученных от пользователя данных. Результат, полученный этим модулем, должен быть передан в контроллер, и не должен содержать ничего, относящегося к непосредственному выводу (то есть должен быть представлен во внутреннем формате системы). Основная цель - сделать так, чтобы модель была полностью независима от остальных частей и практически ничего не знала об их существовании, что позволило бы менять и контроллер и представление модели, не трогая саму модель и даже позволить функционирование нескольких экземпляров представлений и контроллеров с одной моделью одновременно. В следствие этого модель ни при каких условиях не может содержать ссылок на объекты представления или контроллера.

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

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

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

  • прозрачность системы;

  • единая точка входа в систему;

  • повторное использование кода;;

  • быстрая разработка;

  • наличие готовых решений;

  • простота поддержки;

  • лёгкое внесение изменений.
Таким образом, использование архитектуры MVC даёт ощутимые преимущества при проектировании и разработке программы обработки анкет опроса студентов кафедры, что положительно влияет как на скорость самой разработки, так и на качество конечного результата.

2.Разработка структуры базы данных программы

Организация структуры БД формируется исходя из следующих соображений:

  • адекватность описываемому объекту - на уровне концептуальной и логической модели;

  • удобство использования для ведения учёта и анализа данных - на уровне так называемой физической модели.
По модели представления данных в качестве основных выделяют иерархическую, сетевую и реляционную модели, соответственно для работы с каждой из вышеперечисленных баз данных используют свою СУБД.

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

Структурный аспект - данные в базе данных представляют собой набор отношений.

Аспект целостности - отношения отвечают определенным условиям целостности.

Аспект обработки - поддерживаются операторы манипулирования отношениями.

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

В качестве СУБД была выбрана свободная система управления базами данных MySQL. Гибкость СУБД MySQL обеспечивается поддержкой большого количества типов таблиц: пользователи могут выбрать как таблицы типа MyISAM, поддерживающие полнотекстовый поиск, так и таблицы InnoDB, поддерживающие транзакции на уровне отдельных записей. Благодаря открытой архитектуре и GPL-лицензированию (GNU General Public License - лицензия на свободное программное обеспечение, цель которой предоставить пользователю права копировать, модифицировать и распространять программы, а также гарантировать, что и пользователи всех производных программ получат вышеперечисленные права), в СУБД MySQL постоянно появляются новые типы таблиц.

Важным достоинством СУБД MySQL является то, что она портирована на большое количество платформ, таких как AIX, FreeBSD, HP-UX, GNU/Linux, Mac OS X, NetBSD, OpenBSD, Solaris и Windows. Отметим, что компания MySQL AB предоставляет для свободной загрузки не только исходные коды СУБД, но и откомпилированные и оптимизированные под конкретные операционные системы готовые исполняемые модули.

MySQL имеет интерфейс прикладного программирования (API) для таких языков, как Delphi, C, C++, Java, Perl, PHP, Python и Ruby, библиотеки для языков платформы.NET, а также обеспечивает поддержку для ODBC посредством ODBC-драйвера (Open DataBase Connectivity - это программный интерфейс доступа к базам данных) MyODBC.

Основным типом таблиц был выбран тип MyISAM. MyISAM-таблицы идеально оптимизированы для использования в связке с web-приложениями, где преобладают запросы на чтение. Таблицы типа MyISAM показывают очень хорошие результаты производительности при выборках SELECT. Во многом это связано с отсутствием поддержки транзакций и внешних ключей. Однако при модификации и добавлении записей вся таблица кратковременно блокируется, что может привести к серьёзным задержкам при большой загрузке. Но в случае с программой анализа анкет опроса это не является серьёзной проблемой, так как высокая нагрузка на систему не планируется.

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

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

Структура базы данных представлена на рисунке 2.4.

Р

исунок 2.3. – Структура базы данных


Организованные в базе данных связи между таблицами позволяют выполнять каскадное удаление и обновление данных. Использование развязочных таблиц позволило сократить избыточность данных до минимума.

Таблица it_students содержит данные о студентах, прошедших анкетирование.

Таблица 2.1 – Таблица данных «it_students»


Поле

Тип

Длина

Описание

id

Числовой

11

Индекс

num

Числовой

11

Номер студенческого билета

name

Символьный

100

Имя

second_name

Символьный

100

Отчество

surname

Символьный

100

Фамилия

birth

дата

-

Дата рождения

year_postupl

год

-

Год поступления

address

Символьный

500

Адрес

phone_h

Символьный

15

Домашний телефон

phone_m

Символьный

15

Мобильный телефон

mail

Символьный

250

Адрес e-mail

icq

Числовой

10

Номер ICQ

Таблица it_answers_var содержит варианты ответов на вопросы анкетирования.

Таблица 2.2 – Таблица данных «it_answers_var»

Таблица it_questions содержит вопросы анкетирования.

Таблица 2.3 – Таблица данных «it_questions»

Таблица it_tests_cfg делает привязку вопросов анкетирования к конкретной анкете.

Таблица 2.4 – Таблица данных «it_tests_cfg»

Таблица it_tests содержит данные обо всех анкетах и датах проведения анкетирований.

Таблица 2.5 – Таблица данных «it_tests»

Таблица it_text_answers содержит данные об ответах студентов, вводимых вручную.

Таблица 2.6 – Таблица данных «it_text_answers»

Таблица it_students_answers содержит данные об ответах студентов.

Таблица 2.6 – Таблица данных «it_students_answers»

3.Разработка модели информационных потоков базы данных

Поскольку программа анализа анкет опроса студентов построена по принципу MVC, то можно представить информационные потоки следующим образом. При поступлении запроса от пользователя, который отсылает браузер Web-серверу, контроллер, следуя запрограммированным алгоритмам квалифицирует полученный запрос, изменяет и передаёт его в модель. Модель, являющаяся связующим звеном между контроллером и СУБД, интерпретирует запрос и делает соответствующее обращение к СУБД MySQL, возвращая результаты контроллеру.

Примечательно, что для контроллера остаётся скрытым то, с каким типом или реализацией СУБД он работает, все обращения к БД происходят посредствам модели, основной задачей который и является абстрагирование работы с данными. Вместо базы данных можно даже использовать текстовый или XML файл, для контроллера это не будет иметь значения. Параллельно контроллер отправляет запрос компоненту представление, который компонует конечный шаблон и возвращает контроллеру. Так же возможен вариант, когда обмен данными происходит напрямую между моделью и представлением. Контроллер объединяет выборку из базы данных и шаблон представления и передаёт браузеру пользователя.



Рисунок 2.4. - Схема информационных потоков архитектуры МVС

4.Разработка алгоритмического обеспечения

Алгоритмическое обеспечение всех компонентов программы имеет значительные отличия, поскольку они несут различный функционал.

При первом входе студента в систему анкетирования создаётся новый идентификатор сессии. Сессия или session, позволяет серверу определить пользователя с помощью специального номера, который уникален и назначается при работе пользователя с сервером. Кроме того, сессии позволяют связывать переменные с этим пользователем и хранить эти переменные на сервере. Другими словами сессии позволяют делать переменные глобальными для всех компонентов программы. Таким образом, система анкетирования может однозначно определить, от кого из пользователей, работающих с программой, пришли те или иные данные.

Д
алее студент отвечает на ряд вопросов анкетирования и только по окончании опроса все данные сохраняются в базе данных. Алгоритм работы системы анкетирования показан на рисунке 2.5.

Рисунок 2.5. – Алгоритм работы системы анкетирования

Одним из важнейших пунктов безопасности web-приложения является проверка всех поступающих данных, поэтому стоит всегда проверять данные, вводимые пользователем в формы поиска, заполнения полей регистрации и так далее на наличие «опасных» данных. Это может быть вредоносный JavaScript код, PHP или PERL команды, а так же (что самое опасное) - команды серверу.

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


  • анализ переменных и суперглобальных массивов POST и GET;

  • разделение переменных;

  • фильтрация строковых переменных.
Обязательно надо проверять входящие переменные в самом начале программы, не допуская до работы с функциями и запросами к базе данных ещё не проверенные, потенциально опасные, данные от пользователей. Таким образом, все необходимые для защиты функции будут находиться в одном определённом месте или даже файле. В случае с программой обработки анкет опроса студентов фильтрация данных производится на уровне фреймворка CodeIgniter в автоматическом режиме, поскольку в файле конфигурации включена строка $config["global_xss_filtering"] = TRUE.

Абсолютно каждая переменная в программе должна на стадии проектирования уже иметь свой тип, будь это число или строка. Особенно остро эта проблема стоит для языков программирования со слабой или отсутствующей типизацией, к которым относятся PHP и JavaScript. Поэтому в наиболее критичных участках программы происходит проверка переменных на соответствие типов.

Особо опасны текстовые переменные, например поле для ввода ответа на вопрос анкеты. Их просто необходимо проверять на наличие вредоносного кода. Для устранения опасности производится удаление некоторых элементов из текста или замена на другие символы. Алгоритм обработки входящих данных в фреймворке CodeIgniter показан на рисунке 2.6.

Р
исунок 2.6. – Алгоритм обработки входящих данных в фреймворке CodeIgniter

2.5 Разработка интерфейса программы

Одним из важнейших вопросов разработки программной системы является разработка пользовательского интерфейса. Любая система, использующая при своем функционировании технические средства, относится к классу систем «человек - машина». Правильно будет выдвинуть следующие требования к интерфейсу систем тестирования:


  • интерфейс должен быть понятен, прост и удобен в использовании

  • пользователь не должен отвлекаться на действия, не связанные с выполняемым заданием.
Интерфейс пользователя выполнен на языке разметки HTML с использованием JavaScript и библиотеки jQuery, что позволило построить интерактивный пользовательский интерфейс программы.

К

примеру, текстовое поле для ввода даты с использованием jQuery было преобразовано в компактный календарь, обладающий функцией автоматической проверки корректности ввода даты (см. рисунок 2.7).

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

опросов показан на рисунке 2.8.

Рисунок 2.8. – Интерфейс ответа на вопрос анкетирования


В случае, если студент по какой-то причине не выберет ни один из ответов на вопрос, но попытается перейти к следующему вопросу, система анкетирования автоматически выведет сообщение об ошибке и предложит ещё раз ответить на текущий вопрос (см. рисунок 2.9).

Рисунок 2.9. - Сообщение об ошибке ввода данных



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

Рисунок 2.10. – Интерфейс вывода результатов анкетирования



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

Существенным преимуществом построения Web-приложений для поддержки стандартных функций браузера заключается в том, что функции должны выполняться независимо от операционной системы данного клиента. Вместо того чтобы писать различные версии для Microsoft Windows, Mac OS X, GNU/Linux и других операционных систем, приложение создается один раз и разворачивается на любой платформе.

3. Технологический раздел

3.1 Технология разработки программы

3.1.1 Основы работы web-сервера

Принцип работы web-сервера: известно, что web-серверы хранят информацию в виде текстовых файлов, называемых также страницами. Помимо текста, такие страницы могут содержать ссылки на другие страницы (расположенные на том же самом или другом сервере), ссылки на графические изображения, аудио- и видеоинформацию, различные объекты ввода данных (поля, кнопки, формы и т. д.), а также другие объекты и исполняемые на сервере программы. Фактически страницы представляют собой некоторое связующее звено между объектами различных типов. Их проектируют с применением специального языка разметки гипертекстов HyperText Markup Language, или сокращенно - HTML. Для доступа к информации, расположенной на web-серверах пользователи применяют специальные клиентские программы - браузеры. В настоящее время существуют десятки различных браузеров, но наибольшей популярностью на данный момент пользуются лишь несколько из них:


  • Microsoft Internet Explorer;

  • Opera;

  • Mozilla Firefox

  • Google Chrome.
Каждая страница web-сервера имеет свой так называемый универсальный адрес ресурса - Universal Resource Locator (URL). Чтобы получить доступ к той или иной странице, пользователь должен указать ее адрес URL браузеру. Как правило, любой web-сервер имеет одну главную страницу, содержащую ссылки на все остальные страницы этого сервера. Поэтому просмотр содержимого сервера Web обычно начинается с его главной (индексной) страницы.

3.1.2 Пассивные и активные web-серверы

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


3.1.3 Объектно-ориентированный подход

В настоящее время всё большую популярность набирает использование объектно-ориентированного подхода при разработке web-приложений. И хотя преимущества такого подхода не так очевидны, как, например, в таких языках программирования, как C++ или Java, но всё большее количество свободно распространяемых библиотек и программ, написанных на языке программирования PHP, переходят на объектно-ориентированный интерфейс. Этим они вынуждают использующих их разработчиков обращаться к объектно-ориентированным возможностям PHP. Введение в пятой версии интерпретатора PHP полноценной поддержки объектно-ориентированной модели ещё больше подогревает интерес к этой методологии.

Зачастую использование объектно-ориентированного подхода к месту и не к месту делает проект успешным. Программирование новичка в стиле объектно-ориентированного программирования часто напоминает передвижение по минному полю – если не знать где мины, достичь конца проекта невозможно. Само по себе объектно-ориентированное программирование не является панацеей – это рабочая технология, которая позволяет:


  • увеличить процент повторно используемого исходного кода;

  • оперировать при программировании понятиями и объектами реального мира (студент, группа, курс и т.д.), а не низкоуровневыми компьютерными терминами (файл, строка и т.д.), что позволяет создавать более крупные проекты с меньшим количеством ошибок и в более сжатые сроки.
Развитие технологий программирования, как заметил Дейкстра, диктуется тезисом «Разделяй и властвуй». Любые удачные технологии предполагают, что чем короче исходный код программы, тем легче его создавать, отлаживать и поддерживать, а простая программа подвержена ошибкам в гораздо меньшей степени, чем сложная.

На заре компьютерной эпохи программа представлялаы собой один поток, который обрабатывал один массив данных. Со временем сложность программ и предъявляемых к ним требований возросли, и такой способ организации данных оказался неприемлемым. Был предложен структурный подход, при котором массив данных становился доступен из любой точки программы, однако основной поток программы разбивался на несколько процедур. Отдельную небольшую процедуру, пусть даже использующую общие данные, разрабатывать гораздо проще, чем большой объём исходного кода.

Каждая из процедур обладает локальными переменным, срок жизни которой определяется продолжительностью работы процедуры. Одни процедуры могут вызывать другие, однако массив данных в программе остаётся общим и доступным для всех процедур. Такой подход применяется при процедурном программировании на PHP и позволяет создавать крупные программные комплексы. Но разработка, отладка и поддержка программ, оперирующих большими объёмами данных(как, например, кафедральная БД), всё равно остаётся сложной и требующей значительного мастерства и опыта.

Ответом на всё возрастающую сложность стало появление объектно-ориентированного подхода в программировании: программа разбивается на несколько массивов данных, каждый из которых имеет свои собственные процедуры, а также процедуры, которые взаимодействуют с другими массивами данных.

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

Независимо от привязки к языку программирования, объектно-ориентированный подход имеет ряд общих принципов, а именно:


  • возможность создавать абстрактные типа данных, позволяющая наряду с предопределёнными типами данных (такими как integer, string и т.д.) вводить свои собственные типы данных (классы) и объявлять «переменные» таких типов данных (объекты). Создавая свои собственные типы данных, программист оперирует не машинными терминами (переменная, функция), а объектами реального мира, поднимаясь тем самым на новый уровень абстракции;

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

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

  • полиморфизм, допускающий построение целых цепочек и разветвленных деревьев, наследующих друг другу абстрактных типов данных (классов). При этом весь набор классов будет иметь ряд методов с одинаковыми названиями: любой из классов данного дерева гарантированно обладает методом с таким именем. Этот принцип помогает автоматически обрабатывать массивы данных разного типа.

3.1.4 Особенности фреймворка CodeIgniter

Используемый фреймворк CodeIgniter написан с использованием объектно-ориентированного подхода. Все классы контроллеров, отображений и моделей, вводимые программистом, наследуют исходные классы, введённые в сам фреймворк. Это даёт возможность писать меньший по объёму исходный код, поскольку все необходимые базовые функции сразу же становятся доступны.

Помимо доступных программисту классов контроллеров, отображений и моделей, в фреймворке CodeIgniter существуют также доступные программисту функции плагинов (plugins) и хелперов (helpers - помощники). Хелперы, как видно из названия, призваны помочь исполнить какую-либо незначительную функцию. Например, существуют хелперы построения web-форм, загрузки файлов или работы с сессиями. В отличие от всех остальных основных элементов фреймворка, хелперы – наборы элементарных функций., написанных даже без использования объектно-ориентированного подхода. Каждая функция выполняет небольшую, строго ограниченную задачу. Однако набор довольно велик, и такая «мелочь» становится очень полезной в работе.

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


3.1.5 Интегрированная среда разработки Eclipse

При разработке программы обработки анкет опроса студентов кафедры также использовался такой важный и полезный инструмент программиста, как интегрированная среда разработки (IDE - Integrated Development Environment), а именно Eclipse. Eclipse - свободный фреймворк для разработки модульных кроссплатформенных приложений. Разрабатывается и поддерживается Eclipse Foundation.

Наиболее известные приложения на основе Eclipse Platform - различные «Eclipse IDE» для разработки ПО на множестве языков (например, наиболее популярный «Java IDE», поддерживавшийся изначально). В данном случае использовались расширения для программирования на языках программирования PHP (модуль PDT) и JavaScript (модуль JSEclipse), а так же вёрстки с использованием языка разметки HTML.

3.2 Технология тестирования программы

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

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

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

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

Тестирование системы проводилось несколькими методами:


  • нагрузочное тестирование;

  • ручная отладка и трассировка программы с использованием расширения XDebug;

  • модульное тестирование с помощью phpUnit.
В случае с тестированием программ, написанных на PHP, следует проверять на соответствие ожиданиям выводимые на экран пользователя данные. При этом возможны следующие основные проблемы:

  • на экране ничего не отображается, или выдается системная ошибка с соответствующим кодом (ошибка авторизации, сбой web-сервера и т.п.);

  • произошел сбой при работе с базой данных, при этом генерируется отчет об ошибке;

  • сбой сервера, связанный с высокой нагрузкой на приложение или БД;

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

3.2.1 Нагрузочное тестирование программы

Одним из важнейших тестов является нагрузочное тестирование, позволяющее найти «узкие места» в исходном коде или обращениях к базе данных.

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

Для нагрузочного тестирования программы обработки анкет опроса студентов кафедры была использована программа curl-loader. Curl-loader это свободно распространяемая утилита тестирования производительности web-приложений, написанная на языке программирования C. Она способна симулировать сотни и даже тысячи обращений к серверу по протоколам HTTP и HTTPS и использует библиотеку libcurl, что позволяет без каких-либо проблем тестировать приложения, требующие авторизации. А поддержка протокола HTTPS позволяет использовать утилиту curl-loader для нагрузочного тестирования web-приложений, работающих через шифрованные транспортные механизмы SSL (Secure Sockets Layer - уровень защищённых сокетов) и TLS (Transport Layer Security).

3.2.2 Отладка с использованием встроенных средств PHP

Стандартное поведение приложения, написанного на языке PHP, при возникновении ошибки в коде сильно зависит от параметров конфигурации. Как правило они задаются в конфигурационном файле php.ini:

  • параметр display_errors, имеющий значения on или off, указывает, следует ли показывать пользователю сообщения об ошибках или оставить их скрытыми;

  • параметр log_errors, имеющий значения on или off, заставляет интерпретатор PHP записывать сообщения в файл журнала событий;

  • директива error_reporting определяет, в каких случаях следует генерировать предупреждение, а в каких его можно проигнорировать.
При разработке и отладке программы на тестовом сервере необходимо включать параметр display_errors и отключать - log_errors. Это позволяет программисту максимально быстро реагировать на возникновение ошибочной ситуации, минимизируя число «переключений между окнами».

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

В обоих случаях параметр error_reporting удобно выставлять в максимально подробное состояние – E_ALL, заставляющее PHP сообщать о самых незначительных оплошностях в коде.

3.2.3 Отладка программы с помощью XDebug

Хотя язык программирования PHP можно использовать для создания сценариев командной строки для таких задач как системное администрирование и традиционная обработка данных, мощь языка особенно проявляется в web-приложениях.

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

Выражение языка PHP echo и такие функции, как var_dump(), debug_zval_dump() и print_r() являются обычными и очень популярными средствами отладки, помогающими решить различные мелкие проблемы. Однако как средства тестирования и отладки эти выражения (и даже более надежный инструментарий, например, пакет PEAR Log) помогают слабо и не всегда.

Кроме того, такая отладка является подходом с позиции "грубой силы". При отсутствии необходимой информации требуется переделывать исходный код, повторять предыдущие действия и начать поиск ошибки заново. Намного более эффективная стратегия - испытывать приложение во время его работы. Можно каталогизировать параметры запроса, просмотреть стек вызовов процедур, узнать значение любой переменной или объекта. Можно временно прервать выполнение приложения и получить уведомление об изменениях значения переменной

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

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

Журнал трассировки обычно различается от запуска к запуску, так как он зависит от входящих данных, которые различаются от запроса к запросу.

Отслеживание журнала помогает понять, каким образом происходит выполнение программы, однако очень сложно визуализировать все возможные ветвления, если только программа не является очень простой. Именно из-за этого тестирование больших программ достаточно сложно: слишком много различный путей развития и каждый необходимо протестировать.

Средство отладки приложений XDebug, как следует из его названия, предоставляет несколько функциональных возможностей для отображения состояния программы и является очень ценным исследовательским инструментом. Будучи установленным, XDebug вмешивается в процесс для предотвращения бесконечных рекурсий, добавляет в сообщения об ошибках информацию о трассировке стека и функций, следит за распределением памяти, а также выполняет некоторые другие функции. Также Xdebug содержит также набор функций, которые можно добавить в исходный код для получения диагностических данных времени выполнения.

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

Подводя итоги, можно сказать, что XDebug это маленький, но очень полезный инструмент для разработчика PHP, он должен быть установлен на каждый интерпретатор PHP, применяемый для разработки. Но не стоит использовать XDebug на рабочих серверах, так как из-за этого сильно падает производительность.
Р

исунок 2.1. – Интерфейс программы KCachegrind

3.2.4 Модульное тестирование с использованием phpUnit

Модульное тестирование (unit testing) - процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы. Идея состоит в том, чтобы писать проверочные тесты для каждой нетривиальной функции или метода. Это позволяет достаточно быстро проверить, не привело ли очередное изменение кода к появлению ошибок в уже написанных и оттестированных местах программы, а также облегчает обнаружение и устранение таких ошибок. Цель модульного тестирования - изолировать отдельные части программы и показать, что по отдельности эти части работоспособны.

При отладке и тестировании программы обработки анкет опроса студентов кафедры использовалась система phpUnit, позволяющая производить модульное тестирование web-приложений, написанных на языке программирования PHP.

Для того, чтобы написать минимальный набор тестов, используя phpUnit, необходимо:


  • подключить библиотеку PHPUnit.php;

  • создать подкласс базового класса TestCase;

  • добавить в него произвольное количество тестирующих методов, названия которых начинаются с "test". На вход будут подаваться заранее известные параметры, а результат сравнивается с эталонным посредством семейства функций Assert, унаследованных тестовым классом от базового класса TestCase;

  • создать класс PHPUnit_TestSuite, передав ему в качестве параметра название класса с набором тестов;

  • Запустить набор тестов и проверить результат выполнения.

6 (?). Перечень графического материала

6.1 Постановка задачи

6.2 Структурная схема программы



Шаг 1. Определяем структуру управляющей программы, которая для нашего случая реализует работу с меню через клавиатуру: Программа
Шаг 2. Детализируем операцию Выполнить команду: Выполнить Команду
Подобный материал:
  • Н. Э. Баумана Факультет Информатики и систем управления Кафедра Компьютерные системы , 254.77kb.
  • Н. Э. Баумана Кафедра Компьютерные системы и сети Г. С. Иванова, Т. Н. Ничушкина Оформление , 109.65kb.
  • Н. Э. Баумана Факультет "Инженерный бизнес и менеджмент" Кафедра "Менеджмент" , 786.11kb.
  • Примерная программа наименование дисциплины Проектирование и архитектура программных , 182.2kb.
  • С. В. Чувиков Метрология и сертификация программного обеспечения Учебное пособие , 1298.56kb.
  • Электронное гиперссылочное учебное пособие по дисциплине «Основы теории управления» , 57.71kb.
  • Н. Э. Баумана Факультет "Информатика и системы управления" Кафедра "Системы обработки , 128.07kb.
  • М. В. Красильникова проектирование информационных систем раздел: Теоретические основы , 1088.26kb.
  • Программа вступительных испытаний (собеседования) для поступающих в магистратуру , 87.89kb.
  • Учебное пособие, 2003 г. Учебное пособие разработано ведущим специалистом учебно-методического , 454.51kb.

4.Проектирование программного обеспечения при структурном подходе

4.1.Разработка структурной и функциональной схем

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

Структурная схема разрабатываемого ПО. Структурной называют схему, отражающую состав и взаимодействие по управлению частей разрабатываемого ПО.

Самый простой вид ПО – программа в качестве структурных компонентов может включать только подпрограммы и библиотеки ресурсов. Разработка структурной схемы программы обычно выполняется методом пошаговой детализации (см. § 4.2).

Структурными компонентами программной системы или программного комплекса могут служить программы, подсистемы, базы данных, библиотеки ресурсов и т. п. Так структурная схема программной системы, как правило, показывает наличие подсистем или других структурных компонентов (рис. 4.1).

Более полное представление о проектируемом ПО с точки зрения взаимодействия его компонентов между собой и с внешней средой дает функциональная схема.

Функциональная схема. Функциональная схема или схема данных (ГОСТ 19.701–90) – схема взаимодействия компонентов ПО с описанием информационных потоков, состава данных в потоках и указанием используемых файлов и устройств. Для изображения функциональных схем используют специальные обозначения, установленные стандартом.

Функциональные схемы более информативны, чем структурные. Так функциональные схемы программных комплексов и систем наглядно демонстрируют различие между ними (рис. 4.2).

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

4.2.Использование метода пошаговой детализации для проектирования структуры программного обеспечения

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

Метод пошаговой детализации реализует нисходящий подход и базируется на основных конструкциях структурного программирования. Он предполагает пошаговую разработку алгоритма. Каждый шаг при этом включает разложение функции на подфункции. Так на первом этапе описывают решение поставленной задачи, выделяя общие подзадачи. На следующем аналогично описывают решение подзадач, формулируя уже подзадачи следующего уровня. Таким образом, на каждом шаге происходит уточнение функций проектируемого ПО. Процесс продолжают, пока не доходят до подзадач, алгоритмы решения которых очевидны.

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

Кроме этого целесообразно придерживаться следующих рекомендаций:

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

Пример 4.2. Разработать алгоритм программы построения графиков функций одной переменной на заданном интервале изменения аргумента при условии непрерывности функции на всем интервале определения.

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

Для того чтобы построить график необходимо задать функцию, интервал изменения аргумента , на котором функция непрерывна, количество точек графика n, размер и положение окна экрана, в котором необходимо построить график: wx1, wy1, wx2, wy2 и количество линий сетки по горизонтали и вертикали nlx, nly. Значения wx1, wy1, wx2, wy2, nlx, nly можно задать, исходя из размера экрана, а интервал и число точек графика надо вводить.

Разработку алгоритма выполняем методом пошаговой детализации, используя для его документирования псевдокод.

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

Шаг 1. Определяем структуру управляющей программы, которая для нашего случая реализует работу с меню через клавиатуру:

Программа.

Инициализировать глобальные переменные

Вывести заголовок и меню

Выполнять

Если выбрана Команда

то Выполнить Команду

иначе

Все-если

до Команда=Выход

Конец.

Очистка экрана, вывод заголовка и меню, а также выбор Команды – операции сравнительно простые, следовательно, их можно не детализировать.

Шаг 2. Детализируем операцию Выполнить команду:

Выполнить Команду:

Выбор Команда

Функция:

Выполнить разбор формулы

Отрезок:

Ввести значения x1,x2

Ввести значение h

Вид результата:

Ввести вид_результата

Если Вид_результата=График

то Построить график

иначе Вывести таблицу

все-если

Все-выбор

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

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

Подпрограмма Вывод заголовка и меню параметров не имеет.

Подпрограмма Разбор формулы должна иметь два параметра: Fun – аналитическое задание функции, Tree – возвращаемый параметр – адрес дерева разбора.

Подпрограмма Расчет Значений функции должна получать адрес дерева разбора Tree, отрезок x1 и x2, а также шаг h. Обратно в программу она должна возвращать таблицу значений функции X(n) и Y(n), где n – количество точек функции.

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

После уточнения имен переменных алгоритм основной программы будет выглядеть следующим образом:

Программа.

Вывод заголовка и меню

Выполнять

Если выбрана Команда

то

Выбор Команда

Функция:

Ввести или выбрать формулу Fun

Разбор формулы (Fun; Var Tree)

Отрезок:

Ввести значения x1,x2

Ввести значения h

Вид результата:

Ввести Вид_результата

Выполнить:

Расчет таблицы(x1,x2,h,Tree; Var X, Y, n)

Если Вид_результата=График

то Построение графика(X, Y, n)

иначе Вывеод таблицы(X, Y, n)

все-если

Все-выбор

иначе Обработать нажатие клавиш управления

Все-если

до Команда=Выход

Конец.

На следующих шагах необходимо выполнить детализацию алгоритмов подпрограмм. Детализацию выполняют, пока алгоритм программы не станет полностью понятен. Один из возможных вариантов полной структурной схемы данной программы показан на рис. 4.5.

Использование метода пошаговой детализации при проектировании алгоритмов программ обеспечивает высокий уровень технологичности разрабатываемого ПО, так как метод позволяет использовать только структурные способы передачи управления.

Разбиение на модули при данном виде проектирования выполняется эвристически, исходя из рекомендуемых размеров модулей (20-60 строк) и сложности структуры (две-три вложенных управляющих конструкции). Определяющую роль при разбиении программы на модули играют принципы обеспечения технологичности модулей.

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

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

Рисунок 1. Классификация ПО

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

    прикладное ПО, обеспечивающее выполнение необходимых работ на ПК: редактирование текстовых документов, создание рисунков или картинок, обработка информационных массивов и т.д.

    инструментальное ПО (системы программирования), обеспечивающее разработку новых программ для компьютера на языке программирования.

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

Это программы общего пользования не связаны с конкретным применением ПК и выполняют традиционные функции: планирование и управление задачами, управления вводом-выводом и т.д. Другими словами, системные программы выполняют различные вспомогательные функции, например, создание копий используемой информации, выдачу справочной информации о компьютере, проверку работоспособности устройств компьютера и т.п. К системному ПО относятся:

    операционные системы (эта программа загружается в ОЗУ при включении компьютера)

    программы – оболочки (обеспечивают более удобный и наглядный способ общения с компьютером, чем с помощью командной строки DOS, например, Norton Commander)

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

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

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

К утилитам относятся:

    диспетчеры файлов или файловые менеджеры

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

    средства просмотра и воспроизведения

    средства диагностики; средства контроля позволяют проверить конфигурацию компьютера и проверить работоспособность устройств компьютера, прежде всего жестких дисков

    средства коммуникаций (коммуникационные программы) предназначены для организации обмена информацией между компьютерами

    средства обеспечения компьютерной безопасности (резервное копирование, антивирусное ПО).

Утилиты- программы, предназначенные для решения узкого круга вспомогательных задач.

Иногда утилиты относят к классу сервисного программного обеспечения

Утилиты используются для:

    Мониторинга показателей датчиков и производительности оборудования - мониторинг температур процессора, видеоадаптера; чтение S.M.A.R.T. жёстких дисков;

    Управления параметрами оборудования - ограничение максимальной скорости вращения CD-привода; изменение скорости вращения вентиляторов.

    Контроля показателей - проверка ссылочной целостности; правильности записи данных.

    Расширения возможностей - форматирование и/или переразметка диска с сохранением данных, удаление без возможности восстановления.

Типы утилит:

Дисковые утилиты

      Дефрагментаторы

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

      Очистка диска - удаление временных файлов, ненужных файлов, чистка «корзины».

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

      Резервное копирование - создание резервных копий целых дисков и отдельных файлов, а также восстановление из этих копий.

      Сжатие дисков - сжатие информации на дисках для увеличения вместимости жёстких дисков.

      • Утилиты работы с реестром

        Утилиты мониторинга оборудования

        Тесты оборудования

Рисунок 2. Место СПО в многоуровневой структуре компьютера

Необходимо отметить, что часть утилит входит в состав операционной системы, а другая часть функционирует автономно. Большая часть общего (системного) ПО входит в состав ОС (рис.2). Часть общего ПО входит в состав самого компьютера (часть программ ОС и контролирующих тестов записана в ПЗУ или ППЗУ, установленных на системной плате). Часть общего ПО относится к автономными программам и поставляется отдельно.

          Прикладное ПО. Прикладные программы могут использоваться автономно или в составе программных комплексов или пакетов. Прикладное ПО – программы, непосредственно обеспечивающие выполнение необходимых работ на ПК: редактирование текстовых документов, создание рисунков или картинок, создание электронных таблиц и т.д.Пакеты прикладных программ – это система программ, которые по сфере применения делятся на проблемно – ориентированные, пакеты общего назначения и интегрированные пакеты. Современные интегрированные пакеты содержат до пяти функциональных компонентов: тестовый и табличный процессор, СУБД, графический редактор, телекоммуникационные средства. К прикладному ПО, например, относятся:

    Комплект офисных приложений MS OFFICE

    Бухгалтерские системы

    Финансовые аналитические системы

    Интегрированные пакеты делопроизводства

    CAD – системы (системы автоматизированного проектирования)

    Редакторы HTML или Web – редакторы

    Браузеры – средства просмотра Web - страниц

    Графические редакторы

    Экспертные системы.

          Инструментальное ПО. Инструментальное ПО или системы программирования - это системы для автоматизации разработки новых программ на языке программирования. В самом общем случае для создания программы на выбранном языке программирования (языке системного программирования) нужно иметь следующие компоненты:1. Текстовый редактор для создания файла с исходным текстом программы. 2. Компилятор или интерпретатор. Исходный текст с помощью программы-компилятора переводится в промежуточный объектный код. Исходный текст большой программы состоит из нескольких модулей (файлов с исходными текстами). Каждый модуль компилируется в отдельный файл с объектным кодом, которые затем надо объединить в одно целое.3. Редактор связей или сборщик, который выполняет связывание объектных модулей и формирует на выходе работоспособное приложение – исполнимый код. Исполнимый код – это законченная программа, которую можно запустить на любом компьютере, где установлена операционная система, для которой эта программа создавалась. Как правило, итоговый файл имеет расширение.ЕХЕ или.СОМ.4. В последнее время получили распространение визуальный методы программирования (с помощью языков описания сценариев), ориентированные на создание Windows-приложений. Этот процесс автоматизирован в средах быстрого проектирования. При этом используются готовые визуальные компоненты, которые настраиваются с помощью специальных редакторов. Наиболее популярные редакторы (системы программирования программ с использованием визуальных средств) визуального проектирования:

    Borland Delphi - предназначен для решения практически любых задачи прикладного программирования

    Borland C++ Builder – это отличное средство для разработки DOS и Windows приложений

    Microsoft Visual Basic – это популярный инструмент для создания Windows-программ

    Microsoft Visual C++ - это средство позволяет разрабатывать любые приложения, выполняющиеся в среде ОС типа Microsoft Windows

Контрольные вопросы:

    Дайте определение операционной системе.

    Какое программное обеспечение относят к системному?

    Назовите служебное программное обеспечение.

    Какое программное обеспечение относят к прикладному?

    Каково назначение программного обеспечения?

    Каковы основные классы программ? Приведите примеры программ в каждом классе по назначению.