Лекция №

Вид материалаЛекция

Содержание


2.4Вопросы по теме
3Объектно-ориентированное проектирование. Лекция №12 3.1Концепция объектно-ориентированного проектирования
3.2Проектирование структурной схемы программы
Реорганизация иерархии и структуры классов
Организационная структура программы
Подобный материал:
1   2   3   4   5   6   7   8   9   10   11

2.4Вопросы по теме

    1. Определение класса. Синтаксис объявления класса.
    2. Дать определение понятию элемент класса.
    3. Определение конструктора, его виды и назначение.
    4. Особенность использования «друзей класса».
    5. Дать определение производного класса.
    6. Схема изменения атрибутов доступа при наследовании.
    7. Варианты проведения наследования.
    8. Возникновение неоднозначности и способы ее устранения.
    9. Назначение и способы использования перегрузки операций.
    10. Дать определение виртуальной элемент-функции.
    11. Назначение абстрактных классов.
    12. Использование шаблонов классов и функций.

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), необходимые для управления программой.