Принципы объектно-ориентированной разработки программ. 2-е издание

2-е издание
Антон Элиенс

Principles of Object-Oriented Software Development Second Edition
Anton Eliens
книга Принципы объектно-ориентированной разработки программ. 2-е издание

Тираж данной книги закончился.
Введение

В последние годы технология объектно-ориентированного программирования (ООП) заняла лидирующие позиции в области разработки программного обеспечения. Эта книга содержит исчерпывающее описание как преимуществ, так и недостатков объектно-ориентированного подхода, последовательно рассматриваемых в отношении отдельных стадий жизненного цикла программного обеспечения, начиная от анализа требований и заканчивая сопровождением и модернизацией готовых программ. В каждом случае автор стремится увязать соответствующие принципы ООП с существующей практикой прикладного программирования. Предлагаемый материал богато иллюстрирован примерами на языках Java и C++, и включает обсуждение основных концепций таких объектно-ориентированных языков, как Smalltalk, Eiffel, C++, Java, а также UML и технологии CORBA. Для лучшего закрепления материала в книгу включены подборки вопросов для самопроверки, а также практические примеры разработки мультимедиа- и Web-приложений. Книга может быть полезна как студентам, изучающим соответствующие курсы, так и специалистам-практикам в области разработки программного обеспечения.

496 стр., с ил.; ISBN 5-8459-0233-9, 0-201-39856-7; формат 70x100/16; 2002, 1 кв.; Вильямс.



Понравилась книга? Порекомендуйте её друзьям и коллегам:







Книги, рекомендуемые вместе с этой книгой:

Раздел каталога:



Предисловие

Что за необычная книга! Мне приходилось видеть множество книг по объектно-ориентированному программированию, и некоторые из них охватывали достаточно обширный материал, но книга Антона Элиенса - это нечто особенное. Как и во многих других изданиях в данной области, ее основой послужил курс лекций, читавшийся автором. Однако Элиенс неожиданно отошел от ставшего уже традиционным способа переработки конспекта лекций в книгу. Вместо того чтобы расширить узкие рамки конспекта, переупорядочить материал и создать на его основе традиционный учебник, он решил сохранить сам дух заметок для конспекта.

Все ключевые положения собраны в так называемых "слайдах", которые служат для текста своего рода наглядными ориентирами, что так не похоже на привычный книжный стиль. Мы словно мчимся по скоростной дороге, следуя от одного слайда к другому; так студенты работают с тезисами лекции при первом знакомстве с предметом. Затем обычно следует более глубокая проработка материала, когда внимание концентрируется на развернутых пояснениях автора. Эти пояснения весьма обстоятельны там, где это важно, но в то же время достаточно кратки там, где перегрузка подробностями не принесла бы пользы. Читать эту книгу и работать с ней, углубляя свои знания, - истинное удовольствие!

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

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

Наконец, будущему программисту-разработчику, как и опытному программисту-профессионалу или ученому-теоретику в области компьютерных наук, разбирающемуся в практическом программировании, потребуется освоить ряд узких вспомогательных дисциплин, чтобы почувствовать себя хотя бы наполовину подготовленным для ответа на вопрос, что же мы в действительности делаем, когда создаем программы. Чтобы достичь этого, необходимо знать все, начиная с методов моделирования и проектирования, включая архитектуры и компонентную технологию, и заканчивая особенностями реализации на конкретных языках программирования. Эта книга может стать хорошей отправной точкой на пути к столь глубокому пониманию объектно-ориентированного подхода. (Впрочем, не следует забывать и о других подходах и точках зрения на программирование!)

Клеменс Шиперский (Clemens Szyperski)

Ноябрь 1999

Предисловие к первому изданию

Эта книга станет весомым вкладом в литературу по объектно-ориентированному программированию, поскольку она является мостом через пропасть между сообществом разработчиков языков и сообществом разработчиков программ. В ней охвачены как проблемы проектирования языков, связанные с наследованием, типами, полиморфизмом и активными объектами, так и парадигмы проектирования программ, такие как технология объектного моделирования (OMT - Object Modelling Technique), парадигмы "модель-представление-управление" (MVC - model-view-controller) и проектирование по обязательствам. Принятое в книге деление материала на четыре части (проектирование, языки и системы, теоретические основы и прикладные среды разработки приложений) позволяет достичь золотой середины между практикой и теорией, охватив и практические методы разработки, и основополагающие принципы. Использование языка C++ в качестве основного языка примеров, а также языков Eiffel и SmallTalk в качестве дополнительных языков позволяет применять эту книгу как учебное пособие для тех курсов программирования, в которых практические задания выполняются на этих широко распространенных объектно-ориентированных языках.

