Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Виды взаимодействия классов






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

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

· наследование,

· агрегация (включение),

· использование,

· ассоциация.

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

Рис. 17.2. Обозначение класса на диаграммах: а – подробное, б – упрощенное

Базовый элемент таких диаграмм – класс – изображается в виде прямоугольника, разделенного на три ячейки: в верхнюю помещается название класса, в среднюю – свойства, в нижнюю – методы. На рис. 17.2, а представлено графическое изображение класса Printer. Допускается также упрощенное обозначение класса (рис. 17.2, б) на диаграммах: указывается только название класса без перечисления его свойств и методов.

Связи между классами обозначаются прямыми линиями. Для каждого вида взаимодействия используются определенные типы линий (рис. 17.3).

Рассмотрим виды взаимодействия классов.

Наследование, т. е. создание нового класса на базе существующего, рассмотрено выше. Класс-наследник также может иметь наследников, его наследники, в свою очередь, также могут иметь наследников, и так далее, в результате может быть выстроена иерархическая структура – дерево классов. Основу любой библиотеки классов (объектов), объектной модели программы, например, браузера, составляет иерархия классов. Пример графического представления наследования приведен на рис. 17.4.

Рис. 17.3. Обозначения вызовов взаимодействия классов

Рис. 17.4. Диаграмма наследования

Агрегация – включение объектов одного класса в состав другого класса; cвязь однонаправленная (рис. 17.5).

Код программы, отражающий агрегацию классов, следующий:

class A

{ …

void met_A();

}

class B

{ …

A b1; //В состав класса B включен объект класса A

}

Рис. 17.5. Диаграмма агрегации классов

Включенный объект b1 не существует самостоятельно, он создается внутри объекта класса B. Доступ к включенному во внешний класс объекту осуществляется только через объект внешнего класса:

B objB;

objB.b1.met_A();

Использование или клиент-серверное взаимодействие – это однонаправленная связь двух самостоятельных объектов, один из которых (сервер) предоставляет свои услуги другому (клиенту). Клиент-серверное взаимодействие (рис. 17.6) осуществляется через использование в методах клиента обращения к объекту-серверу.

Если класс A выступает в роли сервера, а класс B – клиента, то объект класса A передается в методы класса B в виде значения или адреса:

class A

{

}

class B

{

< return_type> met_B(A* a);

}

Рис. 17.6. Диаграмма использования
(клиент-серверного взаимодействия)

Объект класса B использует ресурсы объекта класса A и может изменить состояние объекта класса A (рис. 17.6)

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

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

class A

{

B* varA; //Указатель на один объект класса B

}

class B

{

A** varB; //Указатель на массив объектов класса A

}

В этом примере со стороны класса B в связи участвует один объект, а со стороны класса A – несколько объектов (рис. 17.7).

Рис. 17.7. Диаграмма ассоциации классов:
1, N - количество объектов,
участвующих в связи от класса B и A соответственно

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

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

В заключение рассмотрим диаграмму классов, отображающую объектную модель рабочего места пользователя (рис. 17.8).

Рис. 17.8. Диаграмма классов рабочего места пользователя

На диаграмме представлены пять классов, между которыми установлены различные виды взаимодействия. Класс Пользователь представляет собой набор настроек пользователя и взаимодействует с классами Компьютер и Принтер. Между Пользователем и Компьютером устанавливается ассоциативная связь один-ко-много, так как представители обоих классов – независимые объекты, общение между объектами двунаправленное, а количество пользователей, работающих на компьютере, может быть любым. Между Пользователем и Принтером установлено клиент-серверное взаимодействие, так как оба объекта существуют независимо друг от друга, направление их взаимодействия одностороннее – от Пользователя к Принтеру. Классы Принтер и Компьютер представляют собой реальные устройства, имеющие некоторые общие свойства. Эти общие характеристики выделены в абстрактный класс Устройство, использующийся в качестве базового при создании классов Принтер и Компьютер. Абстрактный класс имеет особое назначение: он предназначен для создания классов-наследников и не используется в программе для создания объектов. На диаграмме классов абстрактный класс обозначен буквой А. Пятый класс Картридж представляет собой составную часть Принтера и не является самостоятельным объектом, поэтому между этими двумя классами выбран тип взаимодействия агрегация (включение).

 

