Гради Буч - Объектно-ориентированный анализ и проектирование с примерами приложений на С++ (1158635), страница 92
Текст из файла (страница 92)
Наш методуспешно использовался для создания множества сложных систем в самых разныхобластях.Потребность в сложных программных системах растет с ошеломляющей быстротой. Помере того, как увеличивается производительность аппаратуры и все больше людейузнает о возможностях компьютеров, нам хочется автоматизировать все болееобъектно-ориентированногосложныепроцессы.Фундаментальнаяценностьпроектирования как устоявшейся технологии в том, что оно позволяет человеческомудуху сосредоточиться на решении истинно творческих задач при создании сложныхсистем.ПриложениеОбъектноориентированныеязыкипрограммированияИспользование объектно-ориентированной методологии не ограничено каким-либоодним языком программирования - она применима к широкому спектру объектных иобъектно-ориентированных языков.
Наряду с анализом и проектированием,несомненно важны особенности конкретного языка программирования, поскольку вконечном счете наши конструкции должны быть выражены на каком-то языке. Какотметил Вульф, язык программирования служит трем целям:• это инструмент проектирования• это средство человеческого восприятия• это средство управления компьютером [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 ResearchCenter 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: №AShapeinstanceVariableNames: 'theCenter'classVariableNames: ' ' poolDictionaries: ' 'category: 'Appendix'initialize"Инициализировать фигуру"theCenter:= Point newsetCenter: aPoint"Задать центр фигуры"theCenter := aPointcenter"Вернуть центр фигуры"^theCenterdraw"Нарисовать фигуру"self subclassResponsibilityТеперь определим подкласс ACircle:AShane subclass: #ACircleinstanceVariableNames: 'theRadius'classVariableNames: ''poolDictionaries: ''category: 'Appendix'setRadius: anInteger"Задать радиус окружности"theRadius := aIntegerradius"Вернуть радиус окружности"^theRadiusdraw"Нарисовать окружность"| anArc index |anArc := Arc new.index := 1.[index <= 4]whileTrue:[anArccenter: theCenter radius: theRadius quadrant: index.
anArc display. index :=index + 1]Далее введем подкласс ARectangle:AShape subclass: №ARectangleinstanceVariableNaines: '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. aLinedisplaysetHeight: anInteger"Задать высоту прямоугольника"theHeight := anIntegersetWidth: anInteger"Задать ширину прямоугольника"CheWidth := anIntegerheight"Вернуть высоту прямоугольника"^theHeightwidth"Вернуть ширину прямоугольника"^thewidthНаконец, подкласс ASolidRectangle опишем так:ARectangle subclass: #ASolldRectangleinstanceVariableNames: ''classVariableNames: ''poolDictionaries: ''category: 'Appendix'draw"Нарисовать сплошной прямоугольник"I upperLeftCorner lowerRightCorner Isuper draw.upperLeftCorner := theCenter x - (thewidth quo: 2) + 1 в(theCenter у - (theHeight quo: 2) + 1).
lowerRigthCorner :=upperLeftCorner x + thewidth - 1 в(upperLeftCorner у + theHeight - 1). Displayfill:(upperLeftCorner corner: lowerRightCorner)mask: Form grayСсылкиОсновными руководствами по языку Smalltalk являются книги"Smalltalk-80:The Language", Голдберг и Робсон [7]; "Smalltalk-80: The InteractiveProgramming Environment", Голдберг [8]; "Smalltalk-80: Bit of History Words ofAdvice", Kpac-нер, [9]. ЛаЛонд и Пух [10] подробно исследуют Smalltalk-80, втом числе библиотеки классов и средства разработки приложений.А.3. Object PascalПроисхождениеObject Pascal создавался сотрудниками компании Apple Computer(некоторые из которых были участниками проекта Smalltalk) совместно сНиклаусом Виртом (Niklaus Wirth), создателем языка Pascal.Непосредственным предшественником Object Pascal является Clascal(объектно-ориентированная версия Pascal для компьютера Lisa).