Персональный сайт

Мирошниченко Кирилл Владимирович

Факультет компьютерных наук и технологий

Кафедра компьютерной инженерии

Системное программирование


Тема выпускной работы:

Разработка и исследование подсистемы топологического анализа сетевых динамических систем как объектов моделирования

Научный руководитель: проф., д.т.н. Святный Владимир Андреевич

Использование C# и технологии WPF на примере разработки экспертной системы

Аннотация

Рассматривается разработка диагностирующей экспертной системы с использованием языка программирования C# и технологии построения приложений WPF. На примере обработки базы знаний системы продемонстрирована работа с форматом XML. Рассматривается привязка данных в пользовательском интерфейсе, описанном с помощью языка разметки XAML, а также шаблоны и стили. При разработке кода приведен пример использования некоторых паттернов проектирования и технологии LINQ.

Содержание

Введение
1. Спецификация задачи разработки
2. Проектирование базы знаний
3. Разработка структур данных экспертной системы
4. Разработка экспертной системы
5. Разработка пользовательского интерфейса
Заключение
Источники

Введение

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

В статье рассматриваются преимущества использования языка программирования C# совместно с технологией Microsoft Windows Presentation Foundation (WPF) при разработке прикладных приложений.

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

Windows Presentation Foundation, который стал доступен 06.11.2006 с выходом .NET Framework 3.0, представляет собой графическую подсистему для рендеринга пользовательского интерфейса в приложениях Windows, используя при этом DirectX вместо подсистемы GDI. [1, 2]

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

  1. Она предлагает новую совместную модель программирования, в которой пользовательский интерфейс отделен от бизнес-логики приложения, что позволяет дизайнерам и программистам вести параллельную разработку проекта. При этом дизайнеры не обязаны иметь навыки программирования и каким-либо образом взаимодействовать с кодом приложения, а программисты, в свою очередь, могут сосредоточиться лишь на реализуемой логике. Это решило проблемы таких предыдущих технологий, как MFC и Windows Forms, при использовании которых на программиста ложилась задача разработки всего приложения от начала до конца [2, 3].
  2. WPF использует векторную систему визуализации, которая не зависит от разрешения экрана и создана с учетом возможностей современного графического оборудования. Для создания графического интерфейса используется язык разметки XAML (Extensible Application Markup Language), производный от XML [4]. WPF в легкой и удобной форме позволяет использовать элементы управления, привязку данных, макеты, стили, шаблоны, документы, двумерную и трехмерную графику, анимацию, текст, мультимедиа, оформление и многое другое [1]. Интерфейс разработанных WPF-приложений получается очень гибким и во многом напоминает Web-сайты, в которых расположение элементов на экране меняется динамически в зависимости от текущего содержимого.

  3. Производительность WPF выше по сравнению с GDI/GDI+ за счет использования аппаратного ускорения графики через DirectX [1, 3]. Вся визуализация теперь происходит за счет использования GPU.
  4. С помощью WPF могут быть созданы как автономные настольные, так и запускаемые в браузерах и телефонах приложения. Microsoft активно развивает поддержку, естественно, платформы Windows, но есть возможность запускать приложения и под Linux за счет средств Mono стороннего разработчика [1, 2].

  5. Использование самого .NET Framework дает кроссплатформенность разрабатываемым приложениям и во многих случаях - большую производительность по сравнению с обычными, компилируемыми под одну конкретную платформу, приложениями [2].

На примере разработки простейшей диагностирующей экспертной системы будут рассмотрены некоторые из возможностей .NET Framework и WPF.

↑ Вверх

1. Спецификация задачи разработки

Экспертная система – это программа, которая призвана заменить человека-эксперта в решении определенной проблемы. Обычно, подобные «помощники» состоят из базы знаний (совокупности фактов в определенной предметной области) и, собственно, программы, которая производит опрос пользователя и использует базу знаний для принятия решения. [5]

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

В качестве тематики примера выбираются классы персонажей известной игры World Of WarCraft. Система будет «советовать» игроку класс, каким ему следует начинать играть, в зависимости от его предпочтений. Необходимо выбрать несколько возможных объектов и определить список признаков, которые им присущи и по которым их можно будет идентифицировать. Для демонстрации составляется табл. 1, в которой строки представляют объекты (игровые классы), а столбцы – их признаки (способности классов).


Таблица 1 – База знаний экспертной системы

