Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Диплом К

.pdf
Скачиваний:
17
Добавлен:
23.03.2016
Размер:
1.22 Mб
Скачать

dsCache* pCache;

public:

dsPage (...);

int Read (...);

...

};

Для краткости приведены только существенные методы. Реализация метода dsPage::Read() cодержит следующий фрагмент:

int

dsPage::Read (...)

{

 

...

pCache->Read (...);

...

}

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

dsPage* pPage = new dsPage (ѕ);

ѕ

pPage->Read (ѕ);

При вызове метода dsPage::Read() будет послано сообщение Read от объекта с именем pPage к объекту с именем pCache. В этом случае говорят, что объекты pPage и pCache взаимодействуют посредством отношения использования. В приведенном при-

мере объект pCache является исполнителем (получает команды от других объектов. но сам на другие объекты не воздействует), а объект pPage является воздействующим.

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

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

Для иллюстрации отношения включения взят разработанный в ходе проектирова-

ния объект dbBase (база данных). Класс этого объекта имеет следующее описание:

class dbBase

 

{

 

dsFile

dataFile;

btFile

indexFile;

...

 

};

 

Из приведенного фрагмента описания класса dbBase (база данных) видно, что он включает в себя класс dsFile (файл данных) и класс btFile (файл индексов). При образо-

вании каждого экземпляра объекта класса dbBase образуются и все составляющие его объекты–компоненты, поэтому такие объекты называют еще составными.

5.5.3. Класс

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

Объект, исходя из этого, является просто экземпляром класса. Класс служит для пред-

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

ализация – тела методов класса. В соответствии с принципом ограничения доступа ин-

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

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

защищенная – описания, данные здесь, видимы только объектам–потомкам;

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

5.5.4. Отношения меду классами

Классы, как и объекты не редко существуют изолированно. На текущий момент

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

родовидовое – отношение между классом–потомком и классом–предком. Напри-

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

агрегативное – отношение между классами, когда один входит в состав другого.

Например, файл данных является составной частью базы данных;

ассоциативное – смысловое отношение между двумя независимыми классами,

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

теля и база данных этих документов.

Для реализации перечисленных отношений используются следующие механизмы:

наследование;

использование;

объединение;

1В языке С++ используются ключевые слова private, protected и public соответственно.

обобщение.

Отношение наследования – такое отношение между классами, когда один класс повторяет структуру и поведение одного или нескольких других классов. Класс, струк-

тура и поведение которого наследуются, называется предком. Класс, который наследу-

ет, называется потомком.

Главной особенностью наследования является возможность потомку дополнять структуру и изменять поведение предка. Потомок какого-либо класса может служить предком для другого и так далее. В результате получается иерархию классов – схему взаимосвязей между всеми классами программы.

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

Изменение поведения осуществляется в более широких пределах. Возможно пере-

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

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

щихся к одному классу-предку.

Понимание полиморфизма является очень важным для написания объектно-

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

Имеются следующие описания в интерфейсной части классов:

1В С++ возможно переопределение операций, помеченных ключевым словом virtual

class A

 

 

{

 

 

private:

 

 

int

iId;

 

public:

 

 

...

 

 

virtual void

aOperation (int);

};

 

 

class B : public A

{

private:

int iAnotherId;

public:

 

...

 

virtual void

aOperation (int);

};

 

А в секции реализации помещается следующий код:

void

A::aOperation (int i)

{

 

iId = i;

 

};

 

void

B::aOperation (int i)

{

 

A::aOperation (I); iAnotherId = i;

};

Фрагмент программы выглядит таким образом:

A*

pA = new A ();

A*

pB = new B ();

pA->aOperation (1); pB->aOperation (1);

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

Различают также простое наследование (один предок) и множественное (несколь-

ко предков).

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

лизации другой класс (но не наследует его). Это отношение может быть двух видов:

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

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

Отношение объединения используется, когда один класс включает другой (или несколько других) как свою составную часть. В состав класса могут входить объекты одного класса или разных. В первом случае класс называется однородным, а во втором

неоднородным. В [15] доказано, что отношение объединения можно выразить через от-

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

Отношение обобщения является унарным и используется при построении метак-

лассов. Это отношение было введено для теоретической полноты системы отношений классов, но оказалось и практически применимым. В данном отношении классы для ме-

такласса играют такую же роль, как объекты для классов1.

Использование метаклассов легче всего привести на примере. Пусть имеется про-

