Введение

Содержание

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

     По этим и многим другим причинам почти каждая глава книги была пересмотрена. Тем не менее я попытался сохранить общую структуру книги, которая может быть представлена в виде следующего списка тем:

  1. Введение и общий замысел. Глава═1 дает неформальное определение базовых концепций объектно-ориентированного программирования. Глава═2 вводит принцип разработки на основе обязанностей. Эти две главы являются фундаментальными, и их следует изучить подробно. В частности, я настоятельно рекомендую выполнить по крайней мере одно упражнение с CRC-карточками из главы═2. Техника CRC-карточек, по моему мнению, является одной из лучших для определения функциональности, ответственности и инкапсуляции при базовой разработке проекта.
  2. Классы, методы и сообщения Главы═3 и═4 определяют синтаксис, используемый в языках Smalltalk, C++, Java, Objective-C и Object Pascal для задания классов, методов и посылки сообщений. Глава═3 заостряет внимание на статических свойствах (классах и методах), в то время как глава═4 описывает динамические аспекты (создание объектов и пересылку сообщений). Главы═5 и═6 развивают эти идеи. Здесь же начинаются обучающие примеры═≈ образцы программ, разработанных в объектно-ориентированной манере и иллюстрирующих различные черты объектной техники.
  3. Наследование и повторное использование кода Главы═7,═8 и═9 вводят концепцию наследования и объясняют ее применение для обеспечения повторного использования кода. Пример из главы═8, написанный на языке Java, иллюстрирует также применение стандартного прикладного программного интерфейса (API ≈ application program interface). В главе═9 противопоставляются наследование и композиция в качестве альтернативных техник обеспечения повторного использования кода.
  4. Более подробно о наследовании. В главах с 10 по 13 концепция наследования анализируется более детально. Введение наследования оказывает влияние на почти все аспекты языка программирования, которое зачастую не сразу очевидно для начинающего. В главе═10 обсуждается поиск методов и их связывание с сообщениями. Там же иллюстрируется тот факт, что подклассы и подтипы═≈ это не одно и то же. В главе═11 обсуждается семантика переопределения методов и отмечаются две совершенно различные интерпретации этого понятия. В главе═12 продолжается тема переопределения и исследуются некоторые следствия наследования применительно к механизмам управления памятью, присваивания и сравнения. Наконец, в главе═13 изучается множественное наследование.
  5. Полиморфизм. В значительной степени мощь объектно-ориентированного программирования проистекает из применения различных форм полиморфизма. В главе═14 читатель знакомится с основными механизмами полиморфизма в объектно-ориентированных языках и двумя показательными обучающими примерами. Первый пример в главе═15 рассматривает создание библиотек общего назначения. Конкретная библиотека, а именно недавно разработанная стандартная библиотека шаблонов (STL═≈ Standard Template Library) для языка С++, обсуждается в главе═16.
  6. Разработка программного обеспечения. В главе═17 обсуждается ряд стандартных тем компьютерной инженерии в контексте объектно-ориентированного программирования. Глава═18 знакомит с несколькими относительно новыми концепциями═≈ средой разработки приложений и шаблонами разработки. Оба подхода основаны на использовании наборов классов. Наконец, в главе═19 приводится конкретный пример среды разработки.
  7. Продвинутое изучение.Концепция классов при внимательном рассмотрении не столь проста, как нас пытались убедить в главе═3. В главе═20 рассмотрены более глубокие аспекты объектно-ориентированного программирования. Там же обсуждаются делегирование (являющееся примером объектно-ориентированного программирования без классов) и понятие метакласса (на уровне собственно языка программирования). В главе═21 в общих чертах описаны разнообразные техники реализации, применяющиеся при создании объектно-ориентированных языков.

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

         Первое издание книги я закончил главой ╚Дополнительная информация╩. К сожалению, объектно-ориентированное программирование развивается так быстро, что любая дополнительная информация почти сразу устаревает. Поэтому я не включил во второе издание главу с таким названием. Вместо этого я попытаюсь поддерживать страничку Web с последними сведениями.

Как получить исходные тексты

     Исходные тексты обучающих примеров, представленных в книге, можно получить анонимно, обратившись через ftp по адресу ftp.cs.orst.edu, каталог /pub/budd/oopintro. В том же каталоге можно будет найти дополнительную информацию, например список ошибок, обнаруженных в книге, упражнения, копии ╚прозрачек╩, которые я использую в своем курсе. Все это можно также увидеть через World Wide Web на моих личных домашних страницах по адресу http://www.cs.orst.edu/~budd/oopintro. Вопросы вы можете посылать электронной почтой по адресу budd@cs.orst.edu или обычной почтой: Professor Timothy A.═Budd, Department of Computer Science, Oregon State University, Corvallis, Oregon,═97331.

