диплом целиком (1218792), страница 6
Текст из файла (страница 6)
Рисунок 17 – Диаграмма последовательности чтения данных из БД
Представленная диаграмма актуальна для реализаций программных интерфейсов ILocationManager, IWeatherRecordManager, IFireHazardReportManager. Интерфейс IDbManager описывает возможность управления базой данных, позволяя проверить целостность ее схемы, очистить БД или подготовить базу данных для хранения данных предметной области.
2.6 Пользовательский интерфейс
Основная задача пользовательского интерфейса – обеспечить взаимодействие между человеком и компьютером. Основные характеристики, по которым оценивается пользовательский интерфейс, это понятность, удобство, дружественность к пользователю. Хороший интерфейс должен делать работу пользователя эффективной.
Для реализации пользовательского интерфейса используется технология WPF (Windows Presentation Foundation) от компании Microsoft, которая доступна для разработки на платформе .NET. WPF является развитием технологии Windows Forms и отличается улучшенным способом отображения графических элементов и расширенными возможностями влиять на отображение этих элементов. Структура приложения, предлагаемая при разработке на WPF, обязывает программиста писать качественные программы, разделяя логику отображения данных пользователю и логику преобразования этих данных. Существует несколько распространенных шаблонов проектирования приложения, при котором логика отображения и логика преобразования данных разделены: MVC (Model - View -Controller), MVVM (Model - View - View Model), MVP (Model - View - Presenter). В данной работе использовался шаблон MVVM, который позволяет разделить приложение на следующие основные части:
– представление (view) – включает в себя графические компоненты приложения, такие как окна, кнопки, поля ввода и т.д.;
– модель (model) – включает в себя множество структур данных, представляющих предметную область;
– модель представления – включает в себя логику преобразования данных предметной области и представляет некоторое состояние представления [16].
Взаимодействие компонентов представлено на диаграмме.
Рисунок 18 – Взаимодействие компонентов в MVVM
Для реализации шаблона MVVM используется программная библиотека MVVM Light, созданная сотрудником компании Microsoft. Слово light отражает основную концепцию – библиотека проста в использовании и не требует дополнительных зависимостей.
При разработке пользовательского интерфейса представленной программы было принято решение использовать диалоговый режим интерфейса. Это означает, что в любой момент времени пользователь может выполнять только одну задачу. Основная идея в том, что пользователь может сделать запрос на операцию, а затем использовать результат запроса или отменить запрос – в любом случае пользователь вернется в ту часть приложения, из которой он делал запрос. Следующая диаграмма иллюстрирует возможные маршруты навигации пользователя в приложении.
Рисунок 19 – Диаграмма переходов
Такой подход к навигации в приложении помогает пользователю эффективно выполнять свою работу, поскольку набор действий в каждой точке приложения жестко ограничен.
2.7 Отчетность
Для принятия оперативных решений необходима информация. Такая информация может быть представлена в виде отчета. Отчет – способ представления информации, который отражает суть вопроса или исследования применительно к данной ситуации.
Структура отчета обычно состоит из введения, описания метода, результата применение метода и заключения. Представленная ниже диаграмма иллюстрирует структуру отчета.
Рисунок 20 – Структура отчета
Приложение должно автоматически формировать отчет, используя данную структуру. После этого пользователю на выбор предлагается сохранить и/или распечатать отчет.
3 РЕАЛИЗАЦИЯ
3.1 Реализация алгоритмов
Алгоритм расчета коэффициента пожарной опасности реализован в классе FireHazardReportBuilder. У данного класса есть всего один открытый метод BuildReport(), который позволяет сразу получить удобно сформированные данные расчетов для составления отчета.
Закрытый метод CalculateFireHazardCoefficient() реализует формулу (17), принимая на вход параметры о текущих погодных данных и количестве дней, прошедших после последнего дождя. Пример реализации:
private static decimal CalculateFireHazardCoefficient (WeatherRecord record, int daysWithoutRain)
{
return daysWithoutRain * (record.Temperature - record.DewPoint) * record.Temperature;
}
Точка росы (record.dewPoint) является вычисляемым свойством, то есть информация о ней нигде не сохраняется, а вычисляется при каждом обращении. Такой подход удобно использовать для поддержания актуальности данных, когда при обновлении данных о влажности или температуре значение точки росы пересчитается автоматически. Следующий код представляет вычисление точки росы по формулам (18) и (19).
public decimal DewPoint
{
get
{
var tau = AlphaCoefficient * Temperature /
(BetaCoefficient + Temperature);
if (Humidity > 0)
tau += (decimal)Math.Log((double)Humidity
/ 100);
var dewPoint = BetaCoefficient * tau /
(AlphaCoefficient - tau);
return dewPoint;
}
}
Дополнительное условие проверки на ненулевое значение влажности необходимо, что предотвратить ошибку в вычислении логарифма. В данном случае делается допущение, что значение влажности бесконечно малое и никак не повлияет на коэффициент tau.
Закрытый метод DayWithoutRain() позволяет рассчитать количество дней между датой, на которую получены погодные данные, и датой последнего дождя.
private static int DaysWithoutRain(WeatherRecord currentWeather, DateTime lastRainyDay)
{
return Convert.ToInt32(Math.Ceiling((currentWeather.Created - lastRainyDay).TotalDays));
}
Алгоритм получения даты последнего дождя реализован в классе WeatherRecordManager, который реализует интерфейс IWeatherRecordManager. Метод интерфейса IWeatherRecordManager GetLastRainyDay() возвращает дату последнего дождя. На вход метод принимает три параметра:
– идентификатор населенного пункта, для которого будет сделан расчёт;
– дата, от которой нужно искать дождливый день;
– дата, до которой ведется поиск.
public DateTime GetLastRainyDay(int locationId, DateTime from, DateTime to)
{
var lastRainyDay = to.Date;
while (lastRainyDay > from)
{
var records = Get(locationId, lastRainyDay, lastRainyDay.AddHours(24));
if (records.Sum(r => r.Precipitation) >= 3)
return lastRainyDay;
lastRainyDay = lastRainyDay.AddDays(-1);
}
throw new WeatherRecordNotFoundException("Не найдена информация об осадках за последнее время.");
}
Для эффективности поиск ведется в обратном направлении. За дождливый день принимается день, для которого сумма осадков всех записей о погоде за этот день не меньше 3мм. Если во время вычисления данные о последнем дождливом дне не будут найдены, то метод бросит исключение об отсутствии необходимых погодных данных, а пользователь увидит соответствующее информационное сообщение.
3.2 Реализация форм (пользовательский интерфейс)
Единицей компиляции в WPF является *.xaml файл, в котором содержится разметка экранной формы на языке XAML. Данный язык разметки является подмножеством XML и синтаксически похож на HTML. В Visual Studio встроен удобный редактор разметки XAML, который позволяет в режиме реального времени видеть все внесенные изменения. Однако, некоторые значения, которые будут вычислены только во время выполнения программы (такие как: текущий населенный пункт, данные о погоде и т.д.), не будут отображены в редакторе.
Рисунок 21 – Главное окно приложения
В языке XAML, по аналогии с HTML, существуют элементы-контейнеры, которые никак не отображаются в программе, но напрямую влияют на расположение графических компонентов внутри окна. В XAML их существует 4 вида: Grid, StackPanel, DockPanel, WrapPanel. Grid позволяет заранее определить сетку, на которой будут расположены элементы. Контейнер StackPanel располагает элементы друг за другом в выбранном направлении (по горизонтали или вертикали). DockPanel позволяет прикрепить элементы к одному или нескольким границам этого контейнера, а WrapPanel растягивает элементы внутри себя до заданного контейнером размера. Последние два контейнера достаточно специфичны и не так часто используются в разработке экранных форм.
Рисунок 22 – Окно выбора населенного пункта
Поскольку XAML является языком разметки, то, соответственно, в нем нет операторов ветвления, операторов проверки условий и других конструкций языков программирования. Данный факт одновременно является как плюсом, так и минусом технологии WPF. С одной стороны, это дает пространство для выбора шаблона проектирования приложения, с другой стороны – создает дополнительную сложность прикладному программисту, так как требует дополнительной квалификации в области проектирования [17].
