Общее впечатление логической целостности изложения подкрепляется очаровывающим стилем и современной трактовкой исключительно широкого круга проблем. Приведенные в конце каждой главы принципиально важные вопросы (ответы на которые находятся в приложении К) иногда не лишены юмора. Например, на вопрос "Зачем нужны друзья?", который заставляет читателя задуматься над значением конструкта дружественных функций языка C++, дан изящный ответ, подчеркивающий необходимость компромисса между эффективностью и безопасностью и заканчивающийся предостережением "обращайтесь с друзьями бережно".

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

Основные понятия объектно-ориентированного программирования вводятся с позиций проектирования, поэтому все языковые конструкты обосновываются, прежде всего, той ролью, которую они играют в жизненном цикле программ. Первые четыре главы представляют собой краткое, но изящное введение в основополагающие понятия, в котором даже хорошо знакомый с предметом читатель сможет найти для себя новые, неожиданные аспекты. В главе 1 рассматриваются парадигмы программирования и подробно разбирается жизненный цикл программ. В главе 2 описывается язык C++, рассматриваются его преимущества и недостатки, а также проводится его сравнение с языками SmallTalk и Eiffel. В главе 3, посвященной объектно-ориентированному проектированию, досконально изучаются модели, соглашения и спецификации, приводится сравнительный обзор и синтез различных точек зрения на концептуальные основы проектирования. Глава 4 завершает раздел о проектировании рассмотрением методик тестирования и определения количественных критериев (метрик) для оценки правильности программ. Введенные в предыдущих главах основополагающие принципы получают здесь практическое преломление.

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

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

Питер Вегнер (Peter Wegner)

Октябрь 1994

Предисловие автора

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

С этой фразы начиналось предисловие к первому изданию. И эти слова по-прежнему остаются в силе. Однако ООП - необычайно быстро развивающаяся область. Вследствие этого мою книгу, вышедшую из печати в 1994 году, можно было сразу же считать устаревшей. Например, непосредственно после ее выхода в свет всеобщее внимание привлекла очередная новинка - шаблоны проектных решений. Вспомните также о захлестнувшей нас тогда волне интереса к вновь появившемуся языку Java. Совершенно очевидно, что требовалось подготовить переработанное издание, в которое были бы включены эти и другие, новые разделы, а некоторые из уже имевшихся, например раздел о технологии CORBA, были бы углублены и дополнены.

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

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

Наконец, еще один, более личный, мотив для выпуска переработанного издания этой книги состоит в том, что я накопил новый опыт как преподаватель и исследователь в области ООП. Я даже могу сказать, что мои представления об ООП созрели для перехода в новое качество. В частности, ориентируясь на несколько парадигм, моя группа создала объектно-ориентированную интегрированную среду разработки, о которой упоминалось в главе 12 первого издания. Она нашла применение, например, в реализации бизнес-процессов и ускоренной коллективной разработке в среде Web. Хотя я и не намерен подробно развивать в книге данную тему, она послужит основой для ряда примеров.

