32
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «УЛЬЯНОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ» В. В. Воронина ОБЪЕКТНО- ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ Методические указания к выполнению курсовых проектов для студентов направлений 230700.62 «Прикладная информатика», 231000.62«Программная инженерия» Ульяновск УлГТУ 2014

ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

  • Upload
    others

  • View
    29

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования «УЛЬЯНОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

В. В. Воронина

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ

Методические указания к выполнению курсовых проектов

для студентов направлений 230700.62 «Прикладная информатика», 231000.62«Программная инженерия»

Ульяновск УлГТУ 2014

Page 2: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

3

УДК 004.42 ББК 32.973-018.1 В 12 Рецензент доцент кафедры «Измерительно-вычислительные комплексы» УлГТУ, к.т.н. В. М. Кандаулов Одобрено секцией методических пособий научно-методического совета университета

Воронина, В. В. Объектно-ориентированное программирование : методические указания к выполнению курсовых проектов / В. В. Воронина. – Ульяновск : УлГТУ, 2014. – 34 с.

Представлен теоретический материал и рекомендации к выполнению

курсовых проектов по дисциплине «Объектно-ориентированное программирование».

Методические указания предназначены для студентов направления 230700.62 «Прикладная информатика», профиль «Прикладная информатика в экономике», и студентов направления 231000.62 «Программная инженерия», выполняющих курсовые проекты по дисциплине «Объектно-ориентированное программирование».

Работа печатается в авторской редакции.

УДК 004.42 ББК 32.973.2-018.1

Учебное электронное издание ВОРОНИНА Валерия Вадимовна

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ

Методические указания к выполнению курсовых проектов

Объем данных 1,13 Мб. ЭИ № 349. Заказ 1325.

Ульяновский государственный технический университет, ИПК «Венец»

432027, г. Ульяновск, ул. Сев. Венец, д. 32. Тел.: (8422) 778-113.

E-mail: [email protected] http://www.venec.ulstu.ru

© В. В. Воронина, 2014. © Оформление. УлГТУ, 2014.

В 12

Page 3: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

4

СОДЕРЖАНИЕ

ВВЕДЕНИЕ .......................................................................................................... 4 

ТРЕБОВАНИЯ К КУРСОВЫМ ПРОЕКТАМ .................................................. 5 

ПРИМЕР НАЧАЛЬНОГО ПРОЕКТИРОВАНИЯ ............................................ 8 

РЕКОМЕНДУЕМЫЕ ТЕХНОЛОГИИ ............................................................ 19 

Работа с базой данных .................................................................................. 19 

Получение электронной почты .................................................................... 22 

Построение графических отчетов ............................................................... 25 

БИБЛИОГРАФИЧЕСКИЙ СПИСОК ............................................................. 33 

3

Page 4: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

5

ВВЕДЕНИЕ

Данные методические указания разработаны для студентов

направлений 231000.62 «Программная инженерия» и 230700.62

«Прикладная информатика» (профиль «Прикладная информатика в

экономике»), выполняющих курсовой проект по дисциплине

«Объектно-ориентированное программирование».

В рамках курсового проектирования студентам предлагается

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

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

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

- модуль работы с базой данных;

- модуль построения текстовых отчетов;

- модуль построения графических отчетов;

- модуль работы с электронной почтой;

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

Дополнительно (в зависимости от задания или по желанию

учащихся) система может быть расширена блоками:

- модуль сетевого взаимодействия;

- модуль организации клиент-серверного взаимодействия;

- модуль сервисных функций;

- модуль взаимодействия со сторонними системами.

Методические указания состоят из трех разделов. В первом из

них содержатся требования к выполнению и оформлению курсовых

проектов, во втором рассматривается пример начального

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

рекомендуемые технологии для выполнения курсового проекта.

4

Page 5: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

6

ТРЕБОВАНИЯ К КУРСОВЫМ ПРОЕКТАМ

Работа над системой осуществляется командами из двух (редко

трех) человек. Студенты должны провести объектную декомпозицию

решаемой задачи и, исходя из этого, распределить между собой объем

реализуемых функций. Для повышения эффективности командной

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

контроля версий.

1. Требования к выполнению курсовых работ (проектов).

Объектно-ориентированный подход: должно быть четкое

разделение на классы-сущности, управляющие классы и классы-

интерфейсы.

Использование системы контроля версий

