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

Буч Г. - Объектно-ориентированный анализ и проектирование с примерами приложений на C++ - 2001

.pdf
Скачиваний:
1496
Добавлен:
13.08.2013
Размер:
5.88 Mб
Скачать

Абстракции

Переменные экземпляра Методы

Да Да Да Да

 

экземпляра Переменные класса

 

 

Методы класса

 

 

 

 

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

Переменных Методов

Открытые, защищенные, закрытые

 

 

Открытые, защищенные, закрытые

 

 

 

Модульность

Разновидности модулей

файл

 

 

 

Иерархии

Наследование Шаблоны

Множественное

 

Метаклассы

Да

 

 

Нет

 

 

 

Типизация

Сильная типизация Полиморфизм

Да Да(одиночный)

 

 

 

Параллельность

Многозадачность

Непрямая (посредством классов)

 

 

 

Сохраняемость

Долгоживущие объекты

Нет

 

 

 

Пример

Снова вернемся к задаче определения фигур. В C++ принято описывать интерфейсную часть классов в заголовочных файлах. Мы можем написать:

struct point { int x; int у; };

class Shape { public: Shape();

void setCenter (Point p}; virtual void draw() = 0; Point center 0 const;

private

Point theCenter;

};

class Circle : public Shape { public:

Circle();

void setRadius(int r); virtual void draw(); int radius() const;

private:

int theRadius; };

class Rectangle : public Shape { public:

Rectangle();

void setHeight(int h); void setWidth(int w); virtual void draw(); int height () conat; inc width () const;

private:

int theHeigh;

int TheWidth;

};

class SolidRectangle : public Rectangle { public:

virtual void draw(); };

Определение C++ не предполагает наличия библиотеки классов. Для наших целей мы предположим наличие программного интерфейса Х Windows и

глобальных объектов Display, window, GraphlcsContext (требуемых xlib).

Теперь можно завершить разработку, написав в отдельном файле реализацию методов, перечисленных выше:

Shape::Shape()

{

theCenter.x = 0; theCenter.y = 0;

};

void Shape::getCenter(Point p)

{

theCenter = p; };

Point Shape::center() const

{

return theCenter; };

Circle::Circle() : theRadius(0) {};

void Circle: :setRadius( int r)

{

theRadius = r; };

void Circle::draw()

{

int x = (center ().x - theRadius);

int Y = (center().у - theRadius);

XDrawArc(Display, Window, GraphicsContext, X, Y, (theRadius • 2), (theRadius * 2), 0, (360 • 64));

};

int Circle::radius() const

{

return theRadius;

};

Rectangle::Rectangle() : theHeight(0), theWidth(0) {};

void Rectangle: :setHeight( int h)

{

theHeight = h; };

void Rectangle: :setWidth( int w)

{

theWidth = w; };

void Rectangle::draw()

{

int X = (center().x - (theWidth / 2));

int Y = (center ().у - (theHeight / 2));

XDrawRectangle (Display, Window, GraphicsContext, X, Y, thewidth, theHeight);

};

int Rectangle: : height() const

{

return theHeight; };

int Rectangle: : width () const

{

return thewidth; };

void SolidRectangle::draw()

{

Rectangle::draw() ;

int x - (centerO.x - (width() / 2)); int Y - (center().y - (height() / 2));

gc oldGraphicsContext = GraphicsContext; XSetForeground(Display, OraphicsContext, Gray); XDrawFilled(Display, Window, GraphicsContext, X, Y, width (), height());

GraphicaContext = OldGraphicsContext;

};

Ссылки

Основной ссылкой по C++ является "Annotated C++ Reference Manual"

Эллис и Страуструпа [15]. Кроме того, Страуструп [16] предложил углубленный анализ языка и его использования в контексте объектноориентированного проектирования.

А.5. Common Lisp Object System (CLOS)

Происхождение

Существуют буквально десятки диалектов языка Lisp, включая

MacLisp, Standard Lisp, SpiceLisp, S-1 Lisp, ZetaLisp, Nil, InterLisp и Scheme. В

начале 80-х годов под воздействием идей объектно-ориентированного программирования возникла серия новых диалектов Lisp, многие из которых были ориентированы на представление знаний. Успех в стандартизации Common Lisp стимулировал попытки стандартизировать объектноориентированные диалекты в 1986 году.

Идея стандартизации была поддержана летней конференцией ACM по Lisp и функциональному программированию 1986 года, в результате чего