Особенности книги

  • Книга знакомит с объектно-ориентированным программированием, в том числе с вопросами проектирования, языковой поддержкой и теоретическими основами. В ней уделяется внимание таким темам, как повторное использование программного кода, компонентная технология, шаблоны проектирования и, в частности, применение объектной технологии для создания Web-приложений.
  • Эту книгу можно рассматривать как руководство по созданию объектно-ориентированных приложений. Кроме практических примеров, она включает обзор методов разработки, а также введение в язык UML, ставший в настоящее время стандартным языком объектно-ориентированного моделирования. В частности, шаблоны проектирования играют здесь роль сквозной темы или, лучше сказать, роль общей точки зрения, с которой будут рассматриваться все примеры и решения.
  • Важнейшей из тем является распределенная объектная технология. В книге содержится введение в технологию CORBA, что позволит студенту приобрести личный практический опыт разработки CORBA-приложений. В ней также обсуждаются конкурирующие технологии и, в частности, поясняется суть различий между компонентной технологией и распределенными объектами. В книгу включены примеры на языках C++ и Java.
  • Еще одна из важнейших задач, стоящих перед автором, заключалась в определении точной связи между принципами и приемами, выработанными реальной практикой программирования, с одной стороны, и глубокими закономерностями, установленными в теоретических исследованиях, - с другой. В книге уделяется внимание как основополагающим принципам, так и прагматически найденным решениям, которые разработчики объектно-ориентированных языков выбрали в качестве платформы для воплощения своих идей.
  • Многие вводимые здесь понятия и обсуждаемые проблемы поясняются на примерах небольших программ, написанных в основном на языке Java и реже - на языке C++. Эти примеры охватывают разработку графических интерфейсов пользователя, реализацию бизнес-процессов и создание Web-приложений. Для их понимания глубокого знания языков программирования не потребуется. Вполне достаточно будет краткого описания ряда объектно-ориентированных языков, включая C++, Smalltalk, Eiffel и Java, которое приводится в приложениях.
  • Материал организован вокруг слайдов. В текст помещены слайды в уменьшенном формате; однако они также доступны в формате приложений Powerpoint и Netscape Presentation. Каждый слайд фиксирует какое-то важное понятие или идею, которая разъясняется и комментируется в сопровождающем тексте. Интерактивное руководство преподавателя содержит рекомендации по демонстрации слайдов и ответы на вопросы, помещенные в конце каждой главы.
  • Вся книга целиком, включая примеры программ и руководство преподавателя, доступна в электронном виде в Internet. Электронная версия книги содержит ссылки на другие материалы, доступные в Internet. Просмотреть ее можно будет и в слайдовом режиме, что позволит демонстрировать материал в аудитории, оснащенной соответствующим проектором.

Для кого предназначена книга

Эта книга предназначена, в первую очередь, для академического сообщества и специалистов в области информационных технологий (ИТ), интересующихся теоретическими проблемами. Однако, поскольку я все больше и больше подключаюсь к совместным исследованиям с деловыми партнерами и к разработке неакадемических проектов, в книгу добавлены примеры, имеющие более прямое отношение к применению информационных технологий в бизнесе. В частности, в книге содержится раздел, посвященный применению объектно-ориентированного моделирования для реализации бизнес-процессов, и раздел о трехмерной визуализации бизнес-данных с использованием объектной технологии.

Настоящую книгу можно использовать как основной учебник в курсе ООП или же как справочное пособие. Она может оказаться полезной следующим категориям читателей:

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

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

Книга по замыслу автора должна быть самодостаточной. Впрочем, читателю необходимо иметь некоторый запас базовых знаний (как минимум, по нескольким языкам программирования и структурам данных). Для полного понимания глав, касающихся фундаментальных вопросов и формальных аспектов, читатель должен также обладать некоторыми знаниями из области математической логики.

