Лекция №
Вид материала | Лекция |
- «Социальная стратификация и социальная мобильность», 46.19kb.
- Первая лекция. Введение 6 Вторая лекция, 30.95kb.
- Лекция Сионизм в оценке Торы Лекция Государство Израиль испытание на прочность, 2876.59kb.
- Текст лекций н. О. Воскресенская Оглавление Лекция 1: Введение в дисциплину. Предмет, 1185.25kb.
- Собрание 8-511 13. 20 Лекция 2ч режимы работы эл оборудования Пушков ап 8-511 (ррэо), 73.36kb.
- Концепция тренажера уровня установки. Требования к тренажеру (лекция 3, стр. 2-5), 34.9kb.
- Лекция по физической культуре (15. 02.; 22. 02; 01. 03), Лекция по современным технологиям, 31.38kb.
- Тема Лекция, 34.13kb.
- Лекция посвящена определению термина «транскриптом», 219.05kb.
- А. И. Мицкевич Догматика Оглавление Введение Лекция, 2083.65kb.
2.4Вопросы по теме
- Определение класса. Синтаксис объявления класса.
- Дать определение понятию элемент класса.
- Определение конструктора, его виды и назначение.
- Особенность использования «друзей класса».
- Дать определение производного класса.
- Схема изменения атрибутов доступа при наследовании.
- Варианты проведения наследования.
- Возникновение неоднозначности и способы ее устранения.
- Назначение и способы использования перегрузки операций.
- Дать определение виртуальной элемент-функции.
- Назначение абстрактных классов.
- Использование шаблонов классов и функций.
3Объектно-ориентированное проектирование. Лекция №12
3.1Концепция объектно-ориентированного проектирования
"Ключ к искусному проектированию можно подобрать, если непосредственно моделировать некоторые аспекты "окружающей действительности", то есть "поймать" понятия из данной прикладной области в виде классов, представить зависимости между классами формальным образом, например, в виде наследования, и проделывать это повторно на разных уровнях абстракции"[2].
Понятия не существуют изолированно, а находятся во взаимосвязи друг с другом, поэтому, и классы разрабатываемой системы должны проектироваться не изолированно, а совместно в виде одной единицы проектирования. Введем термин компонента в качестве единицы проектирования: "Обычно разрабатывается сразу множество взаимосвязанных классов. Такое множество часто называют библиотекой классов, или компонентой"[2].
Что выбрать в качестве компонент, классов-понятий и каковы основные принципы проектирования программ в информационных системах в экономике и управлении? Можно предложить следующую концепцию проектирования.
Информационная система в экономике и управлении, реализованная в виде комплекса информационных рабочих мест управленческого персонала предприятия, решает ряд взаимосвязанных задач с получением документов, позволяющих выполнять функции управления: планирование, учет, контроль и регулирование. В качестве компонент можно выбрать информационные рабочие места управленческого персонала, информационные подсистемы управления различного уровня.
Можно рекомендовать в качестве имен классов компоненты разрабатываемого информационного рабочего места управленческого персонала - названия основных планово-учетных документов, необходимых в разрабатываемой системе. Документы являются элементами системы управления и находятся во взаимосвязи друг с другом, поэтому, и классы разрабатываемой системы должны проектироваться совместно в виде одной единицы проектирования - компоненты.
Разработка компоненты включает следующие этапы:
- проектирование структуры компоненты, включающее проектирование структурной схемы программы, представляющей собой иерархию классов компоненты, и интерфейсов классов;
- программирование компоненты.
Этап проектирования структуры компоненты представляет собой итерационный процесс и включает следующие подэтапы:
- выбор классов компоненты: в качестве имен классов взять названия планово-учетных документов;
- определение состава классов: в качестве элементов-данных взять реквизиты документа, в качестве элементов-функций - набор операций (задач) по обработке документа;
- составление начальной иерархии классов: выявить взаимозависимость документов и спроектировать структурную схему компоненты, используя наследование и полиморфизм. Структурная схема компоненты может быть представлена ориентированным графом без петель, где узлами являются классы, а дугами - направления наследования. Простое наследование соответствует иерархической декомпозиции понятий. Множественное наследование соответствует решению функциональной задачи, когда из нескольких документов образуется новый документ.
- реорганизация иерархии классов, основанная на принципах декомпозиции и локализации: выделить общие элементы нескольких классов в новый базовый класс, разделить класс на несколько новых.
Выбор классов-понятий и иерархии классов компоненты не является тривиальной задачей, требует совместной дискуссии менеджеров различного уровня. Неудачным может оказаться как чрезмерное размножение классов, так и группировка в одном классе многих понятий.
"Постарайтесь запомнить, что цель проектирования заключается в том, чтобы построить не перегруженную ненужными подробностями модель системы, у которой, тем не менее, имеется соответствующее число уровней абстракции. Сохранять равновесие между простотой и общностью - непростая задача"[3].
Этапы разработки программ задач методом объектно-ориентированного программирования рассмотрим на примере системы учета выполнения работ.
3.2Проектирование структурной схемы программы
Составление начальной иерархии и структуры классов
Выберем в качестве имен классов входящие в условие задачи наименования документов, циркулирующие в разрабатываемой системе. В нашем случае - это акты, расценки, ведомости, и, следовательно, классы - это akt, cena, ved.
Класс ved является производным классов akt и cena.