Должна быть работающая строго по заданию (причем, в

интерпретации «заказчика») программа и сдача командой

требуемых пунктов по графику (см. ниже). Кроме того должно

быть продемонстрировано умение модифицировать

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

«заказчика», т.е. после первой демонстрации В ЛЮБОМ

СЛУЧАЕ нужно будет что-то переделать.

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

эти четыре пункта вы можете получить 3 или 4, в зависимости от

уровня подготовки.

Разработка и сдача командой: каждый отвечает по своей части и

затем вместе представляют собранный проект. За все пункты вы

можете получить 5.

2. Требуемый график работы по курсовым работам (проектам).

Конец первого месяца семестра – уточнение заданий и плана

работы.

Первая неделя второго месяца семестра – сдача зон

ответственности, а также Use-case и ER диаграмм.

5

Page 6: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

7

Конец второго месяца семестра – сдача диаграммы классов.

За неделю до зачетной – показ работающей программы.

Конец семестра – выступление с курсовым на конференции.

3. Система оценки работы.

Курсовые работы оцениваются по следующей системе. За

корректно оформленные и сданные вовремя диаграммы (Use-case, ER,

UML-классы) вы можете получить по 10 баллов максимум.

Демонстрация использования системы контроля версий – 10 баллов.

Программа оценивается из максимума в 25 баллов, а записка из

максимума в 15. Дополнительные баллы можно получить следующим

образом: доклад на конференции – 5 баллов, выступление на выставке

программных продуктов в рамках конференции – 10 баллов, защита

курсовой командой при финальной сдаче – по 5 баллов.

Таким образом, финальная оценка за курсовой проект

рассчитывается следующим образом: 60-74 балла – 3; 75-89 баллов –

4; более 90 – 5.

4. Структура пояснительной записки к курсовым проектам.

Введение. Здесь вы пишите, где, по вашему мнению, может быть

использована ваша система, а также приводите структуру записки в

описательной форме.

Глава 1. Постановка задачи

1) Общая: берется из задания выданного преподавателем.

2) На вашу часть: описываете, что конкретно вы должны сделать в

рамках проекта.

Глава 2. Проектирование. Здесь необходимо привести описание

назначения каждой из диаграмм со ссылками на литературу, а затем

следующие диаграммы:

1) Use-case диаграмма реализованных вами функций.

2) ER диграмма таблиц базы данных, которые вы проектировали.

6

Page 7: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

8

3) UML-диаграмма разработанных вами классов с разделением на

сущности, управляющие и граничные классы.

Глава 3. Разработка

1) Описать используемые принципы экстремального

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

которой описывается что такое экстремальное программировании,

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

и применительно к вашему проекту.

2) Описать обнаруженные типовые ошибки и их исправления или

описания, как это можно было бы исправить и почему не исправили.

То есть, поместить код с антипаттерном, а затем его исправленный

вариант или как минимум объяснение, что вот тут мы его нашли, но

исправить не хватило времени.

3) Используемые сторонние библиотеки для разработки с кратким

их описанием.

4) Описание ваших этапов разработки с использованием системы

контроля версий с приведением иллюстрации ее применения в виде

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

5) Описание основных классов программы, разработанных вами.

Глава 4. Эксплуатация (одинакова у всех участников команды)

1) Требуемое программное и аппаратное обеспечение для работы

вашего приложения.

2) Описание установки разработанного приложения.

3) Описание для пользователя: скриншоты и пояснения по работе с

каждой функцией программы.

Вывод. Необходимо написать, что было разработано, какие есть

достоинства, какие недостатки и какие перспективы развития данного

проекта.

Библиографический список.

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

7

Page 8: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

9

ПРИМЕР НАЧАЛЬНОГО ПРОЕКТИРОВАНИЯ

Рассмотрим пример начального проектирования следующего

приложения. Пусть необходимо создать универсальную программу

для проведения тестирования сотрудников организаций. Система

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

создавать файлы с темой внутри самой программы. Кроме того

должна быть возможность загружать или создавать тесты и связывать

их с разделами материала (возможность задавать, какие разделы

должен пройти испытуемый, прежде чем перейти к тесту).

Необходимо реализовать возможность проведения тестирования и

хранение списка тестируемых с их оценками. Предусмотреть

возможность высылки отчета-«электронного сертификата» в