Структура книги

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

  • Часть I. Проектирование объектно-ориентированных систем

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

    2. Идиомы и шаблоны*. В этой главе вводятся понятия идиомы и шаблона проектирования как средств, позволяющих зафиксировать и многократно использовать некоторые структуры и стандартные решения часто встречающихся задач. Рассматривается различие между идиомами, понимаемыми как решения, ориентированные на определенный язык, и шаблонами, понимаемыми как решения, ориентированные на проблему и полученные посредством логического анализа самой этой проблемы. В данной главе содержится множество примеров на языке Java.

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

    4. Разработка приложений*. В этой главе читателю предлагается разработать полноценное приложение и обсуждаются все вопросы, связанные с его проектированием и реализацией. В тексте даются рекомендации по разработке отдельных классов и приводится пример вывода конкретной реализации исходя из формальной спецификации.

  • Часть II. Объектно-ориентированные языки и системы

    5. Объектно-ориентированные языки программирования. В этой главе проводится сравнительный анализ нескольких объектно-ориентированных языков, включая Smalltalk, Eiffel и Java. Затем обсуждается ряд альтернативных языков, включая Self и Javascript, а также характерные для них объектные модели. Среди затрагиваемых вопросов - динамическое наследование посредством делегирования, синхронные активные объекты и метауровневые архитектуры для языков, основанных на классах.

    6. Компонентная технология*. В этой главе обсуждаются отношения между компонентной технологией и технологией распределенных объектов, а также приводится краткий обзор имеющихся на рынке решений, включая технологии Microsoft COM/ActiveX, JavaBeans, Java RMI и CORBA. В ней также рассматривается пример простого приложения для рабочих групп и пример интеграции технологии CORBA с независимо разработанной библиотекой.

    7. Архитектура программных систем*. В этой главе исследуется, как архитектура программы влияет на ее проектирование и реализацию. В ней описаны шаблоны проектирования для систем, создаваемых с использованием технологии распределенных объектов, а также технические аспекты разработки систем, компоненты которых написаны на разных языках. В качестве примера показано, как воспользоваться естественным интерфейсом для внедрения в существующую среду разработки языка Java.

  • Часть III. Основы объектно-ориентированного моделирования

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

    9. Полиморфизм. В этой главе обсуждается наследование с декларативной точки зрения и дается строгое определение отношения вида "тип-подтип". Далее рассматриваются различные виды полиморфизма и теоретико-типовый подход к родовым классам и понятию перегрузки. Описываются также исчисления типов, учитывающие сокрытие данных и ссылки типов на самих себя. Эти общие понятия рассматриваются параллельно с реализацией концепции полиморфизма в языках Eiffel, C++ и Java.

    10. Уточнение поведения. В этой главе понятие типов, рассматриваемых как ограничения, расширяется за счет учета поведенческих свойств объектов. В ней описывается логика утверждений, предназначенная для верификации программ, и обсуждается операционная модель, применяемая для верификации поведения объекта на основе понятия трассы. Затем даются точные рекомендации по определению, удовлетворяют ли классы, синтаксически описанные как подтипы других классов, модели поведения последних. Наконец, приводится обзор формальных подходов к описанию поведения коллекций объектов.

  • Часть IV. Создание объектно-ориентированных приложений

    11. Моделирование бизнес-процессов*. В этой главе обсуждаются возможности, которые информационные технологии предлагают для проектирования и реализации бизнес-процессов. В частности, объектно-ориентированная имитация рассматривается как средство выявления и фиксации логических аспектов, имеющих место при моделировании бизнес-процессов. Кроме того, здесь анализируется, как с помощью визуализации и распределения в Web можно сделать имитационные модели достаточно мощным инструментом для принятия решений.

    12. Прикладное программирование в среде Web*. В этой главе анализируется, как объектная технология может применяться в среде Web. Рассматриваются расширения для клиентской стороны и решения для серверной стороны. В частности, обсуждаются системы, использующие технологию CORBA совместно с другими Web-технологиями. Дополнительно кратко рассматривается еще одно новое направление в программировании - интеллектуальные мобильные агенты. Здесь же приводится обоснование утверждения о том, что технология этих агентов является прямой наследницей объектной технологии.

  • Приложения

В приложениях содержится краткое описание языков Smalltalk, Eiffel, C++, Java и языка распределенного логического программирования DPL. Кроме того, в них приводятся обзоры языков UML и CORBA IDL, а также краткое руководство и рекомендации по программированию CORBA-приложений небольшого и среднего размеров.

Рекомендуемый порядок чтения

Для тех, кто разрабатывает учебные курсы по объектно-ориентированному программированию, предлагается на выбор несколько порядков чтения книги, схематично показанных ниже. Дополнительно указаны разделы, в которых материал представлен более глубоко.
 Нормальный уровеньПовышенный уровеньУглубленный уровень
Программирование2, 4, 5, 126, 117, 8
Разработка программ1, 3, 4, 118.1, 8.2, 10.19.1-9.3, 10.2
Теоретические основы1, 3, 85, 9.1-9.49.5, 9.6, 10

Цикл программирование, состоящий из глав 2, 4, 5 и 12, может быть дополнен материалом приложений и глав 6 и 11. Цикл разработка программ, состоящий из глав 1, 3, 4 и 11, при необходимости может быть дополнен материалом теоретического цикла в соответствии со схемой. Цикл теоретических основ, состоящий из глав 8-10, может понадобиться, чтобы дополнить более общей информацией о концепциях ООП материал, приведенный в других циклах.

Отличия от первого издания

Для ясности выше я отметил звездочками главы, претерпевшие существенные изменения.