17.8. Способы графического представления
объектно-ориентированной задачи

В объектно-ориентированном анализе можно выделить три группы диаграмм [13].

Диаграмма сущность-связь – ERD-диаграмма (Entity-Relationship Diagram). Примером таких диаграмм могут служить диаграммы классов, простейшие примеры которых приведены на рис. 17.4 – рис. 17.8, а также диаграммы объектов, модулей. Диаграммы демонстрируют статические связи между однотипными сущностями (классами, объектами и т. д.). Сущности на такой диаграмме изображаются прямоугольником, линии, соединяющие прямоугольники, обозначают связи между сущностями.

Диаграмма потоков данных – DFD-диаграмма (Data Flow Diagram). Пример такой диаграммы – хорошо знакомые нам блок-схемы алгоритмов. Узлы такой диаграммы (прямоугольники, ромбы, параллелограммы и т. д.) обозначают отдельные действия над данными или подпрограммы, линии, соединяющие их, обозначают направление потока данных и, соответственно, последовательность выполнения действий.

Диаграммы переходов состояний – STD-диаграммы (State Transition Diagram). Узлы такой диаграммы представляют собой допустимые состояния объекта, а соединяющие их линии – возможность и направление перехода из одного состояния в другое. На диаграмме также могут быть отмечены события, вызывающие данный переход, или соответствующие им методы. Кроме того, на диаграмме можно отметить последовательность переходов, тогда диаграмма будет также описывать поведение объекта.

Для примера рассмотрим объект – принтер. Ранее у объекта были выявлены два свойства, изменяющие свои значения во время использования объекта – is_on (обозначающее, включен ли принтер) и status (определяющее, печатает принтер в данный момент или нет) – и три допустимых состояния, исключив из допустимых состояний возможность печати при выключенном принтере (рис. 17.9).

Рис. 17.9. STD-диаграмма переходов

Такие диаграммы – основа современного языка, предназначенного для описания объектно-ориентированной задачи – языка UML (Unified Modeling Language – универсальный язык моделирования) [11, 14].

 

17.9. Особенности реализации объектно-ориентированных программ
на языке С++ в различных средах

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

Универсальной средой, позволяющей создавать объектно-ориентированные программы для MS-DOS и 16-разрядные приложения под Windows, остается продукт Borland C++ 3.1 фирмы Borland. В этой среде можно создавать программы, весь код которых сосредоточен в одном файле, а также можно создавать проекты.

Более новые продукты – Borland C++ 5.x предназначены для создания полноценных приложений для Windows 9.x. Среда имеет элементы автоматизации работы программиста – средства для модульного построения программы и создания каркаса проекта, графический редактор для визуального редактирования диалоговых панелей, меню, подключаемые библиотеки BWCC (библиотека управляющих элементов), OWL (иерархическая библиотека классов, предназначенных для создания элементов графического интерфейса приложения), MFC (библиотека классов фирмы Microsoft). Возможно создание не только приложения (*.exe), но и динамической библиотеки (*.dll). Разработка программы ведется только на основе проекта.

Еще более новый и совершенный продукт – C++ Builder обладает достоинствами предыдущей среды, а также формирует вспомогательную часть кода программы (создает заготовку для кода класса, функции), позволяет использовать современные библиотеки, а также имеет мощный и удобный инструмент для настройки свойств элементов интерфейса пользователя программы (диалоговые панели, кнопки и т. д.). Разработка программы ведется только на основе проекта.

Фирма Microsoft также создала современную среду для разработки 32-разрядных приложений под Windows – Microsoft Visual C++, аналогичную по своим возможностям продукту Borland C++ Builder. Разработка программы ведется только на основе проекта.

Microsoft Visual C++ 6.0 входит в состав интегрированной среды разработки Microsoft Visual Studio, позволяющей создавать приложения различного назначения и с использованием различных языковых средств, включающей в себя следующие компоненты для разработки приложений и баз данных: Visual C++, Visual Basic, Visual J++, Visual FoxPro.