форматах pdf, MS Word, OpenOffice.Writer на почту тестируемого, а

также списков с результатами в формате OpenOffice.calc на

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

выводить статистический отчет в формате MS Excel с информацией

как в табличном виде, так и в виде графика об успеваемости

тестируемых, а также по прохождению тестов. Кроме того график

успеваемости должен быть выведен на форму.

Многие опытные программисты говорят: «Хорошая программа

пишется на листочке». Это действительно так. Прежде чем начать

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

сделать, ибо, как гласит «Третий закон Грира»: «Компьютерная

программа делает то, что ты приказал ей сделать, а не то, что ты на

самом деле хотел».

Исходя из этого, в создании любой хорошей программы

неизбежен этап проектирования. Для больших систем, основанных на

объектно-ориентированном подходе, этот этап заключается в

определении функционала системы, определении классов, которые

будут участвовать в реализации системы, а также в разработке

8

Page 9: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

10

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

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

не всегда выполняется от начала до конца. Более того, в условиях

ограниченности времени на многих не очень серьезных проектах этап

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

задачу, это допустимо, но для начинающих программистов о

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

построения начального проекта приложения, который позволит четко

представить, что конкретно необходимо написать для реализации

системы. Для понимания системы нам необходимо описать три вещи:

функционал, реализующие его классы, а также сценарии их

взаимодействия. Для этого мы воспользуемся возможностями языка

UML, а также техникой создания ER-диаграмм.

Unified Modeling Language (UML) представляет собой

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

разработчиками являются Гради Буч, Ивар Якобсон и Джеймс Рамбо.

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

которые используются при проектировании системы. Из всего их

многообразия мы рассмотрим две: диаграмму вариантов

использования (или диаграмму прецедентов) и диаграмму классов.

Основное назначение первой диаграммы – определить, как именно

система будет взаимодействовать с пользователем или другими

системами. Иными словами, какие возможности предоставляет

система внешнему миру, то есть ее основной функционал.

Диаграмма содержит два вида ключевых элементов: эктор и

прецедент. Эктор – множество ролей, исполняемых

взаимодействующей с системой сущностью. Графически этот элемент

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

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

9

Page 10: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

11

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

элемент изображается эллипсом.

Для пояснения рассмотрим построение диаграммы вариантов

использования (или по-другому диаграммы прецедентов) для

описания функционала системы проведения тестирования.

Первое, что мы должны сделать для построения диаграммы, –

выделить из текста постановки задачи словосочетания «глагол+его

дополнение»:

загружать файлы с материалом;

создавать файлы с темой;

загружать тесты;

создавать тесты;

связывать тесты с материалом;

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

хранение списка тестируемых с оценками;

отсылка отчетов на почту;

вывод статистического отчета.

Теперь мы должны превратить это в диаграмму, явно указав

характер взаимодействия пользователя с системой для каждого

действия. Результат представлен на рисунке 1.

Мы видим, что функции в списке и на диаграмме совпадают не

полностью. Это объясняется тем, что в процессе проектирования

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

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

тест, значит в любом случае в программе будет список этих тестов, и

необходимо предусмотреть функции работы с ним. Кроме того

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

проектирования и дальнейшее ее уточнение неизбежно.

10

Page 11: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

12

Рисунок 1. Диаграмма прецедентов.

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

системы, можно переходить к проектированию классов,

обеспечивающих их реализацию.

В объектно-ориентированном подходе принято выделять три

вида классов: сущности, управляющие и граничные классы.

Рассмотрим их подробнее. Классы-сущности представляют собой

абстракции реальной предметной области, которые обычно не зависят

от окружения и могут использоваться в различных приложениях.

Обычно это те классы, которые требуются системе для выполнения

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

классы. Их задача – манипулирование сущностями и реализация

требуемых функций. То есть по сути это то, что обеспечивает всю

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

Теперь нам осталось рассмотреть последний вид классов – граничные

классы. Их задача – обеспечение взаимодействия между окружающей

средой и внутренними элементами системы. В некоторых источниках

11

Page 12: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

13

их называют интерфейсами, так как, по сути, они предоставляют

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

Выделение классов из исходной постановки задачи начинается с

классов-сущностей. Для этого мы производим построение списка

существительных, с которыми работает система и которых можно

встретить в предметной области задачи.

Для нашего примера это:

материал;

тест;

вопрос;

ответ;