стейший класс – массив. Так как элементами массива могут объекты разных типов (или классов), то приходится описывать столько классов, сколько типов объектов могут быть элементами массива. Но, имея метаклассы, можно описать такой массив как метакласс,

реализациями которого будут классы (массивы элементов определенного типа), а уже реализацией классов – объекты. На С++ это будет выглядеть так:

template <class T> class Array

{

private:

T* pData; public:

...

virtual void Add (T Item);

...

};

А использование такого метакласса в программе так:

Array<int>

aIntArray;

Array<long>

aLongArray;

Array<MyClass>

aMyClassArray;

5.6. Процесс проектирования.

Основная отличительная черта объектно-ориентированного проектирования – его

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

и сверху–вниз сложились на основе процедурных представлений о строении программ-

1В С++ метаклассы реализуются путем создания классов с типом в качестве параметра. Для этих

целей введено ключевое слово template.

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

атации, не может осуществляться только снизу-вверх или только сверху–вниз, а должно быть возвратным (итеративным). Именно итеративное развитие логических и физиче-

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

На основании вышеизложенного материала составляется перечень событий, соот-

ветствующий процессу объектно-ориентированного проектирования:

идентификация классов и объектов;

описание семантики классов и объектов;

разработка связей между классами и объектами;

реализация классов и объектов.

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

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

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

рования.

5.6.1. Идентификация классов и объектов Действий на этом шаге два – создание абстракций, принадлежащих проблемной

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

Методы для решения этих задач описаны в подразделе 5.4.3.

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

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

5.6.2. Определение семантики классов и объектов.

Этот шаг является основным и самым трудоемким. С этого момента процесс объ-

ектно-ориентированного проектирования становится итеративным. Главной задачей яв-

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

вания.

Результатом являются прототипы разработанных классов (интерфейсные секции описания).

5.6.3. Разработка связей между классами и объектами.

Этот шаг – продолжение предыдущего, но определяется механизм взаимодействия между объектами системы. Во-первых должны быть определены типы отношений меж-

ду классами и объектами (наследование, использование и т.д.). Типы отношение между объектами и классами рассмотрены соответственно в подразделах 5.5.2. и 5.5.4. Во-

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

5.6.4. Реализация классов и объектов.

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

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

5.7. Достоинства и недостатки

объектно-ориентированного проектирования

Объектно-ориентированное проектирование, как уже говорилось, не является ре-

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

ориентированного подхода. Ниже они сведены воедино.

К достоинствам объектно-ориентированного подхода можно отнести:

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

граммного обеспечения;

значительное снижение трудоемкости модификации сложных программных си-

стем;

снижение риска при разработке больших проектов;

создание более открытых систем.

Объектно-ориентированный подход, как и любой другой подход к проектирова-

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

увеличение требований к объему оперативной памяти;

снижение быстродействия;

большие начальные затраты.

Два первых недостатка имеют чисто техническое значение. Действительно, в

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

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

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

стек).

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

Принцип ограничения доступа приводит к созданию отдельных операций для до-

ступа к защищенным данным объекта, а это снова вызов процедуры.

Реализация отношения наследования классов и полиморфизма требует увеличения времени на вызов операций объекта по сравнению со временем вызова процедуры. До-

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

вов операций многочисленных классов-предков.

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

ектирования в создание инструментов для разработки (объектно-ориентированных биб-

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

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

освоивших эту технологию. Следовательно, значение выделенных недостатков будет

снижаться.

6. ОРГАНИЗАЦИЯ ТРУДА И ЭКОНОМИКА

6.1. Построение сетевого графика и технико-экономическое обоснование разработ-

ки программного продукта

Эффективным методом организации и ведения сложных научно-иссле-

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

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

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

го события – стрелкой.

Работа, не требующая затрат времени, называется фиктивной и обозначается пунктирной линией. Критический путь – это последовательность работ от исходного события до завершающего, требующая наибольшего времени для своего выполнения.

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

tmin – оптимистическая оценка времени выполнения работы; tmax – пессимистическая оценка времени выполнения работы;

tож – наиболее вероятное время выполнения работы, которое определяется по фор-

муле (51).

tî æ

3tmin 2tmax

(51)

5

 

 

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

 

t

max

t

min

2

 

t2

 

 

 

 

(52)

 

 

6

 

 

 

 

 

 

 

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

Ранний срок наступления события tpj – это минимальный срок, необходимый для выполнения всех работ, предшествующих данному событию.

Ранний срок наступления событий определяется по формуле (53).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]