была создана специальная рабочая группа при комитете X3J13 ANSI (комитет по стандартизации Common Lisp). Поскольку новый диалект должен был стать надстройкой над Common Lisp, он получил название Common Lisp Object System (Объектная система Common Lisp) или, сокращенно, - CLOS. Возглавил комитет Дэниел Бобров (Daniel Bobrow), а его членами стали Соня Кин (Sonya Keene), Линда де Мичил (Linda DeMichiel), Патрик Дассад (Patrick Dussud), Ричард Габриель (Richard Gabriel), Джеймс Кемпф (James Kempf), Грегор Кисазлес (Gregor Kicazles) и Дэвид Мун (David Moon).

Серьезное влияние на проект CLOS оказали языки NewFlavors и CommonLoops. После двухлетней работы, в 1988 году была опубликована полная спецификация CLOS.

Обзор

Кип отмечает, что в проекте CLOS ставились три основные цели. CLOS должен:

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

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

проектироваться как расширяемый протокол, так, чтобы можно было изменять его поведение, тем самым стимулируя дальнейшие исследования в области объектно-ориентированного программирования [17].

Обзор характеристик CLOS можно найти и табл. А-4. Не поддерживая непосредственно механизм долгоживущих объектов, CLOS имеет расширения с протоколом метаобъектов, реализующих этот механизм [18].

Таблица А-4. CLOS

Абстракции

Переменные экземпляра Методы

Да Да Да Да

 

экземпляра Переменные класса

 

 

Методы класса

 

 

 

 

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

Переменных Методов

Чтение,запись,доступ Открытые

 

 

 

Модульность

Разновидности модулей

Пакет

 

 

 

Иерархии

Наследование Шаблоны

Множественное Нет Да

 

Метаклассы

 

 

 

 

Типизация

Сильная типизация Полиморфизм

Возможна Да (множественный)

 

 

 

Параллельность

Многозадачность

Да

 

 

 

Сохраняемость

Долгоживущие объекты

Нет

 

 

 

Ссылки

Основным руководством по языку CLOS является -"Common Lisp Object System Specification" [19].

А.6. Ada

Происхождение

Министерство обороны США, возможно, самый крупный в мире пользователь компьютеров. В середине 70-х годов программные разработки этого департамента достигли критической точки: проекты выходили из

временных и бюджетных рамок, а заданных характеристик достичь не удавалось. Стало очевидно, что дальше ситуация только ухудшится, стоимость разработки программных систем взлетит еще выше, а потребность в программах будет расти экспоненциально. Для решения всех этих проблем, отягощенных вдобавок наличием сотен языков программирования, министерство обороны профинансировало проект создания единого общего языка высокого уровня. В некотором смысле Ada является одним из первых языков программирования, выпущенных промышленным способом. Исходные требования были сформулированы в 1975 году (Steelman) и реализованы в 1978 году. Был объявлен международный конкурс, на который откликнулось 17 участников. Это число затем было сокращено до четырех, затем до двух, и наконец до одного; при этом в проектировании и испытаниях участвовали сотни ученых по всему миру.

Проект-победитель вначале носил условное наименование Green (в конкурсе проект имел зеленый кодовый знак); позднее он получил имя Ada в честь Ады Августы графини Лавлейс (Ada Augusta Lovelace), которая была удостоена этой чести за свои соображения о потенциальных возможностях компьютеров. Основным разработчиком языка был Жан Икбьян (Jean Ichbian) из Франции. В команду разработчиков входили: Бернд Криг-Брюкнер (Bernd Krieg-Brueckner), Бриан Вичман (Brian Wichmann), Анри Ледгар (Henry Ledgard), Жан-Клод Ельяр (Jean-Claude Heliard), Жан-Лу Гайли (Jean-Loup Gailly), Жан-Раймон Абриаль (Jean-Raymond Abrial), Джон Барнс (John Barnes), Майк Вуджер (Mike Woodger), Оливье Рубин (Olivier Roubine), С. А. Шуман (S. A. Schumann) и С. С. Весталь (S. С. Vestal).

Непосредственными предшественниками Ada являются Pascal и его производные, включая Euclid, Lis, Mesa, Modula и Sue. Были использованы некоторые концепции ALGOL-68, Simula, CLU и Alphard. Стандарт ANSI для