тестируемый;

оценка;

почта;

отчет.

Теперь необходимо профильтровать полученный список. Класс-

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

данных, имеет набор ключевых характеристик и участвует в

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

отсекают два последних существительных из списка. Электронная

почта в данном случае – всего лишь строка с адресом, являющаяся

или характеристикой тестируемого, или неким вводимым значением.

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

Никакой самостоятельной смысловой нагрузки он не несет, поэтому

выделять его в отдельный класс нет смысла.

В большинстве случаев объекты классов-сущностей при работе

программы хранятся в базе данных, поэтому после того, как мы

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

характеристики.

Материал: название, текст, список тестов.

12

Page 13: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

14

Тест: название, список вопросов.

Вопрос: текст, список ответов.

Ответ: текст, пометка правильности.

Тестируемый: логин, пароль, список материалов, список тестов.

Оценка: тестируемый, тест, значение.

Теперь по этому описанию нам необходимо спроектировать базу

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

это модель сущность-связь, позволяющая описывать концептуальную

схему предметной области. С ее помощью мы упростим

проектирование базы данных. Первое что нам необходимо сделать, –

определить, какие между сущностями будут связи.

Из описания мы видим следующее: материал связан с тестом и

тестируемым, тест – с вопросом, оценкой, тестируемым и

материалом, вопрос связан с ответом, тестируемый – с материалом,

оценкой и тестом, оценка связана с тестом и тестируемым. Теперь мы

можем построить первую версию ER-диаграммы. Ее вид представлен

на рисунке 2.

Рисунок 2. Первый этап построения ER-диаграммы

Мы видим, что на данной диаграмме убраны избыточные связи.

Теперь нам необходимо уточнить характер оставшихся связей и связи

13

Page 14: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

15

типа «многие ко многим» привести к виду «один ко многим» с

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

сделали, мы получим диаграмму, представленную на рисунке 3.

Рисунок 3. Финальная ER-диаграмма

Мы видим, что все связи имеют вид «один ко многим».

Теперь построим диаграмму классов-сущностей, в которой

опишем их поля и методы. По правилам оформления диаграмм

классов UML класс представляется в виде прямоугольника,

имеющего три горизонтальные секции: имя, поля и методы.

Связанные классы соединяются между собой линиями. Но так как

классы-сущности в основном впоследствии будут представлены

таблицами в базе данных, то раздел методов на данном этапе можно

игнорировать. Итоговый вид диаграммы классов, отображающей

сущности системы, представлен на рисунке 4. Обратите внимание на

«искусственные» характеристики объектов: идентификаторы. Они

необходимы для обеспечения связей таблиц в базе данных.

14

Page 15: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

16

Рисунок 4. Финальная диаграмма классов-сущностей.

Теперь перейдем к построению управляющих классов. В

противоположность классам-сущностям на диаграмме эти классы

отображаются без полей, но с методами. Управляющие классы

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

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

прецедент, а затем классы, манипулирующие одними и теми же

сущностями или выполняющие схожие действия, объединяются в

один.

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

регистратор;

загрузчик файла с материалом;

загрузчик файла с тестом;

создатель материала;

создатель теста;

15

Page 16: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

17

построитель отчетов;

тестировщик;

редактор теста;

редактор материала;

почтовик;

менеджер базы данных;

класс для работы с тестируемыми.

Объединяя классы, получаем итоговый список:

класс для работы с тестируемыми;

класс для работы с тестами;

класс для работы с материалами;

построитель отчетов;

почтовик;

менеджер базы данных.

Теперь построим диаграмму классов, определив методы для

каждого класса. Итоговый результат изображен на рисунке 5.

Рисунок 5. Финальная диаграмма управляющих классов.

Последний вид классов, который нам нужно рассмотреть –

граничные классы или интерфейсы. Для их проектирования мы

16

Page 17: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

18

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

которых требуется непосредственное участие пользователя или

другой системы. Для каждого такого метода, как правило,

проектируется отдельная форма, но затем универсальные формы

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

классов для нашего примера будет следующим:

основная форма с меню;

вход в систему;

регистрация в системе и редактирование информации;

список тестируемых, материалов или тестов;

загрузка материала или теста;

создание, редактирование и просмотр материала;

создание и редактирование теста;

тестирование;

форма окончания тестирования с выводом сертификата;

отправка письма;

