Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие-ООП - копия.doc
Скачиваний:
20
Добавлен:
17.08.2019
Размер:
907.78 Кб
Скачать

Этапы разработки оо программ. Лекция №5

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

"Ключ к искусному проектированию можно подобрать, если непосредственно моделировать некоторые аспекты "окружающей действительности", то есть "поймать" понятия из данной прикладной области в виде классов, представить зависимости между классами формальным образом, например, в виде наследования, и проделывать это повторно на разных уровнях абстракции"[2].

Разработка программ экономических задач, исходя из изложенных ранее их особенностей, состоит из следующих этапов:

- проектирование структуры программы, включающее проектирование структурной схемы программы, представляющей собой иерархию взаимосвязанных классов, и интерфейсов классов;

- программирование классов.

Этап проектирования структурной схемы программы представляет собой итерационный процесс и включает следующие подэтапы:

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

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

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

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

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

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

  1. Дать определение инкапсуляции.

  2. Дать определение наследования.

  3. Дать определение полиморфизма.

  4. Дать сравнительную характеристику процедурного и объектно-ориентированного программирования.

  5. Перечислить основные этапы разработки программ.

2Методы объектно-ориентированного программирования. Лекция №6.

2.1Инкапсуляция

Инкапсуляция (encapsulation) - это объединение данных и функций для работы с этими данными в классы. Метод инкапсуляции реализуется механизмом классов.

Класс

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

Синтаксис определения класса:

class cl //cl - имя класса (идентификатор типа)

{

atr: //atr - атрибут доступа (private,public,protected)

tip1 per1; //элементы-данные

[...]

tf1 f1(tp1 p1[,...]);//прототипы элементов-функций

[...] //...новые атрибуты и новые элементы

[...] //конструкторы и деструкторы

[...] //друзья класса

};

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

Синтаксис объявления объекта класса: cl obj;

Атрибуты (спецификаторы доступа) осуществляют управление доступом к элементам класса:

private - закрытые элементы, доступны только для элементов-функций данного класса и друзей класса;

public - открытые элементы, доступны для любых функций;

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

По умолчанию действует private.

Структуры и объединения рассматриваются как типы классов с атрибутом доступа public.

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

Пример:

//файл заголовков //файл кодов

class akt void akt::vvod()

{ {

void vvod(); ...

}; }

Элементами класса служат элементы-данные и элементы-функции.

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

Элементы-данные характеризуются следующими свойствами:

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

  • не могут быть объектами данного класса, но могут быть указателями или ссылками на объекты данного класса;

  • не могут быть явно инициализированы в теле класса (можно с помощью конструктора, см. ниже);

  • не могут иметь спецификаторы auto, extern, register;

  • могут иметь статический класс памяти (static); такие элементы-данные совместно используются всеми объектами данного класса (существует только по одному экземпляру таких данных); они должны быть объявлены в определении класса в файле заголовков и определены в файле кодов, где могут быть инициализированы (нельзя инициализировать в теле класса и элементах-функциях);

  • могут быть именными константами (const); должны быть инициализированы (например, с помощью конструктора).

Пример:

//файл заголовков //файл кодов

class listok long listok::nadbavka;

{... ...

static long nadbavka;

const char* otdel;

};

Элементы-функции - это функции, объявленные в определении класса и обрабатывающие элементы-данные класса.

Элементы-функции характеризуются следующими свойствами:

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

  • имеют доступ ко всем элементам данного класса независимо от их расположения в теле класса;

  • каждая не статическая элемент-функция при ее вызове объектом получает неявно объявленную переменную this (зарезервированное слово), которая является указателем на объект класса;

  • могут иметь статический класс памяти (static); такие функции могут обращаться только к статическим элементам класса и не могут быть объявлены const и virtual; они не связаны с объектами класса, т.е. при вызове не получают указатель this;

  • могут быть константными (const ставится за списком параметров функции); такие функции не могут изменять значения элементов-данных класса, что ведет к более устойчивому тексту программы.

Существуют еще специальные элементы-функции класса (конструкторы и деструкторы), служащие для создания, копирования, преобразования и уничтожения объектов класса (см. ниже).

Элементы класса имеют область действия этого класса. Доступ к элементам класса может выполняться следующими способами:

  • прямой доступ (по имени элемента) - из элементов-функций этого класса или из производных классов;

  • через объект класса - из внешних функций или из других классов, например, во внешней функции имеем obj.sozdanie(); , где obj - объект класса ved и sozdanie() - элемент-функция класса ved;

  • через указатель на объект класса, например, pobj->vvod(), где pobj - указатель на объект obj класса akt (akt* pobj=&obj);

  • через имя класса с операцией разрешения видимости (::), например, akt::chtenie_zap() или cena::chtenie_zap() при доступе из производного класса ved .

Схема доступа к элементам класса cl1 (без наследования):

class cl1 //внешняя функция или

{ //функция другого класса

private: cl1 obj; //или cl1* p=&obj;

int a; //доступ только к c и z()

void x(); //например,

protected: obj.z(); //или p->z();

int b; obj.c=10;//или p->c=10;

void y();

public:

int c;

void z();

}; //любая функция класса cl1 имеет доступ к a, x(), b, y(), c, z()

Остановимся на понятии указателя this. Каждая не статическая элемент-функция класса имеет доступ к объекту, для которого она вызвана, с помощью переменной this (неявного указателя). При вызове элемента-функции указатель this инициализируется адресом конкретного объекта класса. Например, при вызове obj.z() в стек загружается значение &obj, а в теле функции оператор a=10 интерпретируется как (&obj)->a=10. Обычно указатель this не используется явно. Но иногда он может быть полезен, например, при организации списков для возврата указателя ( return (this) ) или ссылки ( return* this ) на какой-то объект класса. Статическая элемент-функция класса не имеет указателя this, т.е. не связывается с конкретным объектом класса. Поэтому, для доступа к ней необходимо имя класса с операцией разрешения видимости.