Что требуется знать для чтения книги

     Я предполагаю, что читатель знаком хотя бы с одним традиционным языком программирования, например Pascal или С. Мои курсы были вполне успешно восприняты студентами последнего года undegraduate level и первого graduate level. В некоторых случаях (особенно в последней четверти книги) более глубокие знания окажутся полезны, но они не являются обязательными. Например, студент, который специализируется на разработке программного обеспечения, легче воспримет материал главы═17, а обучающийся построению компиляторов сочтет главу═21 вполне понятной. Тематику обеих глав можно упростить при необходимости.

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

     Когда-то я начал вести курс лекций по языку Smalltalk и скоро обнаружил, что учебной литературы по данной теме не существует. Пришлось написать книгу по Smalltalk [Budd═1987], на основе которой я несколько лет вел семинар по языку Smalltalk и объектно-ориентированному программированию. Несомненно, вы уже догадались, что книгу, которую вы держите в руках, породила та же потребность. Начав преподавание в конце═80-х, я получал все возрастающее число запросов на курс, построенный на основе С++. В то же самое время популярность компьютеров Macintosh сделала известным язык Object Pascal. Наконец, появление NeXT вызвало интерес к обучению Objective-C.

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

     Вскоре я отправился на поиски учебника по курсу такого типа. К моему удивлению, довольно быстро обнаружилось, что все имеющиеся книги, совершенно восхитительные во многих отношениях, ориентированы на один отдельно взятый язык. Я изучил следующие труды: Кокс [Cox═1986], Голдберг и Робинсон [Goldberg═1983], Кэхлер и Паттерсон [Kaechler═1986], Кин [Keen═1989], Мейер [Meyer═1988a], Пинсон и Винер [Pinson═1988], а также, разумеется, Винер и Пинсон [Wiener═1988], Страуструп [Stroustrup═1986], Поль [Pohl═1989]. Хотя в результате я отобрал некоторые из них как вспомогательные, все эти книги были отвергнуты в качестве основного учебника по той простой причине, что все они сводятся к утверждению: ╚объектно-ориентированное программирование есть объектно-ориентированное программирование на языке Х╩, где Х ≈ это любимый язык программирования того или иного автора. Итак, мне пришлось писать свои собственные лекции. На следующий год я пересмотрел и дополнил свои записи. В результате родилась эта книга.

     Некоторые слушатели моего курса (который оказался намного популярнее и, следовательно, значительно многочисленнее, чем я предполагал) дополнительно к выполнению проектов на одном из четырех языков, упомянутых выше, успешно завершили работы на языках Actor [Actor═1987], Turbo Pascal [Turbo═1988] и CLOS [Keen═1989]. Так как моя задача состояла в том, чтобы передать принципы объектно-ориентированного программирования вне зависимости от конкретного языка, я спросил этих уникумов о том, пригодились ли им в написании программ мои лекции. На основании их положительных ответов я убедился, что по крайней мере частично достиг определенного уровня языковой независимости материала.

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

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

     Я, безусловно, благодарен всем═65 студентам моей группы CS589 университета штата Орегон, которые в течение═1989 года вытерпели на себе процесс становления чернового варианта этой книги. Они получали на руки по одной главе, зачастую всего за день или за два до того, как им предстояло услышать соответствующий материал на лекции. Их терпению отдается должное. Конкретные примечания, исправления, замечания и критика моих уважаемых студентов были чрезвычайно полезны. В частности, я хочу поблагодарить за подробные комментарии Томаса Амофа (Thomas Amoth), Кима Дронгезена (Kim Drongesen), Франка Грисволда (Frank Griswold), Раджива Пандея (Rajeev Pandey) и Фила Радера (Phil Ruder).

     Пасьянс из главы═8 был вдохновлен проектом, выполненным Кимом Дронгезеном, а игра ╚Бильярд╩ (глава═6) основана на проекте Гунтара Мамье (Guenter Mamier) и Дитриха Веттшерека (Dietrich Wettschereck). Однако в обоих случаях собственно текст программы был мной полностью переработан. Фактически мои варианты программ с целью лучшего изложения были значительно сокращены и никоим образом не сопоставимы с намного превосходящими их проектами, выполненными этими студентами.

     Я также признателен тем людям, которые внесли комментарии, исправления, замечания. К ним относятся: Майкл Адар (Michael Adar), Джери Андреас (Jerrie Andreas), Линн Кокран (Lynn Cochran), Брэд Кокс (Brad Cox), Грахам Дамплетон (Graham Dumpleton), Питер Грогоно (Peter Grogono), Нола Хаг (Nola Hague), Марсиа Хортон (Marcia Horton), Ральф Джонсон (Ralph Johnson), Дуг Ли (Doug Lea), Тэд Льюис (Ted Lewis), Стэнли Липман (Stanley Lippman), Дарси МакКаллум (Darcy McCallum), Линдсей Маршал (Lindsey Marshall), Макку Саккинен (Makku Sakkinen), Майкл Шаре (Michael Share), Дэйв Тензер (Dave Taenzer), Набиль Замель (Nabil Zamel). Хочу поблагодарить рецензентов Еда Герингера (Ed Gehringer), Джеймса Хелиотиса (James Heliotis), Карла Либергерра (Karl Lieberherr), Джеффа Паркера (Jeff Parker), Джастима Смита (Justim Smith) и Даниеля Штермса (Daniel Sterms).

     Листинги программ были напечатаны с помощью макросов LaTeX, основанных на макросах форматирования программ С, написанных Эамонном МакМанусом (Eamonn McManus) из колледжа Святой Троицы, Дублин.

     Для любого автора всегда полезно узнать точку зрения других людей на его книгу. Поэтому я благодарю Арину Бринц (Arina Brintz), Луиса Линена (Louise Leenen), Томми Мейера (Tommie Meyer), Елену Розенблатт (Helene Rosenblatt) и Анель Вильоен (Anel Viljoen) с факультета компьютерных наук и информационных систем южноафриканского университета в Претории.

     Огромное количество людей оказало помощь в устранении ошибок и недочетов первого издания и внесении улучшений. Я признателен всем и сожалею, что не могу перечислить здесь всех. Рецензентами второго издания были Томас Бонник (Thomas Bonnick), Северо-Восточный университет, М.═А.═Шридхар (M.═A.═Shridhar), университет штата Южная Каролина, и Уолтер С.═Дохерити (Walter C.═Daugherity), A&M университет, Техас.

     Линн Доран═Коте (Lynne Doran Cote) и Дебора Лафферти (Debora Laffertey) из Addison Wesley были компетентными и терпеливыми редакторами второго издания. Помощь в издании книги была оказана Анн Найт (Ann Knight) из Superscript.


Введение