подключение к базе данных.

Теперь ваша задача – определить первоначальную взаимосвязь

форм. То есть какая форма, откуда будет вызываться. Для этого

можно воспользоваться техникой построения диаграммы классов,

связав взаимодействующие формы линиями.

Логика связей строится из соображений здравого смысла и

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

этом случае нет, разве что попробуйте представить, как бы с вашей

точки зрения выглядела работающая программа.

Для нашего примера одним из возможных вариантов

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

рисунке 6. Рекомендуется для каждой формы написать примерный

список визуальных элементов, которые должны быть на ней

17

Page 18: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

19

размещены. Но этот шаг можно опустить, так как в процессе

реализации интерфейс в большинстве случаев все равно меняется.

Рисунок 6. Финальная диаграмма граничных классов.

После того как вы получили списки классов сущностей,

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

непосредственно к реализации вашей системы. Но необходимо

учитывать, что это результаты только первичного проектирования, и

в процессе работы над системой имеющаяся классовая модель может

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

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

классами, второй – с классами-сущностями. Управляющие классы

делятся поровну исходя из объема их функционала.

18

Page 19: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

20

РЕКОМЕНДУЕМЫЕ ТЕХНОЛОГИИ

В данном разделе вашему вниманию представлена информация

по технологиям, с помощью которых можно выполнить курсовой

проект. Так как большинство из них (построение текстовых отчетов,

организация работы в сети, рассылка электронной почты и

организация взаимодействия со сторонними системами) подробно

описаны в [2], то в данных методических указаниях мы рассмотрим

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

Работа с базой данных

Работать с базой данных можно различными способами. Выбор

конкретного метода зависит от используемого вами сервера базы

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

[2] рассмотрена работа с базой данных через LINQ и через

визуальные компоненты (ADO .Net). Оба эти метода ориентированы

на сервер MS SQL, поставляемый вместе с Visual Studio. В данных

методических указаниях мы рассмотрим способ организации

взаимодействия с компактной встраиваемой реляционной базой

данных SQLite, так как не всегда решаемые задачи автоматизации

требуют мощной СУБД.

SQLite не использует взаимодействие типа клиент-сервер, то

есть СУБД не является отдельно работающим процессом, с которым

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

которой программа компонуется и СУБД становится составной

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

функций библиотеки SQLite. Такой способ упрощает программу и

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

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

стандартный файл на том компьютере, на котором исполняется

программа.

19

Page 20: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

21

Несколько процессов или потоков могут одновременно читать

данные из одной базы, но запись можно осуществить только в том

случае, если никаких других запросов в данный момент нет. Так как

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

С библиотекой вместе поставляется клиентская часть в виде

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

позволяет обращаться к файлу базы данных на основе типовых

функций операционной системы. Кроме того в Интренете есть много

бесплатных графических менеджеров для работы с данной

библиотекой.

Итак, рассмотрим пример работы с SQLite. Пусть нам

необходимо создать таблицу «Студент» с идентификатором и именем.

Для начала нам необходимо скачать файлы sqlite3.dll и

System.Data.SQLite.dll. Теперь создаем новый проект VisualStudio,

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

использование соответствующего пространства имен:  

using System.Data.SQLite;

Теперь займемся созданием базы данных. Для этого

воспользуемся статическим методом класса SQLiteConnection

CreateFile, в параметрах которого укажем путь к создаваемой БД:  

SQLiteConnection.CreateFile(@"G:\1\mydb.sqlite");

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

объектов: SQLiteConnection, SQLiteCommand и SQLiteDataReader.

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

для запросов-выборок.

Общий алгоритм работы с базой данных состоит из следующих

шагов.

20

Page 21: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

22

1. Создать подключение к БД, привязав его к объекту класса

SQLiteConnection.

2. Создать выполняемую команду, назначив ей текст и созданное

ранее подключение.

3. Открыть подключение к БД.

4. Выполнить команду.

5. Закрыть подключение.

Рассмотрим пример создания таблицы в базе. Для начала нам

необходимо получить строку подключения к ней. Есть очень

полезный интернет-ресурс www.connectionstrings.com. На нем можно

найти строки подключения ко всем популярным СУБД. Полученную

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

SQLiteConnection:

SQLiteConnection sql=new SQLiteConnection(@"Data Source=G:\1\mydb.sqlite;Version=3");  