Рис. 3.1. Иерархия классов для задачи учета выполнения работ
Определим для каждого класса совокупность элементов-данных и элементов-функций для их обработки.
Во-первых, каждый класс содержит реквизиты документа:
класс akt - char tabn[10], char fio[30], char vid[10], float objem,
класс cena - char vid[10], char naim[30], float rascenka,
класс ved -char tabn[10], char fio[30], char vid[10], float objem, char naim[30], float stoim, float itog.
Во-вторых, по условию задачи требуется хранить исходные документы (Акты и Расценки) в базе данных с индексной организацией. Следовательно, необходимо иметь в классах akt и cena структуры индексных массивов (struct tip_index) и элементы-функции для их обработки: init_ind (инициализация элемента), init_kol (инициализация количества элементов), dob_ind (добавление элемента), poisk_ind (поиск элемента), cor_ind (корректировка элемента), sort_ind (сортировка массива). Необходимы также функции открытия файлов данных и инициализации (создания) индексных массивов при запуске программы (init).
В-третьих, необходимо выполнять с помощью подменю следующие операции над исходными документами ("Акт", "Расценка"): ввод документов; поиск документов; замена содержимого документов; удаление документов. Ввиду того, что алгоритмы операций поиска, замены и удаления достаточно близки, используем для их реализации одну функцию с параметром, который определяет вид операции correct(int). Итак, для классов akt и cena необходимы функции sozdanie - для ввода нового документа в базу данных и correct(int) для корректировки базы данных, а также дополнительные функции zapis_zap(int) и chtenie_zap(int) для записи/чтения документов из базы данных. Для класса ved необходима функция sozdanie, создающая в результате расчета стоимостную ведомость.
В-четвертых, необходимы также для классов akt и cena еще функции пользовательского интерфейса: вывод формы документа с именем опции меню formecran(char*), ввод содержимого документа с клавиатуры vvod() и вывод содержимого документа vyvod(). Для класса ved также необходима функция formecran(char*).
Поскольку управление задачей осуществляется с помощью меню, файл управления, не являющийся классом, будет содержать главную функцию main, функции menu, podmenu, и объявление объектов классов, с помощью которых будут вызываться соответствующие элементы-функции классов.
В файле управления будем вводить с клавиатуры имена файлов базы данных, поэтому необходимы еще переменные imf_akt и imf_cena. Функция podmenu(int,int) имеет два параметра для определения местоположения формы подменю на экране и вызова функций классов akt и cena.
Реорганизация иерархии и структуры классов
Реорганизация иерархии классов заключается либо в выделении общих элементов нескольких классов в новый класс, либо в разделении класса на несколько новых. Анализ структуры классов akt и cena позволяет выделить их общую часть, относящуюся к индексному массиву, в новый базовый класс ind. Этот класс не является классом-понятием данной прикладной области, он предложен программистом и определяет специфику организации базы данных. Таким образом, в иерархии классов появляются так называемые системные классы.
Класс ved, являясь производным от классов akt и cena, наследует элементы-данные этих классов. Поэтому, удалим из класса ved элементы-данные char tabn[10], char fio[30], char vid[10], float objem, char naim[30].
Реорганизуем исходную иерархию классов (рис. 3.2).

Рис. 3.2. Структура исходной иерархии классов
Программная реализация реорганизованной структуры классов будет иметь следующий вид:
Класс ind:
struct tip_index //index[100]-индексный массив,
{ //массив структур типа tip_index
char kluch[max_pole];//ключ записи
int nomer; //номер записи
} index[100]; //100-макс. кол. элем. массива
int kol; //кол. элем. массива
char* imf; //имя файла данных
init_ind() //функция инициализ. элемента
init_kol() //функция инициализ кол. элем.
dob_ind() //функция добавления элемента
poisk_ind() //функция поиска элемента
cor_ind() //функция коррект. элемента
//конструкторы...
Класс akt: Класс cena:
char tabn[10]; char vid[10];
char fio[30]; char naim[30];
char vid[10]; float rascenka;
float objem;
void zapis_zap(int); void zapis_zap(int); //запись в файл
void chtenie_zap(int); void chtenie_zap(int); //чтение из файла
void init(); void init(); //инициализация инд.массива
void sozdanie(); void sozdanie(); //создание документа
void correct(int); void correct(int); //корректир.документа
void formecran(char*); void formecran(char*);//вывод формы док.
void vvod(); void vvod(); //ввод документа
void vyvod(); void vyvod(); //вывод документа
//конструкторы... //конструкторы...
Класс ved: Файл управления:
float stoim char imf_akt[13];
float itog; char imf_cena[13];
void sozdanie; ved obj(imf_akt,imf_cena); //объект
void formecran(char*); void podmenu(int,int){...} //подменю
//конструктор... menu(){...} //меню
main() //главная функция
Организационная структура программы
Для каждого класса рекомендуют иметь два файла: файл заголовков или файл интерфейса и файл кодов или файлом реализации.
В нашей программе будем иметь: для класса ind - файлы index.hpp и index.cpp, для класса akt - akt.hpp и akt.cpp, для класса cena - cena.hpp и cena.cpp, для класса ved - vedom.hpp и vedom.cpp.
Файл управления (upr.cpp) содержит внешние функции (main, menu, podmenu), необходимые для управления программой.