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

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

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

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

Предположим, мы хотим ввести более существенное изменение: добавить экспертную систему, помогающую диспетчеру при определении маршрутов и реагирующую на чрезвычайные ситуации. Как это требование отразится на нашем проекте? Незначительно. Мы можем разместить новую подсистему между подсистемами TrainPlanDatabase и DispatcherApplications, так как база знаний, созданная для экспертной системы, подобна по содержанию TrainPlanDatabase; кроме того, подсистема DispatcherApplications является единственным клиентом экспертной системы. Нам предстоит разработать некоторый новый механизм, чтобы доводить рекомендации до конечного пользователя. Например, мы можем использовать метафору информационной доски, как это делалось в главе 11.

Изменение аппаратных средств

Мы уже говорили, что аппаратные средства развиваются быстрее, чем программное обеспечение. Более того, всегда будут причины, вынуждающие нас выбрать в ходе проектирования такие аппаратные решения, о которых потом мы будем сожалеть.42 Поэтому рабочая аппаратура в больших системах устаревает гораздо раньше программы. Например, после нескольких лет эксплуатации мы можем заменить дисплеи на всех поездах и во всех диспетчерских центрах. Как это может повлиять на существующий проект? Если во время разработки мы сохраняли интерфейсы подсистем па высоком уровне абстракции, это изменение аппаратуры приведет лишь к незначительным изменениям в программе. Мы подправим только совокупность процедур, относящуюся к дисплеям, не затрагивая другие подсистемы, которые вообще ничего не знают об особенностях конкретных рабочих станций. Это достигается благодаря тому, что поведение всех рабочих станций скрыто в подсистеме Displays. Таким образом, подсистема действует как стена абстракций, которая защищает остальных клиентов от наших трудностей, вызванных разнообразием дисплеев.

Аналогично, радикальные изменения в стандартах телекоммуникации затронут нашу реализацию в очень ограниченном отношении. Наш проект гарантирует, что только подсистема Massages связана с сетевыми коммуникациями. Таким образом, фундаментальные изменения в сети не отразятся ни на каком высокоуровневом клиенте; подсистема Messages защищает их от капризов сетевой моды.

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

Дополнительная литература

Требования к системе управления движением основываются на Продвинутой системе управления поездами (Advanced Train Control System), описанной Марфи (Murphy) [С 1988].

Передача и проверка сообщений присутствует практически во всех системах управления и контроля. Плинта, Ли и Риссман (Plinta, Lee, and Rissman) [С 1989] дали блестящее изложение этих вопросов и предложили

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

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

ГИ ЛЕФРАНСУА(GUY LEFRANCOIS)

Дети (Of Children)

Послесловие

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

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

Приложение

Объектноориентированные языки программирования

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

это инструмент проектирования

это средство человеческого восприятия

это средство управления компьютером [1].

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

А.1. Концепции

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

Рис. А-1. Генеалогия объектных и объектно-ориентированных языков

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

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

Общим предком практически всех используемых сегодня объектных и объектно-ориентированных языков является язык Simula, созданный в 1960 году Далем, Мюрхогом и Ныгардом [2]. Язык Simula основывался на идеях ALGOL, но был дополнен механизмом наследования и инкапсуляции. Но еще более существенно то, что Simula, предназначенная для описания систем и моделирования, ввела дисциплину написания программ, отражающих словарь предметной области.

Рис. А-1, заимствованный у Шмукера [З], демонстрирует генеалогию пяти наиболее влиятельных и популярных объектных или объектно-

ориентированных языков программирования: Smalltalk. Object Pascal, C++, CLOS и Ada. В следующих разделах мы проанализируем некоторые из этих языков с точки зрения их "объектности".

А.2. Smalltalk

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

Язык Smalltalk был разработан командой Xerox Palo Alto Research Center Learning Research Group (Xerox, Пало Альто, Исследовательский центр,

группа исследования обучения), как программная часть Dynabook - фантастического проекта Алана Кея (Alan Kay). В основу были положены идеи Simula, хотя известное влияние оказали также язык FLEX и работы Сеймора Паперта (Seymore Papert) и Валласа Феурзейга (Wallace Feurzeig). Smalltalk является одновременно и языком программирования, и средой разработки программ. Это - чисто объектно-ориентированный язык, в котором абсолютно все рассматривается как объекты; даже целые числа - это классы. Вслед за Simula, Smalltalk является важнейшим объектно-ориентированным языком, поскольку он не только оказал влияние на последующие поколения языков программирования, но и заложил основы современного графического интерфейса пользователя, на которых непосредственно базируются интерфейсы Macintosh, Windows и Motif.

Развитие Smalltalk потребовало почти десятилетних усилий группы энтузиастов. Главным архитектором на протяжении почти всей работы был Дэн Ингалс (Dan Ingalls), но значительный вклад внесли также Питер Дейч