Теперь создаем команду создания таблицы:  

SQLiteCommand sc = new SQLiteCommand("create table Student(id INTEGER PRIMARY KEY, name TEXT)", sql);  

Открываем подключение, выполняем команду и закрываем

подключение:

sql.Open(); sc.ExecuteNonQuery(); sql.Close();

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

ситуации, то не забываем использовать конструкцию try-catch.

Добавление записей в таблицу выполняется аналогично,

меняется только текст SQL-запроса, поэтому его рассматривать не

будем, а перейдем к выборке данных. Пусть у нас на форме размещен

21

Page 22: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

23

компонент DataGridView и нам необходимо выгрузить в него

результат запроса. Код будет следующий:

SQLiteConnection sql=new SQLiteConnection(@"Data Source=G:\1\mydb.sqlite;Version=3"); sqlcon.Open(); SQLiteCommand sql = new SQLiteCommand(sqlcon); sql.CommandText = @"SELECT * FROM Student;"; SQLiteDataReader sdr = sql.ExecuteReader(); DataTable dt = new DataTable(); dt.Load(sdr); dataGridView1.DataSource = dt; sdr.Close(); sqlcon.Close();

Обратите внимание, что запросы-выборки выполняются

методом ExecuteReader, который возвращает объект. После окончания

работы с ним необходимо вызывать метод Close. Кроме того, следует

понимать, что необязательно при каждом запросе создавать новый

объект для подключения и команды. Обычно они создаются в

единственном экземпляре.

Получение электронной почты

Для организации получения программой электронной почты

можно воспользоваться возможностями бесплатной библиотеки

OpenPop. Это бесплатная .NET библиотека, написанная на C# и

полностью реализующая функционал для работы с сервером POP3.

Домашняя страница данной библиотеки http://hpop.sourceforge.net

включает примеры и документацию.

Первое, что нам необходимо сделать – скачать файл OpenPop.dll

и подключить его к проекту. Затем прописать пространства имен:

using OpenPop.Pop3; using System.IO;

22

Page 23: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

24

System.IO нужно для сохранения вложений. Для работы с почтой нам понадобится объект класса Pop3Client.

Pop3Client pop3Client = new Pop3Client();

Для проверки соединения с сервером можно использовать его

свойство Connected, а для отключения от сервера – метод

Disconnect(). Следующую конструкцию рекомендуется вставлять в

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

и зависших подключений: if (pop3Client.Connected) pop3Client.Disconnect();

Подключение к серверу выполняется методами Connect и

Authenticate: pop3Client.Connect(serverName, port, true); pop3Client.Authenticate(login, password);

В данном случае параметр ServerName – строка с именем

сервера, port – число-номер порта подключения, логическое значение

Истина говорит об использовании Ssl. Параметры login и password –

логин и пароль пользователя.

Метод pop3Client.GetMessageCount() вернет общее количество

писем в ящике, а метод pop3Client.GetMessage(<номер сообщения>) –

даст доступ к конкретному письму и вернет объект класса

OpenPop.Mime.Message. В свойстве Headers этого объекта хранится

вся нужная информация о письме. Например, пусть текущее

сообщение сохранено в переменную massage, тогда отображаемое имя

отправителя можно получить следующей конструкцией: message.Headers.From.DisplayName.ToString().

23

Page 24: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

25

Для получения вложений можно использовать метод объекта-

сообщения FindAllAttachments(), который вернет список объектов

OpenPop.Mime.MessagePart. У каждого из его элементов будет важное

свойство FileName – имя файла-вложения, и метод Save,

принимающий в качестве параметра файловый поток и сохраняющий

в него содержимое вложения. Для удаления сообщения можно

воспользоваться конструкцией: pop3Client.DeleteMessage(<номер сообщения>);

Рассмотрим пример кода перебирающего все сообщения в

ящике, выводящий для каждого информацию о том, от кого это

письмо получено, сохраняющий их вложения в указанную папку и

удаляющий просмотренное письмо. Считается, что подключение к