Автоматическую генерацию части кода программы выполняют два приложения: AppWizard (Мастер приложений) создает каркас проекта и MFC ClassWizard (Мастер классов) генерирует служебную часть кода класса.

В дополнение к Microsoft Visual Studio как отдельный продукт создана справочная система по программированию с помощью компонентов Microsoft Visual Studio – MSDN (Microsoft Developers Network).

Новейший продукт фирмы Microsoft – Visual Studio.NET. Этот продукт стал преемником Visual Studio, при этом в его состав включены новые версии компиляторов. Так, компилятор С++ в среде NET в большей степени соответствует современному стандарту языка С++, использует новую версию стандартной библиотеки С++, весьма требователен к совместимости типов данных. Добавлены новые и усовершенствованы прежние мастера для автоматической генерации кода программы: Application Wizard, MFC Class Wisard, Event Handler Wizard (Мастер редактирования обработчиков сообщений), Add Member Variable Wizard (Мастер добавления функции) и т. д.

 

 

Глава 18. БИБЛИОТЕКИ ЯЗЫКА C++

18.1. Стандартная библиотека языка C++
18.2. Библиотека Win32 API
18.3. Библиотека OWL
18.4. Библиотека VCL
18.5. Библиотека CLX
18.6. Библиотека MFC
18.7. Библиотека OpenGL

Библиотеки предоставляют программисту возможность использовать при разработке программы готовые фрагменты кода [10, 15]. В библиотеки могут быть включены подпрограммы, структуры данных, классы, макросы. Для языка C++ разработано много библиотек различного назначения. Некоторые библиотеки используются по умолчанию, их подключение к проекту осуществляется автоматически (библиотека времени выполнения – RTL, Runtime Library). Другие библиотеки можно использовать по требованию (в консольном приложении VC++ – библиотека MFC), для этого следует подключить директивой include их заголовки и/или сделать соответствующие настройки проекта. Файлы, содержащие библиотеки, имеют расширение *.lib (статическая) и *.dll (динамическая).

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

 

18.1. Стандартная библиотека языка C++

Стандартная библиотека языка C++ (C++ Standard Library) – межплатформенная библиотека (Windows, Linux), основу которой составляет стандартная библиотека шаблонов STL (Standard Template Library)[5], включающая:

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

· стандартную библиотеку языка C,

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

· структуры данных, называемые контейнерами, и алгоритмы их обработки (сортировка, слияние),

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

Компоненты библиотеки подключаются с помощью заголовочных файлов:

< vector> – одномерный массив элементов;

< list> – двусвязный список элементов;

< queue> – очередь элементов;

< stack> – стек элементов;

< ctime> – дата и время;

< algorithm> – основные алгоритмы;

< cstdlib> – функции обработки данных (поиск, сортировка, обработка строк в стиле C, генератор случайных чисел);

< string> – строка;

< iostream> – стандартные потоки ввода/вывода;

< complex> – комплексные числа;

< c_math> – общие математические функции;

< new> – работа с динамической памятью.

Имена компонентов библиотеки определены в пространстве имен std. Пространство имен представляет собой область видимости имен, это средство логического группирования идентификаторов (п.16.5).

Приведем пример программы, использующей элементы стандартной библиотеки C++ (компоненты библиотеки STL).

Программа в заданном наборе чисел подсчитывает количество чисел, имеющих значение 5, 6, меньше 8:

//подключение заголовочных файлов библиотеки STL

#include < vector>

#include < algorithm>

#include < iostream>

#include < functional>

using namespace std;

int main ()

{

int sequence[10] = {1, 2, 3, 4, 5, 5, 7, 8, 9, 10};

int i=0, j=0, k=0;

//

//Создание вектора

vector< int> v(sequence+0, sequence+10);

i=count(v.begin(), v.end(), 5); //Считает пятерки

j=count(v.begin(), v.end(), 6); //Считает шестерки

//

// Считает значения меньшие, чем 8

k=count_if(v.begin(), v.end(), bind2nd(less< int> (), 8));

cout < < i < < " " < < j < < " " < < k < < endl;

return 0;

}

Ответ: 2 0 7.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.