(Peter Deutsh), Гленн Краснер (Glenn Krasner) и Ким МакКолл (Kim McCall).

Параллельно, усилиями Джеймса Альтхофа (James Althoff), Роберта Флегала

(Robert Flegal), Неда Келера (Ned Kaehler), Дианы Мерри (Diana Merry) и

Стива Паца (Steve Putz) разрабатывалась оболочка Smalltalk. Адель Голдберг

(Adele Goldberg) и Дэвид Робсон (David Robson) взяли на себя роль летописцев проекта.

Известны пять выпусков языка Smalltalk, обозначаемых по году их появления:

Smalltalk-72, -74. -76, -78, и самое свежее воплощение - Smalltalk-80.

Реализации 1972 и 1974 годов заложили основу языка, в частности идею передачи сообщений и полиморфизм, хотя механизм наследования еще не появился. В последующих версиях полноправное гражданство получили классы; этим достигла завершения точка зрения, что все состоит из объектов. Smalltalk-80 был перенесен на многие компьютерные платформы.

Есть также один важный диалект (схожий со Smalltalk-80), получивший название Smalltalk/V. Он создан фирмой Digitalk для IBM PC (Windows и OS/2) и Macintosh. За исключением классов пользовательского интерфейса, библиотеки классов Smalltalk/V в обеих версиях практически идентичны. Среда и инструменты разработки также напоминают Smalltalk-80 [4].

Обзор

Как пишет Ингалс: "Цель проекта Smalltalk - сделать мир информации доступным для детей любого возраста. Вся трудность состоит в том, чтобы найти и применить достаточно простые и эффективные метафоры, которые позволят человеку свободно оперировать самой разнообразной информацией от чисел и текстов до звуковых и зрительных образов" [5]. В основу языка положены две простые идеи:

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

В табл. А-1 приведены характеристики языка Smalltalk с точки зрения семи основных элементов объектного подхода. Множественное наследование в принципе может быть реализовано за счет переопределения некоторых методов-примитивов [б].

Таблица А-1. Smalltalk

Абстракции

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

Да Да Да Да

 

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

 

 

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

 

 

 

 

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

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

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

 

 

 

Модульность

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

Нет

 

 

 

Иерархии

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

Одиночное Нет Да

 

Метаклассы

 

 

 

 

Типизация

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

Нет Да(одиночный)

 

 

 

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

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

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

 

 

 

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

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

Нет

 

 

 

Пример

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

Object subclass: №AShape instanceVariableNames: 'theCenter' classVariableNames: ' ' poolDictionaries: ' ' category: 'Appendix'

initialize

"Инициализировать фигуру" theCenter:= Point new

setCenter: aPoint

"Задать центр фигуры" theCenter := aPoint

center

"Вернуть центр фигуры" ^theCenter

draw

"Нарисовать фигуру" self subclassResponsibility

Теперь определим подкласс ACircle:

AShane subclass: #ACircle instanceVariableNames: 'theRadius' classVariableNames: '' poolDictionaries: ''

category: 'Appendix' setRadius: anInteger

"Задать радиус окружности"

theRadius := aInteger

radius

"Вернуть радиус окружности" ^theRadius

draw

"Нарисовать окружность" | anArc index |

anArc := Arc new. index := 1.

[index <= 4] whileTrue: [anArc

center: theCenter radius: theRadius quadrant: index. anArc display. index := index + 1]

Далее введем подкласс ARectangle:

AShape subclass: №ARectangle instanceVariableNaines: 'theHeight theWidth' classVariableNairies : ' '

poolDictionaries: '' category: 'Appendix'

draw

 

 

 

 

"Нарисовать прямоугольник"

 

 

 

 

| aLine upperLeftCorner |

 

 

 

aLine := Line new.

 

 

 

 

upperLeftCorner := theCenter x - (theWidth

/2)@

 

(theCenter у - (theHeight /2)). aLine beginPoint: upperLeftCorner.

aLine endPoint: upperLeftCorner x + theWidth @

upperCorner y.

aLine display.

 

 

 

 

aLine beginPoint:: aLine endPoint.

 

 

aLine endPoint: upperLeftCorner x + thewidth

в

 

(upperCorner у +

theHeight). aLine display.

 

aLine beginPoint: aLine endPoint. aLine endPoint: upperLeftCorner x @

(upperLeftCorner

у +

theHeight). aLine display.

aLine beginPoint: aLine endPoint. aLine endPoint: upperLeftCorner. aLine

display

setHeight: anInteger

"Задать высоту прямоугольника" theHeight := anInteger

setWidth: anInteger

"Задать ширину прямоугольника" CheWidth := anInteger

height

"Вернуть высоту прямоугольника" ^theHeight

width

"Вернуть ширину прямоугольника" ^thewidth

Наконец, подкласс ASolidRectangle опишем так:

ARectangle subclass: #ASolldRectangle instanceVariableNames: '' classVariableNames: ''