серверу уже установлено ранее: int count = pop3Client.GetMessageCount(); if (count > 0) { for (int i = count; i >= 1; i -= 1) { try { OpenPop.Mime.Message message = pop3Client.GetMessage(i); List<OpenPop.Mime.MessagePart> l= message.FindAllAttachments(); for (int j = 0; j < l.Count; j++) { MessageBox.Show(l[j].FileName); l[j].Save(new FileStream(@"G:\444\"+l[j].FileName,FileMode.CreateNew)); } MessageBox.Show(message.Headers.From.DisplayName.ToString()); } catch (Exception ex) { MessageBox.Show(ex.Message); }

24

Page 25: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

26

pop3Client.DeleteMessage(i); } }

Обратите внимание на необходимость конструкции try-catch как

при обработке писем, так и при подключении к серверу. Еще следует

учесть, что при загрузке больших писем (писем с объемными

вложениями) программа может «тормозить».

Построение графических отчетов

Графики средствами C# можно построить различными

способами: с помощью встроенных средств или с использованием

сторонних библиотек. Мы рассмотрим построение графиков

возможностями технологии GDI+.

GDI (Graphics Device Interface, Graphical Device Interface)

является интерфейсом Windows, предназначенным для представления

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

технологии GDI была разработана GDI+. Это улучшенная среда для

2D-графики, расширенная возможностями сглаживания линий,

использования координат с плавающей точкой, градиентной заливки,

использованием ARGB-цветов и т. п.

В данном разделе мы рассмотрим технику рисования графиков в

оперативной памяти с последующим выводом их на форму. Для

рисования мы будем использовать объект класса Bitmap, а для вывода

на форму – элемент управления PictureBox. Рассмотрим написание

простейшего примера, когда по нажатию на кнопку на форме будет

отображаться график объемов продаж некоторой абстрактной фирмы

за два года и один месяц. Размещаем на форме PictureBox и Button.

Переходим к методу обработки нажатия на кнопку. В нем нам нужно,

во-первых, создать объект класса Bitmap, с размерами,

совпадающими с нашим PictureBox. В данном случае Bitmap

25

Page 26: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

27

выполняет роль холста, а PictureBox – рамки, в которую этот холст

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

Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height); Теперь мы должны создать объект класса Graphics – основного

класса, предоставляющего доступ к возможностям GDI+. Для данного

класса не определено ни одного конструктора. Его объект создается в

ходе выполнения ряда методов применительно к конкретным

объектам, у которых есть поверхность для рисования. Одним из таких

объектов и является Bitmap. Поэтому создаем объект класса Graphics

следующим образом:

Graphics gr = Graphics.FromImage(bmp);

Теперь все вызовы методов отображения фигур будут

отрабатывать на нашей битовой карте. Класс Graphics содержит

множество методов рисования вида Fill* или Draw*, отвечающих за

отображение закрашенных или не закрашенных фигур. Первая

группа методов в качестве одного из параметров принимает объект

типа Brush (кисть), а вторая – объект типа Pen (карандаш).

Исключение – метод DrawString, который отображает текст. Этот

метод в качестве одного из параметров принимает объект Brush.

Как было сказано выше, отчет – всего лишь срез информации из

базы данных, представленный в требуемом пользователе виде.

Поэтому, все данные для отчета берутся из базы данных. Если нам

необходимо построить графический отчет о продажах, то это значит,

что в нашей базе данных должна храниться история операций

продажи, содержащая данные о дате и сумме. В курсовом проекте на

данном этапе вам необходимо выполнить запрос к базе данных, к

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

данные за требуемый пользователем период времени. Предположим,

26

Page 27: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

28

что такая таблица у нас есть, и что данные выгружены в

dataGridView1, как описано в предыдущем разделе.

Для того чтобы график красиво отображался на форме,

подстраиваясь под ее размер нам необходимо ввести коэффициенты

перевода реальных координат в экранные. Для этого любым способом

на ваше усмотрение найдем значение максимального значения y и

максимального значения x. Пусть эти координаты сохранены в

переменные maxX и maxY соответственно. Тогда вводим два

коэффициента перевода координат, рассчитываемых по формулам:

float cdx = (w - 90) / maxX; float cdy = (h - 50) / maxY;

В данном случае w – ширина pictureBox, а h – высота. 90 и 50 –

отступы, необходимые, чтобы оси координат и подписи не упирались

в края. Значения этих отступов подбираются эмпирически.

Так как в GDI+ ось у идет из левого верхнего угла, то нам

необходимо будет инвертировать координаты. Для этого введем

дополнительную переменную

int max = h-25.

25 в данном случае и ниже – эмпирически подобранный отступ.

Нарисуем для начала оси координат. Для этого создадим

переменную-карандаш, изображающую линии со стрелками на

концах:  

Pen p = new Pen(Brushes.Green, 3); p.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;

Теперь, используя эту переменную, изобразим ось y:

       gr.DrawLine(p, (int)(0 * cdx)+25, (int)h-25, (int)(0 * cdx)+25, 0); и ось x:

27

Page 28: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

29

 gr.DrawLine(p,0, (int)(max-0 * cdy),(int)w-25 , (int)(max - 0 * cdy)); 

Как мы видим, здесь используется метод DrawLine. В качестве

параметров он принимает переменную-карандаш, а затем координаты

х, у начальной и х,у конечной точек, которых нужно соединить

линией. Координаты должны быть типа int, поэтому используем

явное приведение к этому типу. Конкретно в этом случае приведение

можно опустить, но чтобы в дальнейшем вывод осуществлялся по

этому шаблону, мы намеренно его усложнили.

Теперь расчертим координатную сетку и выведем подписи по

осям х: for (float x = 0; x <= maxX+1; x++) { gr.DrawString(x.ToString(), new Font("Arial", 10), Brushes.Green, (int)(x * cdx) + 25, max + 10); gr.DrawLine(Pens.Green, (int)(x * cdx) + 25, (int)h - 25, (int)(x * cdx) + 25, 0); }  

и у: for (float y = 1; y <= maxY + 1; y++) { gr.DrawString( (y).ToString(), new Font("Arial", 10), Brushes.Green, 0, (int)(max - (y) * cdy)); gr.DrawLine(Pens.Green, 0, (int)(max - (int) (y * cdy)), (int)w - 25, (int)(max - (int)(y * cdy))); }

10 в данном случае – эмпирически подобранный отступ.

28

Page 29: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

30

Теперь займемся отображением графика. Каждую точку мы

будем отмечать красным кружком, а затем соединять линией.

Поэтому сначала рисуем красный кружок, соответствующий первой

точке графика. Примем, что переменная Y содержит требуемые

данные из первой строчки dataGridView:

gr.FillEllipse(Brushes.Red, (int)( cdx+25), (int)(max-Y * cdy), 5, 5);     

Затем организуем цикл прохода по массиву и, помимо вывода

красной точки, будем соединять предыдущие точки с текущими.

Переменная Y в данном случае содержит числовые данные текущей

строчки dataGridView, а Y_i_1 – предыдущей:             

for (int i = 1; i < mas.Length; i++) { gr.FillEllipse(Brushes.Red, (int)(i* cdx)+25, (int)(max-Y * cdy), 5, 5); gr.DrawLine(new Pen(Brushes.Black,2), (int)( i * cdx)+25, (int)(max- Y * cdy), (int)( (i-1) * cdx)+25, (int)(max- Y_i_1 * cdy)); }  

Если вы сейчас запустите приложение и нажмете на кнопку, то

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

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

чтобы отобразить нарисованную картинку на форме, необходимо

добавить следующую строчку кода:

pictureBox1.Image = bmp;

В итоге на экране вы должны увидеть примерно следующее

(рисунок 7):

29

Page 30: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

31

Рисунок 7. Отображение графика

Если вы хотите вывести график в виде гистограммы, то вместо

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

прямоугольники:

for (int i = 0; i < mas.Length; i++) { gr.FillRectangle(Brushes.Red, (int)(mas[i].X * cdx)+25, (int)(max-mas[i].Y * cdy), 10, (int)(mas[i].Y * cdy)); }

В итоге у вас получится следующее (рисунок 8):

30

Page 31: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

32

Рисунок 8. Отображение гистограммы

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

является единственно верным, но является наиболее простым.

31

Page 32: ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕvenec.ulstu.ru/lib/disk/2014/170.pdf · Демонстрация использования системы

33

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

1. Ватсон, Б. С# 4.0 на примерах / Б. Ватсон. – СПб. : БХВ-

Петербург, 2011. – 608 с. : ил.

2. Воронина, В. В. Технологии автоматизации бизнес-процессов

предприятий : учебное пособие / В. В. Воронина. – Ульяновск :

УлГТУ, 2013. – 204 с.

3. Материалы свободной энциклопедии «Википедиа». –

http://ru.wikipedia.org/wiki/ (режим доступа – свободный, дата

обращения: 28.07.2014)

32