Гради Буч - Объектно-ориентированный анализ и проектирование с примерами приложений на С++ (1158635), страница 93
Текст из файла (страница 93)
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 PascalReference" от 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++ принятоописывать интерфейсную часть классов в заголовочных файлах. Мы можемнаписать:struct point {int x;int у;};class Shape {public:Shape();void setCenter (Point p};virtual void draw() = 0;Point center 0 const;privatePoint 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 ObjectSystem (Объектная система Common Lisp) или, сокращенно, - CLOS.Возглавил комитет Дэниел Бобров (Daniel Bobrow), а его членами стали СоняКин (Sonya Keene), Линда де Мичил (Linda DeMichiel), Патрик Дассад (PatrickDussud), Ричард Габриель (Richard Gabriel), Джеймс Кемпф (James Kempf),Грегор Кисазлес (Gregor Kicazles) и Дэвид Мун (David Moon).Серьезное влияние на проект CLOS оказали языки NewFlavors иCommonLoops. После двухлетней работы, в 1988 году была опубликованаполная спецификация CLOS.ОбзорКип отмечает, что в проекте CLOS ставились три основные цели.CLOS должен:• представлять собой стандартное расширение языка, включающее всенаиболее полезные свойства существующей объектно-ориентированнойпарадигмы;• обеспечить эффективный и гибкий интерфейс программиста,позволяющий реализовать большинство прикладных задач;• проектироваться как расширяемый протокол, так, чтобы можно былоизменять его поведение, тем самым стимулируя дальнейшие исследования вобласти объектно-ориентированного программирования [17].Обзор характеристик CLOS можно найти и табл.
А-4. Не поддерживаянепосредственно механизм долгоживущих объектов, CLOS имеет расширенияс протоколом метаобъектов, реализующих этот механизм [18].Таблица А-4. CLOSАбстракцииПеременные экземпляра Методыэкземпляра Переменные классаМетоды классаДа Да Да ДаИнкапсуляцияПеременных МетодовЧтение,запись,доступ ОткрытыеМодульностьРазновидности модулейПакетИерархииНаследование ШаблоныМетаклассыМножественное Нет ДаТипизацияСильная типизация Полиморфизм Возможна Да (множественный)ПараллельностьМногозадачностьДаСохраняемостьДолгоживущие объектыНетСсылкиОсновным руководством по языку CLOS является -"Common LispObject System Specification" [19].А.6.
AdaПроисхождениеМинистерство обороны США, возможно, самый крупный в мирепользователь компьютеров. В середине 70-х годов программные разработкиэтого департамента достигли критической точки: проекты выходили извременных и бюджетных рамок, а заданных характеристик достичь неудавалось. Стало очевидно, что дальше ситуация только ухудшится,стоимость разработки программных систем взлетит еще выше, а потребность впрограммах будет расти экспоненциально. Для решения всех этих проблем,отягощенных вдобавок наличием сотен языков программирования,министерство обороны профинансировало проект создания единого общегоязыка высокого уровня.
В некотором смысле Ada является одним из первыхязыков программирования, выпущенных промышленным способом. Исходныетребования были сформулированы в 1975 году (Steelman) и реализованы в1978 году. Был объявлен международный конкурс, на который откликнулось17 участников. Это число затем было сокращено до четырех, затем до двух, инаконец до одного; при этом в проектировании и испытаниях участвовалисотни ученых по всему миру.Проект-победитель вначале носил условное наименование Green (вконкурсе проект имел зеленый кодовый знак); позднее он получил имя Ada вчесть Ады Августы графини Лавлейс (Ada Augusta Lovelace), которая былаудостоена этой чести за свои соображения о потенциальных возможностяхкомпьютеров. Основным разработчиком языка был Жан Икбьян (Jean Ichbian)из Франции.