poolDictionaries: '' category: 'Appendix'

draw

"Нарисовать сплошной прямоугольник"

I upperLeftCorner lowerRightCorner I super draw.

upperLeftCorner := theCenter x - (thewidth quo: 2) + 1 в (theCenter у - (theHeight quo: 2) + 1). lowerRigthCorner :=

upperLeftCorner x + thewidth - 1 в (upperLeftCorner у + theHeight - 1). Display

fill:

(upperLeftCorner corner: lowerRightCorner)

mask:

Form gray

Ссылки

Основными руководствами по языку Smalltalk являются книги

"Smalltalk-80:

The Language", Голдберг и Робсон [7]; "Smalltalk-80: The Interactive Programming Environment", Голдберг [8]; "Smalltalk-80: Bit of History Words of Advice", Kpac-нер, [9]. ЛаЛонд и Пух [10] подробно исследуют Smalltalk-80, в

том числе библиотеки классов и средства разработки приложений.

А.3. Object Pascal

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

Object Pascal создавался сотрудниками компании Apple Computer (некоторые из которых были участниками проекта Smalltalk) совместно с Никлаусом Виртом (Niklaus Wirth), создателем языка Pascal.

Непосредственным предшественником Object Pascal является Clascal (объектно-ориентированная версия Pascal для компьютера Lisa). Object Pascal известен с 1986 года и является первым объектно-ориентированным языком программирования, который был включен в Macintosh Programmer's Workshop (MPW), среду разработки для компьютеров Macintosh фирмы Apple. Для MPW создана библиотека классов, называемая МасАрр, являющаяся основой для создания прикладных приложений, отвечающих требованиям к интерфейсу пользователя Macintosh.

Обзор

Шмукер (Schmucker) утверждает, что "Object Pascal - это "скелет" объектно-ориентированного языка. В нем нет методов класса, переменных класса, множественного наследования и метаклассов. Эти механизмы исключены специально, чтобы сделать язык простым для изучения начинающими "объектными" программистами" [II].

В табл. А-2 приведены общие характеристики Object Pascal.

Таблица А-2. Object Pascal

Абстракции

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

Да Да Нет Нет

 

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

 

 

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

 

 

 

 

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

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

Открытые Открытые

 

 

 

Модульность

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

Модуль (unit)

 

 

 

Иерархии

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

Одиночное Нет Нет

 

Метаклассы

 

 

 

 

Типизация

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

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

 

Полиморфизм

 

 

 

 

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

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

Нет

 

 

 

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

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

Нет

 

 

 

Ссылки

Основным руководством по Object Pascal является "MPW Object Pascal Reference" от Apple [12].1

А.4. C++

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

Язык программирования C++ был разработан Бьерном Страуструпом, сотрудником AT&T Bell Laboratories. Непосредственным предшественником C++ является С with Classes, созданный тем же автором в 1980 году. Язык С with Classes, в свою очередь, был создан под сильным влиянием С и Simula. C++ - это в значительной степени надстройка над С. В определенном смысле можно назвать C++ улучшенным С, тем С, который обеспечивает контроль типов, перегрузку функций и ряд других удобств. Но главное в том, что C++ добавляет к С объектную ориентированность.

Известны несколько версий C++. В версии 1.0 реализованы основные механизмы объектно-ориентированного программирования, такие как одиночное наследование и полиморфизм, проверка типов и перегрузка функций. В созданной в 1989 году версии 2.0 нашли отражение многие дополнительные свойства (например, множественное наследование), возникшие на базе широкого опыта применения языка многочисленным сообществом пользователей. В версии 3.0 (1990) появились шаблоны (параметризованные классы) и обработка исключений. Комитет ANSI по C++ (X3J16) недавно одобрил предложения по введению пространств имен (что соответствует нашему обозначению категорий классов) и проверки типов во время исполнения.

Первые компиляторы C++ строились на основе препроцессора для языка С, названного cfront. Поскольку этот транслятор создавал промежуточный код на С, он позволил очень быстро перенести C++ практически на все UNIX-системы. Сейчас почти на всех платформах созданы (в том числе коммерческие) "настоящие" компиляторы C++.

Обзор

Страуструп пишет: "C++ создавался с целью избавить автора и его друзей от необходимости программировать на ассемблере, С или других современных языках такого уровня. Главной задачей было придумать язык, на котором удобно писать хорошие программы и с которым программисту приятно работать. C++ никогда не проектировался на бумаге. Его проектирование, документирование и реализация выполнялись одновременно" [13]. C++ исправил многие недостатки С и ввел описания классов, контроль типов, перегрузку функций, управление памятью, постоянные типы, ссылки, встраиваемые функции, производные классы и виртуальные функции [14].

В последние годы этот язык стал очень популярен благодаря системе

Delphi фирмы Borland. - Примеч. ред.

Характеристики C++ приведены в табл. А-3.

Таблица А-3. C++

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