Одно дело - добавлять в книгу новые разделы, и совсем другое - исключать старые. И все же я решил выбросить отдельные главы о языке C++ (первоначально глава 2), проблемах разработки программного обеспечения (глава 4), параллелизме в C++ (глава 6), механизмах сборки сложных комплексов (глава 7), библиотеках программ (глава 11) и гипермедиа (глава 12). Кое-что из этого материала, например часть содержимого глав о гипермедиа (12), механизмах сборки (7) и проблемах разработки программ (4), используется в других местах книги. Ту информацию, которая либо устарела, либо плохо подходит для занятий в аудитории, я посчитал предпочтительным просто исключить, а освободившееся место заполнить другими темами.

Предпосылки и мотивы написания книги

Мой собственный интерес к объектно-ориентированным языкам и объектно-ориентированной технологии программирования начался с исследований языка DPL - языка, объединяющего логическое программирование, объектно-ориентированные функции и параллелизм [Элиенс, 1992]. Подбирая материал для курса по объектно-ориентированному программированию, я не смог найти книгу, в которой уделялось бы достаточное внимание фундаментальным вопросам и формальным аспектам. Большинство книг было написано с такой точки зрения на ООП, которая не вполне подходила для моих целей. То, что было нужно мне, можно было в какой-то мере найти лишь в научных публикациях. Поэтому я построил свой курс ООП, исходя из материала небольшого числа публикаций и выбрав для этого только те статьи, которые, по моему мнению, могли бы считаться вехами в истории компьютерных наук и которые известны благодаря тому, что в них впервые вводятся какие-либо важные понятия или идеи. Несомненный недостаток лекционного курса, основанного на материале статей, состоит в отсутствии единой сквозной точки зрения и согласованной терминологии. Однако у такого подхода имеется и преимущество, заключающееся в том, что он способствует самостоятельной работе студентов по оценке вклада и значения каждой статьи, критическому сравнению различных точек зрения и выработке собственного мнения. Лично я предпочитаю оригинальные статьи, поскольку по ним легче проследить, каким образом авторы приходили к описанным ими идеям. Более поздним отшлифованным изложениям тех же идей часто не хватает этого духа первооткрывателей.

Идея разместить текстовый материал книги вокруг наглядного материала (представленного в виде слайдов) возникла у меня сама собой, в процессе разбора накопившейся коллекции слайдов. Она была продиктована желанием представить материал в компактной форме, характерной для слайдов.

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

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

Принятый в этой книге подход можно считать абстрактным в том смысле, что основное внимание уделяется концептуальным вопросам, а не частным деталям какого-либо проектного решения или языка программирования. Однажды дискуссия со студентами натолкнула меня на мысль посмотреть в словаре значение английского слова abstract, где, к своему изумлению, я узнал, что одно из его значений - красть, завладевать нечестным путем. Я с улыбкой отметил про себя, что это заставляет по-новому взглянуть на абстрактные типы данных. Более глубокое размышление заставило меня лучше понять, насколько изложенные в этой книге идеи обязаны идеям, первоначально разработанным другими. Мое более абстрактное изложение этих идей вызвано не желанием присвоить их нечестным путем, а лишь стремлением воздать этим идеям и их авторам ту дань уважения, которую они заслуживают, поместив их в контекст, сочетающий теоретические аспекты объектно-ориентированного подхода с практическими. В качестве одного из значений прилагательного абстрактный словарь также предлагает неясный (трудный для понимания). Нет необходимости говорить, что в меру своих способностей я старался избежать возможных неясностей.

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

Информация

Электронную версию оригинального издания этой книги (на английском языке) можно найти в Web по следующему адресу.

http://www.cs.vu.nl/~eliens/online/oo

С любыми вопросами или комментариями вы можете обратиться к автору по электронной почте (eliens@cs.vu.nl) или по обычной почте (Dr. A. Eliens, Vrije Universiteit, Faculty of Sciences, Division of Mathematics and Computer Science, De Boelelaan 1081, 1081 HV Amsterdam, The Netherlands).

Благодарности

При написании этой книги мне помогли энтузиазм и здоровая критика со стороны многих студентов и коллег. В последние годы это были мои аспиранты Якко ван Оссенбрюгген (Jacco van Ossenbruggen), Бастиан Шенхаге (Bastiaan Schonhage) и Мартийн ван Велие (Martijn van Welie). Я благодарен им за советы, безжалостную критику и непреодолимое стремление к логической стройности.