Может лечить других Может танковать Наносит сильный урон Имеет питомца Хорошо контролирует противника Усиливает группу Носит мощную броню Выполняет разные роли Наносит дальний урон Наносит ближний урон Носит щит Расходует ману
Друид + + + + + + + + + +
Паладин + + + + + + + + +
Шаман + + + + + + +
Жрец + + + + +
Рыцарь смерти + + + + +
Воин + + + + +
Чернокнижник + + + + +
Охотник + + + +
Маг + + + + +
Разбойник + + +

↑ Вверх

2. Проектирование базы знаний

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

Если строится серьезная экспертная система (возможно, для какого-либо интернет-сервиса) с большим объемом информации, то предпочтительным вариантом является использование базы данных Microsoft SQL Server с доступом к ней посредством технологии ADO.NET. Однако, для небольшого примера данной статьи вполне достаточным является хранение базы знаний в XML-файле, для комфортной работы с которыми Microsoft в библиотеке .NET Framework предоставила огромное количество методов.

Предложена следующая структура файла:

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

Раздел Attributes перечисляет все виды характеристик объектов (т.е. столбцы из табл. 1) и присваивает им идентификаторы ID (для удобства выбран числовой вид), по которым они будут заданы в объектах. Атрибут Caption – это визуальное описание признака объекта для пользователя.

Раздел Objects описывает, соответственно, все объекты (атрибут Name) и характеристики (заданы в атрибуте Attributes в виде присвоенных ранее идентификаторов ID, перечисленных через знак-разделитель), которые они имеют.

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

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

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

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

↑ Вверх

3. Разработка структур данных экспертной системы

Приложения WPF предпочтительно разрабатывать, придерживаясь паттерна проектирования MVVM (Model-View-ViewModel), предложенного Джоном Госсманом (John Gossman) в 2005 году как модификации паттерна Presentation Model. Данный паттерн предполагает разделение логики приложения и визуального представления, что особенно актуально в связи со всеми возможностями, предлагаемыми WPF в этом направлении. [6, 7]

Следующий класс будет представлять признак объекта и выбор пользователя в системе:

Класс имеет поля ID и Name, определяющие идентификатор и имя признака. Они описаны в виде свойства, доступного извне только для чтения, и задаются один раз в конструкторе при создании экземпляра класса. Также имеются поля used и unused, которые показывают, должен ли данный признак присутствовать или отсутствовать у объектов. Если оба установлены в False, то признак должен игнорироваться. Иначе только одно поле может иметь значение True.

Привязка данных WPF, пример которой будет рассмотрен ниже, требует, чтобы привязываемые данные обязательно являлись свойствами. Именно поэтому ID и Name описаны в виде авто-свойств (компилятор автоматически сгенерирует для них поле, которое будет хранить устанавливаемое значение), а used и unused устанавливаются с помощью Used и Unused.

Придерживаясь MVVM, следует обеспечить, чтобы изменения в полях класса могли быть отслежены, благодаря чему WPF сможет без какого-либо дополнительного кода обновлять GUI. Это реализуется использованием паттернов Observer и Interface. Библиотека .NET Framework содержит специальный интерфейс INotifyPropertyChanged, который используется для оповещения об изменениях в свойствах класса. Согласно ему должно быть реализовано событие PropertyChanged, при возникновении которого необходимо передать в аргументе PropertyChangedEventArgs имя измененного свойства. WPF «знает» о данном интерфейсе и на возникновение события автоматически реагирует обновлением представления привязанной информации.

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

Следует отметить еще одну удобную особенность C#-программ – возможность использования XML-комментариев, которые обеспечивают автодокументирование кода.

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

Свойства Name и Attributes возвращают, соответственно, имя и признаки объекта экспертной системы. Список Attributes создается в конструкторе и формируется методом SetAttributes из строки атрибутов, прочитанной из файла базы знаний. В методе SetAttributes с помощью регулярных выражений (класс Regex) выделяются все идентификаторы атрибутов и вносятся в список.

↑ Вверх

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

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

Для хранения объектов и признаков необходима такая коллекция, которая бы оповещала WPF обо всех изменениях. Для этой цели используется ObservableCollection, которая при добавлении, удалении или обновлении всего списка элементов генерирует специальное событие.

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

Однако для хранения самих признаков ObservableCollection не подходит, так как не реагирует на изменение в их свойствах. В качестве одного из вариантов решения проблемы является унаследование класса с добавлением необходимого функционала [8]. Это позволит отслеживать изменения и оставить базовую функциональность, необходимую WPF. Предлагается следующая реализация данной идеи:

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

