• Название:

    Бадд Т. Объектно ориентированное программиров..


  • Размер: 3.28 Мб
  • Формат: PDF
  • или
  • Сообщить о нарушении / Abuse

Установите безопасный браузер



    Предпросмотр документа

    Содержание
    Введение
    1.

    Объектно-ориентированное мышление
    1. Почему ООП так популярно?
    2. Язык и мышление
    Эскимосы и снег • Пример из области программирования • Принцип Чёрча и
    гипотеза Ворфа
    3. Новая парадигма
    4. Способ видения мира
    Агенты, обязанности, сообщения и методы • Обязанности и ответственности •
    Классы и экземпляры • Иерархии классов и наследование • Связывание и
    переопределение методов • Краткое изложение принципов
    5. Вычисление и моделирование
    Сила метафор • Как избежать бесконечной регрессии
    6. Барьер сложности Нелинейное увеличение сложности • Механизмы
    абстрагирования
    7. Многократно используемое программное обеспечение
    8. Резюме
    Что читать дальше
    Упражнения
    2. Объектно-ориентированное проектирование
    1. Ответственность подразумевает невмешательство
    2. Программирование «в малом» и «в большом»
    3. Почему надо начинать с функционирования?
    4. Учебный пример: проектирование на основе обязанностей
    Интерактивный разумный кухонный помощник • Работа по сценарию •
    Идентификация компонент
    5. CRC-карточка — способ записи обязанностей
    Дайте компонентам физический образ • Цикл «что/кто» • Документирование
    6. Компоненты и поведение
    Отложенные решения • Готовность к изменениям • Продолжение работы со
    сценарием • Диаграммы взаимодействия
    7. Компоненты программы
    Поведение и состояние • Экземпляры и классы • Зацепление и связность •
    Интерфейс и реализация модуля — принципы Парнаса
    8. Формализация интерфейса
    Выбор имен
    9. Выбор представления данных
    10. Реализация компонент
    11. Интеграция компонент
    12. Сопровождение и развитие
    Упражнения
    3. Классы и методы
    1. Инкапсуляция
    2. Разновидности классов
    3. Пример: игра в карты
    4. Интерфейс и реализация
    5. Классы и методы в ООП
    Классы и методы в языке Object Pascal • Классы и методы в языке Smalltalk •
    Классы и методы в языке Objective-C • Классы и методы в языке C++ • Классы и
    методы в языке Java
    Упражнения
    4. Сообщения, экземпляры и инициализация
    1. Синтаксис пересылки сообщений
    Синтаксис пересылки сообщений в Object Pascal • Синтаксис пересылки
    сообщений в C++ • Синтаксис пересылки сообщений в Java • Синтаксис
    пересылки сообщений в Smalltalk • Синтаксис пересылки сообщений в Objective-C
    2. Способы создания и инициализации
    Стек против «кучи» • Восстановление памяти • Указатели • Создание
    неизменяемого экземпляра объекта

    www.books-shop.com

    3.

    5.

    6.

    7.

    8.

    9.

    10.

    Механизмы создания и инициализации
    Создание и инициализация в C++ • Создание и инициализация в Java • Создание
    и инициализация в Objective-C • Создание и инициализация в Object Pascal •
    Создание и инициализация в Smalltalk
    Упражнения
    Учебный пример: задача о восьми ферзях
    1. Задача о восьми ферзях
    Создание объектов, решающих «самих себя»
    2. Использование генераторов
    Инициализация • Нахождение решения • Продвижение на следующую позицию
    3. Задача о восьми ферзях в различных языках программирования
    Задача о восьми ферзях: Object Pascal • Задача о восьми ферзях: C++ • Задача о
    восьми ферзях: Java • Задача о восьми ферзях: Objective-C • Задача о восьми
    ферзях: Smalltalk
    Упражнения
    Учебный пример: игра «Бильярд»
    1. Элементы бильярда
    2. Графические объекты
    Графический объект Wall (стенка) • Графический объект Hole (луза) •
    Графический объект Ball (шар)
    3. Основная программа
    4. Использование наследования
    Упражнения
    Наследование
    1. Интуитивное описание наследования
    2. Подкласс, подтип и принцип подстановки
    Подтипы и строгий контроль типов данных
    3. Формы наследования
    Порождение подклассов для специализации (порождение подтипов) • Порождение
    подкласса для спецификации • Порождение подкласса с целью конструирования •
    Порождение подкласса для обобщения • Порождение подкласса для расширения •
    Порождение подкласса для ограничения • Порождение подкласса для
    варьирования • Порождение подкласса для комбинирования • Краткое
    перечисление форм наследования
    4. Наследование в различных языках программирования
    Наследование в языке Object Pascal • Наследование в языке Smalltalk •
    Наследование в языке Objective-C • Наследование в языке C++ • Наследование в
    языке Java
    5. Преимущества наследования
    Повторное использование программ • Использование общего кода • Согласование
    интерфейса • Программные компоненты • Быстрое макетирование • Полиморфизм
    и структура • Маскировка информации
    6. Издержки наследования Скорость выполнения • Размер программ • Накладные
    расходы на посылку сообщений • Сложность программ
    Упражнения
    Учебный пример: пасьянс
    1. Класс игральных карт Card
    2. Связные списки
    3. Правила пасьянса
    4. Стопки карт — наследование в действии
    Основание SuitPile • Колода DeckPile • Промежуточная стопка DiscardPile • Стопка
    расклада TablePile
    5. Полиморфная игра
    6. Создание более сложной игры
    Упражнения
    Повторное использование кода
    1. Наследование и принцип подстановки
    «Быть экземпляром» и «включать как часть»
    2. Композиция и наследование: описание
    Использование композиции • Применение наследования • Закрытое наследование
    в языке C++
    3. Противопоставление композиции и наследования
    4. Повторное использование кода: реальность?
    Упражнения
    Подклассы и подтипы

    www.books-shop.com

    1.

    11.

    12.

    13.

    14.

    15.

    Связывание методов и сообщения
    Связывание методов • Проблема обращения полиморфизма
    2. Связывание в языках программирования
    Связывание в языке Object Pascal • Связывание в языке Smalltalk • Связывание в
    языке Objective-C • Связывание в языке C++ • Связывание в языке Java
    3. Как связывать: статически или динамически?
    Упражнения
    Замещение и уточнение
    1. Добавление, замещение и уточнение
    Американская и скандинавская семантики
    2. Замещение методов
    Замещение методов и принцип подстановки • Уведомление о замещении
    3. Замещение в разных языках
    Замещение в C++ • Замещение методов в Object Pascal • Замещение в Smalltalk и
    Objective-C • Замещение в Java
    4. Уточнение методов
    Уточнение в языках Simula и Beta • Методы-оболочки в языке CLOS
    5. Уточнение в разных языках
    Уточнение в Object Pascal • Уточнение в C++ • Уточнение в Smalltalk, Java и
    Objective-C
    Упражнения
    Следствия наследования
    1. Выделение памяти
    Размещение минимальной статической памяти • Размещение максимальной
    статической памяти • Динамическое выделение памяти
    2. Присваивание
    Присваивание в C++ • Присваивание в Object Pascal и Java • Присваивание в
    Smalltalk • Присваивание в Objective-C
    3. Проверка на равенство
    Ковариация и контрвариация • Равенство в Objective-C, Java и Object Pascal •
    Равенство в Smalltalk • Равенство в C++
    4. Преобразование типов
    Упражнения
    Множественное наследование
    1. Комплексные числа
    2. Всплывающие меню
    3. Двусмысленность имен
    Наследование через общих предков
    4. Множественное наследование в C++
    5. Множественное наследование в Java
    Литература для дальнейшего чтения
    Упражнения
    Полиморфизм
    1. Полиморфизм в языках программирования
    Полиморфные функции в динамических языках • Абстракции низкого и высокого
    уровней
    2. Разновидности полиморфизма
    3. Полиморфные переменные
    4. Перегрузка
    Перегрузка в реальной жизни • Перегрузка и приведение типа • Перегрузка не
    подразумевает сходство • Параметрическая перегрузка
    5. Переопределение
    Переопределение в классе Magnitude
    6. Отложенные методы
    7. Чистый полиморфизм
    8. Обобщенные функции и шаблоны
    9. Полиморфизм в различных языках
    Полиморфизм в C++ • Полиморфизм в Java • Полиморфизм в Object Pascal •
    Полиморфизм в Objective-C • Полиморфизм в Smalltalk
    10. Эффективность и полиморфизм
    Упражнения
    Учебный пример: контейнерные классы
    1. Использование традиционных подходов
    2. Контейнеры в динамических языках
    3. Контейнеры в языках со строгим контролем типа данных
    4. Скрытое приведение типа данных при наследовании

    www.books-shop.com

    5.

    16.

    17.

    18.

    19.

    20.

    21.

    Параметризованные классы
    Циклы и итерации в C++
    Упражнения
    Пример: STL
    1. Итераторы
    2. Объекты-функции
    3. Пример программы: инвентаризация
    4. Пример программы: графы
    5. Пример программы: алфавитный указатель
    6. Будущее ООП
    Упражнения
    Видимость и зависимость
    1. Зацепление и связность
    Разновидности зацепления • Разновидности связности • Зацепление и связность в
    ООП • Закон Деметера • Видимость: на уровне классов и на уровне объектов •
    Активные значения
    2. Клиенты-подклассы и клиенты-пользователи
    3. Управление доступом и видимостью Видимость в Smalltalk • Видимость в Object
    Pascal • Видимость в C++ • Видимость в Java • Видимость в Objective-C
    4. Преднамеренное зацепление
    Упражнения
    Среды и схемы разработки
    1. Среда разработки
    Java API • Среда моделирования
    2. Схемы разработки
    Схемы с посредником • Схемы обхода • Схема двойной диспетчеризации •
    Классификация схем разработок
    Упражнения
    Учебный пример: среда разработки
    1. Компоненты GUI
    2. Выполнение, управляемое событиями
    3. Настройка через наследование
    4. Классы в среде LAF
    5. Класс application
    Класс button • Классы menu и menuItem
    6. Резюме
    Упражнения
    Новый взгляд на классы
    1. Классы как типы
    Как наследование усложняет понятие типа • Наследование и память
    2. Классы как объекты
    Фабрики по созданию объектов • Класс Class • Метаклассы и класс-методы •
    Инициализация объектов • Подстановки в Objective-C
    3. Данные класса
    Переменные класса в Smalltalk • Переменные класса в C++ • Переменные класса
    в Java • Переменные класса в Objective-C
    4. Нужны ли классы?
    Что такое знание? • Делегирование полномочий
    Упражнения
    Реализация объектно-ориентированных языков
    1. Компиляторы и интерпретаторы
    2. Компиляторы
    Проблема «срезки» • Соответствие между методами и сообщениями • Таблицы
    виртуальных методов • Кодирование имен • Таблицы диспетчеризации
    3. Интерпретаторы
    Литература для дальнейшего чтения
    Упражнения
    Приложение A. Исходный код программ для задачи «Восемь ферзей»

    1.
    2.
    3.
    4.
    5.

    «Задача о восьми ферзях» на
    «Задача о восьми ферзях» на
    «Задача о восьми ферзях» на
    HTML-файл для апплета Java
    «Задача о восьми ферзях» на
    «Задача о восьми ферзях» на

    языке Apple Object Pascal
    языке С++
    языке Java
    языке Objective-C
    языке Smalltalk

    www.books-shop.com

    Приложение Б. Исходный код игры «Бильярд»
    1.
    2.

    Версия без использования наследования
    Версия с использованием наследования
    Приложение В. исходный код программ для карточного пасьянса

    1.
    2.

    HTML-файл для апплета
    Файл Solitare.java

    www.books-shop.com

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

    ƒ
    ƒ

    ƒ
    ƒ
    ƒ

    ƒ
    ƒ

    Более глубокое понимание различия между подклассами и подтипами и признание того
    факта, что зачастую это далеко не одно и то же.
    Быстрый рост, эволюция и стандартизация языка программирования С++, включая
    введение шаблонов, исключительных ситуаций, логических переменных, пространства
    имен, строк, идентификации типов данных во время выполнения (RTTI — run-time type
    identification system) и стандартной библиотеки.
    Появление языка программирования Java — восхитительного нового средства для
    разработки приложений World Wide Web.
    Медленное исчезновение языка Object Pascal после того, как Apple перестала
    использовать его в качестве основного средства создания приложений для компьютеров
    Macintosh. Однако на PC этот язык возвращается к жизни в образе Delphi.
    Закат и падение Objective-C. Для тех, кто профессионально занимается языками
    программирования, это — болезненная утрата, так как динамически типизированный
    Objective-C оставался практически единственной альтернативой строгой типизации в духе
    C++. Поэтому в данном издании я продолжил обсуждение Objective-C.
    Развитие новых интересных объектно-ориентированных языков (таких, как Beta, CLOS и
    Java), которые соединяют современные и классические идеи.
    Становление представлений о совокупностях классов, в частности появление таких
    понятий, как шаблоны конструирования классов и среда разработки приложений.

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

    II.

    III.

    IV.

    V.

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

    www.books-shop.com

    VI.

    VII.

    ориентированных языках и двумя показательными обучающими примерами. Первый
    пример в главе 15 рассматривает создание библиотек общего назначения. Конкретная
    библиотека, а именно недавно разработанная стандартная библиотека шаблонов (STL —
    Standard Template Library) для языка С++, обсуждается в главе 16.
    Разработка программного обеспечения. В главе 17 обсуждается ряд стандартных тем
    компьютерной инженерии в контексте объектно-ориентированного программирования.
    Глава 18 знакомит с несколькими относительно новыми концепциями — средой
    разработки приложений и шаблонами разработки. Оба подхода основаны на
    использовании наборов классов. Наконец, в главе 19 приводится конкретный пример
    среды разработки.
    Продвинутое изучение.Концепция классов при внимательном рассмотрении не столь
    проста, как нас пытались убедить в главе 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.

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