Ada был окончательно издан в 1983 году. Трансляторы Ada, хотя и не сразу, были реализованы для всех основных архитектур. Будучи созданным благодаря министерству обороны, язык Ada сегодня используется во многих государственных и коммерческих проектах. Ada - традиционный язык разработки больших и сложных систем, например, системы управления воздушным движением в США и Канаде. Стандарты ANSI должны пересматриваться каждые пять лет, поэтому в настоящее время изучается проект Ada 9x. В нем в исходное определение языка внесен ряд незначительных исправлений: уточнения, устранение очевидных пробелов, исправления ошибок. В настоящем виде Ada является объектным, но не объектно-ориентированным языком. Проект 9x подразумевает расширение языка до уровня объектно-ориентированного.

Обзор

Разработчики Ada прежде всего беспокоились о:

надежности и эксплуатационных качествах программ;

программировании как разновидности человеческой деятельности;

эффективности [20].

В табл. А-5 приведены основные характеристики языка Ada с точки зрения объектного подхода.

Таблица А-5. Ada

Абстракции

Переменные экземпляра

Да Да Нет Нет

 

Методы экземпляра

 

 

Переменные класса Методы

 

 

класса

 

 

 

 

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

Переменных Методов

Открытые,закрытые

 

 

Открытые,закрытые

 

 

 

Модульность

Разновидности модулей

Пакет

Иерархии

Наследование Шаблоны

Нет(входит в Ada9x)

 

Метаклассы

Да

 

 

Нет

Типизация

Сильная типизация

Да Нет(входит в Ada9x)

 

Полиморфизм

 

Параллельность

Многозадачность

Да

 

 

 

Сохраняемость

Долгоживущие объекты

Нет

 

 

 

Ссылки

Основным руководством по языку Ada является "Reference Manual for the Ada Programming Language" [21].

A.7. Eiffel

Происхождение

Автор Eiffel Бертран Мейер (Bertrand Meyer) создавал не только язык объектно-ориентированного программирование, но и инструмент проектирования программ.

Несмотря на сильное влияние Simula, Eiffel - вполне самостоятельный объектно-ориентированный язык со своей собственной средой разработки.

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

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

Обзор

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

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

Свойства языка с точки зрения нашей модели показаны в табл. А-6.

Таблица А-6. Eiffel

Абстракции

Переменные экземпляра Методы

Да Да

 

экземпляра Переменные класса

Нет Нет

 

Методы класса

 

 

 

 

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

Переменных Методов

Закрытые Открытые, закрытые

 

 

 

Модульность

Разновидности модулей

Блок (unit)

 

 

 

Иерархии

Наследование Шаблоны

Множественное Да Нет

 

Метаклассы

 

 

 

 

Типизация

Сильная типизация Полиморфизм

Да Да

 

 

 

Параллельность

Многозадачность

Нет

 

 

 

Сохраняемость

Долгоживущие объекты

Нет

 

 

 

Ссылки

Лучше всего взять книгу Мейера "Object Oriented Software Construction" [22].

А.8. Другие объектно-ориентированные языки программирования

На рис. А-2 вы найдете названия многих важных объектных и объектно-ориентированных языков, в библиографии есть ссылки на информацию о большинстве из них.

ABCL/1

Concurrent Smalltalk

Lore

Plasma 11

ABE

CSSA

Mace

POOL-T

Acore

CST

MELD

PROCOL

Act/1

Director

Mjolner

Quick Pascal

Act/2

Distributed Smalltalk

ModPascal

Quicktalk

EmeraldNew

Eiffel

Neon

ROSSActor

FlavorsSASTAct/3

 

 

 

Actors

ExperCommonLisp

NIL

SCOOP

Felix

Extended Smalltalk

0-CPU

SCOOPSAda

PascalOakUspSelfActra

 

 

 

Argus

Flavors

Oberon

Simula

ART

FOOPlog

Object Assembler

SINA

Berkeley Smalltalk

 

 

 

FOOPS

 

 

 

ObjectCobot

 

 

 

Smalltalk

 

 

 

Beta

FRL

Object Lisp

Smalltalk AT

Blaze

Galileo

Object Logo

Smalltalk V

GLISPObject

Garp

Object Oberon

Smallworld С wilh Classes

PascalSPOOLC++ Gypsy

 

 

 

Objective-C SR С_

 

 

 

talkHybridObjVLispSRLBro

 

 

 

uhaha

 

 

 

Cantor

Inheritance

OOPC

STROBE

IntermissionOPALTrellis/OwInnovAda

OOPS+

TClassic Ada

lClascal

 

 

 

KL-

Jasmine

Orbil

Turbo Pascal 5.xCluster