Теперь становится возможна разработка непосредственно самой экспертной системы:

Класс DiagnosticExpertSystem также реализует интерфейс INotifyPropertyChanged и генерирует событие при изменении таких свойств, как Name (имя экспертной системы), AttributesCaption (надпись для списка признаков), ObjectsCaption (надпись для списка отфильтрованных в соответствии с установленными признаками объектов). Данные свойства будут изменятся при загрузке базы знаний.

Функция LoadDatabase принимает имя файла и загружает данные из базы знаний во внутренние коллекции и поля экспертной системы. В данной функции используется инструментарий .NET Framework, который позволяет с легкостью работать с XML-файлами. Например, для того, чтобы загрузить список всех записей об объектах, достаточно просто воспользоваться функцией SelectNodes класса XmlDocument. А доступ к атрибутам тегов осуществляется как к обычным массивам, только в качестве индексатора – строковое имя атрибута. Именно из-за богатой поддержки XML был выбран данный формат файла.

Имеются коллекции признаков Attributes, всех объектов AllObjects и отфильтрованных объектов FilteredObjects. Признаки и объекты загружаются один раз и не меняются во время работы, а отфильтрованные объекты изменяются после каждого выбора признака пользователя.

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

Функция Filter осуществляет выбор объектов в коллекцию FilteredObjects, которые удовлетворяют выбранным признакам. В коде данной функции продемонстрировано использование еще одного мощного инструмента .NET Framework – LINQ (Language Integrated Query). Средства данных запросов позволяют делать выборку из любых источников данных подобно тому, как используется SQL в базах данных. Сначала выбираются списки признаков, которые должны присутствовать (yesAttr) и которые должны отсутствовать (noAttr) в объекте. Неотмеченные пользователем признаки игнорируются. Далее производится выбор всех объектов, у которых из yesAttr присутствуют все записи и нет ни одной из noAttr. Найденные объекты переносятся в FilteredObjects, о чем становится известно WPF за счет использования класса ObservableCollection.

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

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

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

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

↑ Вверх

5. Разработка пользовательского интерфейса

Интерфейс описывается средствами XAML. При грамотно разработанном коде, потребуется лишь с помощью средств привязывания данных указать источники данных. Привязывание данных (DataBinding) – инструмент WPF, который обеспечивает простой и согласованный способ представления данных и взаимодействия с ними.

Разметка простейшего интерфейса может иметь вид:

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


Простейший пользовательский интерфейс Рисунок 1. Простейший пользовательский интерфейс

В сетке определен контекст данных DataContext – своего рода источник информации для DataBindings элементов управления, находящихся на ней.

Строка задает поиск источника данных Expert в предках типа Window. В данном случае будет «подцеплено» свойство Expert, являющееся экземпляром экспертной системы.

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

Описание списка атрибутов демонстрирует всю мощь WPF: возможность описывать элементы управления практически любого вида и структуры. В данном случае определяется шаблон для каждого элемента списка: два флажка с подписями «Да» и «Нет» для отметки признака и правее – его название. По данном шаблону будут отображаться элементы коллекции Attributes экспертной системы, определенной привязкой данных в свойстве ItemsSource списка. При этом каждый флажок и название привязывается к соответствующим свойствам класса ExpertSystemAttribute.

После выбора файла и загрузки базы WPF автоматически отображает всю информацию (рис. 2).


Пользовательский интерфейс с загруженной базой Рисунок 2. Пользовательский интерфейс с загруженной базой

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

Данное окно выглядит довольно строго. Внесенные изменения (рис. 3) сделают его приятней на вид и продемонстрируют визуальные возможности WPF.


Усовершенствованный пользовательский интерфейс Рисунок 3. Усовершенствованный пользовательский интерфейс

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

Код представленного интерфейса:

↑ Вверх

Заключение

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

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

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

↑ Вверх

Источники

  1. Wikipedia - WPF.
  2. Wikipedia - .NET Framework.
  3. Matthew MacDonald. Pro WPF in C# 2008: Windows Presentation Foundation with .NET 3.5.
  4. Wikipedia - XAML.
  5. Wikipedia - Expert systems.
  6. Model-View-ViewModel.
  7. MVVM Technical Description by Karl.
  8. Extending ObservableCollection by Miguel Juárez.
  9. MSDN - WPF.
  10. MSDN - XAML.

↑ Вверх