Кое-что для этой книги было взято из наших совместных работ. Материал по идиоме "дескриптор-тело" в главе 2 принадлежит Якко ван Оссенбрюггену. Приложение для рабочих групп в главе 6 написано Джоном Касперсом (John Caspers). Разделом по архитектурным стилям в главе 7 я обязан Бастиану Шенхаге. Главы 11 и 12 создавались в тесном сотрудничестве с Якко ван Оссенбрюггеном, Бастианом Шенхаге, Мартийном ван Велие, Франком Ниссинком (Frank Niessink), Дирком Болиером (Dirk Bolier), Сэмом Мегенсом (Sam Megens) и Полом Нэшем (Paul Nash). Я также выражаю благодарность своему коллеге Гансу де Бруину (Hans de Bruin) за предоставленный им материал по архитектурам программ; Тилю Чену (Tiel Chang), главному менеджеру групп ASZ Research and Development и ASZ/SanFrancisco, в состав которых входят Арне Бултман (Arne Bultman), Йорис Куиперс (Joris Kuipers), Ард ван дер Шеер (Ard van der Scheer), Ремко ван де Воестийне (Remco van de Woestijne) и Ирмен де Йонг (Irmen de Jong), за представленный в их работах необычный взгляд на объектную ориентацию.

Кроме того, я обязан поблагодарить за выпуск первого издания (в произвольном порядке) Ганса ван Вилета (Hans van Vilet), Генри Бала (Henri Bal), Дика Грюна (Dick Grun), Сеес Виссер (Cees Visser), Ирэ Пол (Ira Pohl), Джона Касперса (John Caspers) и Маттийса ван Доорна (Mattijs van Doorn). Я также выражаю признательность Крису Доллину (Chris Dollin) за подробный конструктивный комментарий к первому изданию. Наконец, я благодарен за помощь моим редакторам Салли Мортимор (Sally Mortimore), которая предоставила мне контракт на второе издание, Кейту Мансфилду (Keith Mansfield), занявшему место Салли, когда она ушла со своего поста, Элисону Биртвеллу (Alison Birtwell) и Карен Сазерленд (Karen Sutherland). Я благодарен Хедвигу ван Лиру (Hedwig van Lier) из издательства Pearson Education за предоставленные мне замечательные книги, Джулии Найт (Julie Knoght), которая помогала мне на этапе производства, Карен Мосман (Karen Mosman), с которой я в нескольких Web-конференциях обсуждал возможность выпуска электронной версии книги. Не могу не вспомнить Саймона Пламтри (Simon Plumtree) и Эндрю Мак-Геттрика (Andrew McGettrick) за "игру ушами" (они-то, наверняка, поймут, что я имею в виду) .

Короткие музыкальные фразы, использованные в начале каждой главы, взяты из "Альбома Анны Магдалены Бах". Хотя свой вклад в "Альбом" внесли и другие композиторы, выбранные фразы взяты из фрагментов, созданных самим Йоганном Себастьяном Бахом и первоначально предназначенных для начинающих музыкантов. Несмотря на кажущуюся простоту, даже опытные пианисты признают, что их нелегко сыграть правильно, хотя они и включены в стандартный набор ученических упражнений. В некотором отношении эта ситуация напоминает проблему обучения объектно-ориентированному программированию. Понятия, лежащие в основе объектно-ориентированного программирования, могут, на первый взгляд, показаться обманчиво простыми (и вовсе не требующими ни столь сложного языка, как C++, ни теоретико-типового анализа). Однако при разработке объектно-ориентированных моделей и приложений остаются некоторые вопросы принципиальной важности, на которые мы еще не знаем точных ответов, столь сложные, что даже для их частичного решения могут потребоваться пространные исследования и совершенно новые технологии. Возвращаясь к музыке, я хочу заметить, что часто чувствую себя импровизатором, для которого нотный текст служит лишь отправной точкой.

Антон Элиенс (Anton Eliens)

Январь 2000

Сообщите нам свое мнение

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

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

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

E-mail:info@williamspublishing.com

WWW:http://www.williamspublishing.com


Copyright © 1992-2015 Издательская группа "Диалектика-Вильямс"

Rambler  Top100