OneOrient84/KUniform

 

 

86

Common

 

 

 

LoopsKRLOTMUNITS Common ObjectsKRSPCOLVulcanCo mmon ORBITLittle SmalltalkPIEXLISPConcurr ent PrologLOOPSPL/LLZoom/V MCLOS

Рис. А-2. Объектные и объектно-ориентированные языки программирования

В работе Саундерса [23] дан обзор более восьмидесяти объектноориентированных языков. Автор выделил в них семь категория [24]:

• Actor

Языки, поддерживающие механизм

делегирования.

 

• Параллельные

Объектно-ориентированные, нацеленные на

параллелизм.

 

• Распределенные

Объектно-ориентированные языки, нацеленные

на обработку распределенных объектов.

• Основанные

Языки, поддерживающие теорию фреймов. на

фреймах

 

• Гибридные

Объектно-ориентированные надстройки над

обычными языкам и.

 

• Типа Smalltalk

Smalltalk и его диалекты.

• Идеологические

Приложения объектной ориентированности к

другим областям.

 

• Остальные

Все остальные объектные языки.

Словарь терминов

CRC-карточки, CRC cards. CRC — Class/Responsibilities/Collaborators,

Класс/Ответствен-ности/Сотрудники; простое, но достаточно эффективное средство мозгового штурма при выявлении ключевых абстракций и механизмов.

абстрактная операция, abstract operation. Объявленная, но не реализованная операция в абстрактном классе. В C++ абстрактные операции объявляются как чисто виртуальные функции-члены.

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

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

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

актер, actor. Объект, воздействующий на другие объекты, но сам не подвергающийся воздействию с их стороны. В некоторых контекстах то же самое, что активный объект.

активный объект, active object. Объект, которому выделен свой поток управления.

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

архитектура модулей, module architecture. Граф, вершины которого соответствуют модулям, а ребра — отношениям модулей между собой. Архитектура модулей системы представляется совокупностью диаграмм модулей.

архитектура процессов, process architecture. Граф, вершины которого соответствуют процессорам и устройствам, а ребра — соединениям между ними. Для описания архитектуры процессов системы используются диаграммы процессов.

архитектура, architecture. Логическая и физическая структура системы, сформированная всеми стратегическими и тактическими проектными решениями.

ассоциация, association. Отношение, означающее некоторую смысловую связь между классами.

атрибут, attribute. Часть составного объекта (агрегата).

базовый класс, base class. Наиболее общий класс в какой-либо структуре классов. В большинстве приложений есть несколько таких корневых классов. В некоторых языках

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

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

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

виртуальная функция, virtual function. Какая-либо операция над объектом. Виртуальная функция может быть переопределена в подклассах, следовательно, ее реализация определяется всем множеством методов, объявленных во всех классах дерева наследования. Термины «обобщенная функция» и «виртуальная функция» взаимозаменяемы.

временная сложность, time complexity. Относительное или абсолютное время, за которое выполняется операция.

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

делегирование, delegation. При делегировании один объект, ответственный за операцию, передает выполнение этой операции другому объекту.

деструктор, destructor. Операция класса, которая освобождает состояние объекта и/или уничтожает сам объект.

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

диаграмма взаимодействий, interaction diagram. Часть системы обозначении объектно-ориентированного проектирования; используется для демонстрации выполнения какого-либо сценария в контексте диаграммы объектов.

диаграмма классов, class diagram. Часть системы обозначений объектноориентированного проектирования; используется, чтобы наглядно показать классы и их взаимоотношения в логическом проекте системы. Может представлять всю структуру классов или ее часть.

диаграмма модулей, module diagram. Часть системы обозначений объектноориентированного проектирования; используется для демонстрации разбиения классов и объектов по модулям в физическом проекте системы. Диаграмма модулей отображает архитектуру модулей системы.

диаграмма объектов, object diagram. Часть системы обозначений объектноориентированного проектирования; используется, чтобы наглядно показать объекты и отношения между ними в логическом проекте системы. Может отражать всю объектную структуру или часть ее; обычно иллюстрирует смысл механизмов в логическом проекте. Отдельная диаграмма объектов — моментальный снимок из жизни системы.

диаграмма переходов и состояний, state transition diagram. Часть обозначений объектно-ориентированного проектирования; используется для отображения пространства состояний данного класса, событий, которые вызывают переход из одного состояния в другое, и действий, возникающих в результате смены состояния.

Соседние файлы в предмете Программирование на C++