Основы объектно-ориентированного программирования


              

Основы объектно-ориентированного программирования

Внешние и внутренние факторы
Обзор внешних факторов
Корректность (Correctness)
Устойчивость (Robustness)
Расширяемость (Extendibility)
Повторное использование (Reusability)
Совместимость (Compatibility)
Эффективность (Efficiency)

Эффективность (Efficiency) - 2
Эффективность (Efficiency) - 3
Переносимость (Portability)
Простота использования (Easy of Use)
Простота использования (Easy of Use) - 2
Функциональность (Functionality)
Функциональность (Functionality) - 2
Своевременность (Timeliness)
Другие качества
О документации

Компромиссы
Ключевые вопросы
Ключевые вопросы - 2
О программном сопровождении
О программном сопровождении - 2
О программном сопровождении - 3
Ключевые концепции

О критериях

О критериях
До какой степени мы должны быть догматичными?
Категории
Метод и язык
Бесшовность (seamlessness)

Классы
Утверждения (Assertions)
Классы как модули
Классы как типы
Вычисления, основанные на компонентах
Скрытие информации (information hiding)
Обработка исключений (Exception handling)
Статическая типизация (static typing)
Универсальность (genericity)
Единичное наследование (single inheritance)

Множественное наследование (Multiple inheritance)
Дублируемое наследование (Repeated inheritance)
Ограниченная универсальность (Constrained genericity)
Переопределение (redefinition)
Полиморфизм
Динамическое связывание
Выяснение типа объекта в период выполнения
Отложенные (deferred) свойства и классы
Управление памятью (memory management) и сборка мусора (garbage collection)
Реализация и среда

Автоматическое обновление (automatic update)
Быстрое обновление (fast update)
Живучесть (persistence)
Документация
Быстрый просмотр (browsing)
Библиотеки
Базовые библиотеки
Графика и пользовательские интерфейсы
Механизмы эволюции библиотек
Механизмы индексации в библиотеках

Продолжение просмотра
Библиографические ссылки и объектные ресурсы

Пять критериев

Пять критериев
Декомпозиция
Декомпозиция - 2
Модульная Композиция
Модульная Композиция - 2
Модульная Понятность
Модульная Непрерывность
Модульная Непрерывность - 2

Модульная Защищенность
Пять правил
Прямое отображение
Минимум интерфейсов
Слабая связность интерфейсов
Слабая связность интерфейсов - 2
Явные интерфейсы
Скрытие информации
Скрытие информации - 2
Скрытие информации - 3

Пять принципов
Лингвистические Модульные Единицы
Самодокументирование
Самодокументирование - 2
Унифицированный Доступ
Унифицированный Доступ - 2
Открыт-Закрыт
Открыт-Закрыт - 2
Открыт-Закрыт - 3
Открыт-Закрыт - 4

Открыт-Закрыт - 5
Единственный Выбор
Единственный Выбор - 2
Единственный Выбор - 3
Единственный Выбор - 4
Ключевые концепции
Библиографические замечания
У3.1 Модульность в языках программирования
У3.2 Принцип Открыт-Закрыт (для программистов Lisp)
У3.3 Ограничения на скрытие информации

У3.4 Метрики для модульности (отчетная исследовательская работа)
У3.5 Модульность существующих систем
У3.6 Управление конфигурацией и наследование

Цели повторного использования

Цели повторного использования
Ожидаемые преимущества
Ожидаемые преимущества - 2
Потребители и производители повторно используемых программ
Что следует повторно использовать?
Повторное использование персонала
Повторное использование проектов и спецификаций

Образцы проектов (design patterns)
Образцы проектов (design patterns) - 2
Повторное использование исходного текста
Повторное использование абстрактных модулей
Повторяемость при разработке ПО
Нетехнические препятствия
Синдром NIH
Синдром NIH - 2
Фирмы по разработке ПО и их стратегии
Фирмы по разработке ПО и их стратегии - 2

Организация доступа к компонентам
Несколько слов об индексировании компонентов
Форматы для распространения повторно используемых компонентов
Форматы для распространения повторно используемых компонентов - 2
Форматы для распространения повторно используемых компонентов - 3
Оценка
Техническая проблема
Изменения и постоянство
Изменения и постоянство - 2
Повторно использовать или переделать? (The reuse-redo dilemma)

Пять требований к модульным структурам
Изменчивость Типов (Type Variation)
Группирование Подпрограмм (Routine Grouping)
Изменчивость Реализаций (Implementation Variation)
Независимость Представлений
Независимость Представлений - 2
Факторизация Общего Поведения
Факторизация Общего Поведения - 2
Факторизация Общего Поведения - 3
Традиционные модульные структуры

Подпрограммы
Пакеты
Пакеты - 2
Пакеты - 3
Пакеты: оценка
Перегрузка и универсальность
Синтаксическая перегрузка
Синтаксическая перегрузка - 2
Синтаксическая перегрузка - 3
Семантическая перегрузка (предварительное представление)

Универсальность (genericity)
Универсальность (genericity) - 2
Основные методы модульности: оценка
Ключевые концепции
Библиографические замечания
Библиографические замечания - 2
Библиографические замечания - 3
Библиографические замечания - 4

Ингредиенты вычисления

Ингредиенты вычисления
Базисный треугольник

Базисный треугольник - 2
Функциональная декомпозиция
Непрерывность
Проектирование сверху вниз
Проектирование сверху вниз - 2
Не только одна главная функция
Не только одна главная функция - 2
Обнаружение вершины
Функции и эволюция
Интерфейсы и проектирование ПО

Преждевременное упорядочение
Упорядочивание и ОО-разработка
Упорядочивание и ОО-разработка - 2
Возможность повторного использования
Производство и описание
Проектирование сверху вниз: общая оценка
Декомпозиция, основанная на объектах
Расширяемость
Возможность повторного использования
Совместимость

Объектно-ориентированное конструирование ПО
Вопросы
Выявление типов объектов
Описания типов и объектов
Описание отношений и структурирование ПО
Ключевые концепции
Библиографические замечания

Критерии

Критерии
Различные реализации
Представления стеков

Представления стеков - 2
Опасность излишней спецификации
Какова длина второго имени?
К абстрактному взгляду на объекты
Использование операций
Политика невмешательства в обществе модулей
Согласованность имен
Можно ли обойтись без абстракций?
Можно ли обойтись без абстракций? - 2
Формализация спецификаций

Специфицирование типов
Универсализация (Genericity)
Перечисление функций
Перечисление функций - 2
Перечисление функций - 3
Категории функций
Раздел АКСИОМЫ
Раздел АКСИОМЫ - 2
Две или три вещи, которые мы знаем о стеках
Частичные функции

Предусловия
Полная спецификация
Ничего кроме правды
Ничего кроме правды - 2
От абстрактных типов данных к классам
Классы
Как создавать эффективный класс
Роль отложенных классов
Абстрактные типы данных и скрытие информации
Переход к более императивной точке зрения

Назад к тому, с чего начали?
Конструирование объектно-ориентированного ПО
За пределами программ
За пределами программ - 2
Дополнительные темы
Еще раз о неявности
Соотношение спецификации и проектирования
Соотношение классов и записей
Альтернативы частичным функциям
Альтернативы частичным функциям - 2

Полна ли моя спецификация?
Полна ли моя спецификация? - 2
Полна ли моя спецификация? - 3
Полна ли моя спецификация? - 4
Доказательство достаточной полноты
Доказательство достаточной полноты - 2
Доказательство достаточной полноты - 3
Доказательство достаточной полноты - 4
Доказательство достаточной полноты - 5
Ключевые концепции

Библиографические замечания
У6.1 Точки
У6.2 Боксеры
У6.3 Банковские счета
У6.4 Сообщения
У6.5 Имена
У6.6 Текст
У6.7 Покупка дома
У6.8 Дополнительные операции для стеков
У6.9 Ограниченные стеки

У6.10 Очереди
У6.11 Распределители
У6.12 Булевский -- BOOLEAN
У6.13 Достаточная полнота
У6.14 Непротиворечивость

Классы, а не объекты - предмет обсуждения

Классы, а не объекты - предмет обсуждения
Устранение традиционной путаницы
Роль классов
Модули и типы
Класс как модуль и как тип

Унифицированная система типов
Унифицированная система типов - 2
Простой класс
Компоненты
Атрибуты и подпрограммы
Атрибуты и подпрограммы - 2
Унифицированный доступ
Унифицированный доступ - 2
Класс POINT
Основные соглашения

Распознавание вида компонент
Тело подпрограммы и комментарии к заголовку
Предложение indexing
Обозначение результата функции
Правила стиля
Наследование функциональных возможностей общего характера
Объектно-ориентированный стиль вычислений
Текущий экземпляр
Клиенты и поставщики
Вызов компонента

Принцип единственности цели
Слияние понятий модуль и тип
Роль объекта Current
Квалифицированные и неквалифицированные вызовы
Компоненты-операции
Компоненты-операции - 2
Компоненты-операции - 3
Компоненты-операции - 4
Селективный экспорт и скрытие информации
Неограниченный доступ

Ограничение доступа клиентам
Стиль объявления скрытых компонент
"Внутренний" экспорт
Собираем все вместе
Общая относительность
Большой Взрыв
Большой Взрыв - 2
Системы
Программа main отсутствует
Компоновка системы

Компоновка системы - 2
Компоновка системы - 3
Классическое "Hello"
Структура и порядок: программист в роли поджигателя
Обсуждение
Форма объявлений
Атрибуты или функции?
Экспорт атрибутов
Доступ клиентов к атрибутам
Доступ клиентов к атрибутам - 2

Оптимизация вызовов
Архитектурная роль селективного экспорта
Импорт листингов
Присваивание функции результата
Присваивание функции результата - 2
Присваивание функции результата - 3
Дополнение: точное определение сущности
Ключевые концепции
Библиографические замечания
У7.1 POINT как абстрактный тип данных

У7.2 Завершение реализации POINT
У7.3 Полярные координаты

Объекты

Объекты
Что такое объект?
Базовая форма
Простые поля
Простое представление книги - класс BOOK
Писатели
Ссылки
Ссылки - 2

Идентичность объектов
Объявление ссылок
Ссылка на себя
Взгляд на структуру объектов периода выполнения
Объекты как средство моделирования
Четыре мира программной разработки
Реальность: "седьмая вода на киселе"
Реальность: "седьмая вода на киселе" - 2
Работа с объектами и ссылками
Динамическое создание и повторное связывание

Инструкция создания
Инструкция создания - 2
Общая картина
Для чего необходимо явное создание объектов?
Для чего необходимо явное создание объектов? - 2
Процедуры создания
Перекрытие инициализации по умолчанию
Перекрытие инициализации по умолчанию - 2
Статус экспорта процедур создания
Правила, применимые к процедурам создания

Процедуры создания и перегрузка
Еще о ссылках
Состояния ссылок
Вызовы и пустые ссылки
Операции над ссылками
Присоединение ссылки к объекту
Сравнение ссылок
Значение void
Клонирование и сравнение объектов
Копирование объектов

Глубокое клонирование и сравнение
Глубокое клонирование и сравнение - 2
Глубокое хранилище: первый взгляд на сохраняемость
Глубокое хранилище: первый взгляд на сохраняемость - 2
Глубокое хранилище: первый взгляд на сохраняемость - 3
Глубокое хранилище: первый взгляд на сохраняемость - 4
Составные объекты и развернутые типы
Ссылок не достаточно
Развернутые типы
Роль развернутых типов

Роль развернутых типов - 2
Агрегирование
Свойства развернутых типов
Недопустимость ссылок на подобъекты
Присоединение: две семантики - ссылок и значений
Присоединение
Присоединение: ссылочное и копии
Гибридное присоединение
Проверка эквивалентности
Работа со ссылками: преимущества и опасности

Динамические псевдонимы
Семантика использования псевдонимов
Выработка соглашений для динамических псевдонимов
Псевдонимы в ПО и за его пределами
Псевдонимы в ПО и за его пределами - 2
Инкапсуляция действий со ссылками
Инкапсуляция действий со ссылками - 2
Обсуждение
Графические соглашения
Ссылки и простые значения

Ссылки и простые значения - 2
Ссылки и простые значения - 3
Ссылки и простые значения - 4
Форма операций клонирования и эквивалентности
Статус универсальных операций
Ключевые концепции
Библиографические замечания
У8.1 Книги и авторы
У8.2 Личности
У8.3 Проектирование нотации

Что происходит с объектами

Что происходит с объектами
Создание объектов
Создание объектов - 2
Использование динамического режима
Повторное использование памяти в трех режимах
Отсоединение
Недостижимые объекты
Достижимые объекты в классическом подходе
Достижимые объекты в классическом подходе - 2
Достижимые объекты в ОО-модели

Проблема управления памятью в ОО-модели
Три ответа
Несерьезный подход (тривиальный)
Может ли быть оправдан несерьезный подход?
Надо ли заботиться о памяти?
Байт здесь, байт там, и реальные покойники
Байт здесь, байт там, и реальные покойники - 2
Восстановление памяти: проблемы
Удаление объектов, управляемое программистом
Проблема надежности

Проблема простоты разработки
Подход на уровне компонентов
Управление памятью связного списка
Управление памятью связного списка - 2
Работа с утилизированными объектами
Дискуссия
Автоматическое управление памятью
Необходимость автоматических методов
Что в точности понимается под восстановлением?
Подсчет ссылок

Подсчет ссылок - 2
Сборка мусора
Механизм сборки мусора
Механизм сборки мусора - 2
Основа сборки мусора
Сборка по принципу "все-или-ничего"
Сборка по принципу "все-или-ничего" - 2
Продвинутый (Advanced) подход к сборке мусора
Алгоритмы параллельной сборки мусора
Практические проблемы сборки мусора

Класс MEMORY
Механизм освобождения
Сборка мусора и внешние вызовы
Среда с управлением памятью
Основы
Сложные проблемы
Перемещение объектов
Механизм сборки мусора
Повышенное чувство голода и потеря аппетита (Bulimia and anorexia)
Операции сборщика мусора

Ключевые концепции
Библиографические заметки
У9.1 Модели создания объектов
У9.2 Какой уровень утилизации?
У9.3 Совместное использование стека достижимых элементов
У9.4 Совместное использование

Горизонтальное и вертикальное обобщение типа

Горизонтальное и вертикальное обобщение типа
Необходимость параметризованных классов
Родовые АТД
Проблема

Роль типизации
Родовые классы
Объявление родового класса
Использование родового класса
Терминология
Проверка типов
Правило типизации
Операции над сущностями родового типа
Типы и классы
Массивы

Массивы как объекты
Свойства массива
Размышления об эффективности
Синонимичная инфиксная операция
Стоимость универсализации
Обсуждение: что все-таки не сделано
Ключевые концепции
Библиографические замечания
У10.1 Ограниченная универсализация
У10.2 Двумерные массивы

У10.3 Использование своего формального родового параметра фактически как чужого

Базисные механизмы надежности

Базисные механизмы надежности
О корректности ПО
О корректности ПО - 2
Выражение спецификаций
Формула корректности
Сильные и слабые условия
Сильные и слабые условия - 2
Введение утверждений в программные тексты
Предусловия и постусловия

Класс стек
Предусловия
Постусловия
Педагогическое замечание
Контракты и надежность ПО
Права и обязательства
Интуиция (Дзен) и искусство программной надежности: больше гарантий и меньше проверок
Интуиция (Дзен) и искусство программной надежности: больше гарантий и меньше проверок - 2
Интуиция (Дзен) и искусство программной надежности: больше гарантий и меньше проверок - 3
Утверждения не являются механизмом проверки вводимых данных

Утверждения это не управляющие структуры
Ошибки, дефекты и другие насекомые
Работа с утверждениями
Класс стек
Класс стек - 2
Императив и аппликатив (применимость)
Императив и аппликатив (применимость) - 2
Замечание о пустоте структур
Проектирование предусловий: толерантное или требовательное?
Проектирование предусловий: толерантное или требовательное? - 2

Проектирование предусловий: толерантное или требовательное? - 3
Предусловия и статус экспорта
Предусловия и статус экспорта - 2
Толерантные модули
Толерантные модули - 2
Толерантные модули - 3
Инварианты класса
Определение и пример
Форма и свойства инвариантов класса
Инвариант в момент изменения

Кто должен обеспечить сохранность инвариантов
Роль инвариантов класса в программной инженерии
Инварианты и контракты
Инварианты и контракты - 2
Когда класс корректен?
Корректность класса
Роль процедур создания
Ревизия массивов
Связывание с АТД
Не просто коллекция функций

Компоненты класса и АТД функции
Выражение аксиом
Функция абстракции
Инварианты реализации
Инварианты реализации - 2
Инструкция утверждения
Инструкция утверждения - 2
Инструкция утверждения - 3
Инварианты и варианты цикла
Трудности циклов

Трудности циклов - 2
Сделаем циклы корректными
Ингредиенты доказательства корректности цикла
Ингредиенты доказательства корректности цикла - 2
Синтаксис цикла
Синтаксис цикла - 2
Использование утверждений
Утверждения как средство для написания корректного ПО
Использование утверждений для документирования: краткая форма класса
Использование утверждений для документирования: краткая форма класса - 2

Использование утверждений для документирования: краткая форма класса - 3
Мониторинг утверждений в период выполнения
Мониторинг утверждений в период выполнения - 2
Каков оптимальный уровень мониторинга?
Каков оптимальный уровень мониторинга? - 2
Каков оптимальный уровень мониторинга? - 3
Каков оптимальный уровень мониторинга? - 4
Каков оптимальный уровень мониторинга? - 5
Обсуждение
Нужен ли мониторинг в период выполнения?

Выразительная сила утверждений
Выразительная сила утверждений - 2
Включение функций в утверждения
Включение функций в утверждения - 2
Включение функций в утверждения - 3
Инварианты класса и семантика ссылок
Инварианты класса и семантика ссылок - 2
Инварианты класса и семантика ссылок - 3
Что дальше
Ключевые концепции

Библиографические замечания
Библиографические замечания - 2
У11.1 Комплексные числа
У11.2 Класс и его АТД
У11.3 Полные утверждения для стеков
У11.4 Экспортирование размера
У11.6 Утверждения и экспорт
У11.7 Поиск жучков (bugs)
У11.8 Нарушение инварианта
У11.9 Генерация случайных чисел

У11.10 Модуль "очередь"
У11.11 Модуль "множество"
Постскриптум: Катастрофа Ариан 5
Постскриптум: Катастрофа Ариан 5 - 2

Базисные концепции обработки исключений

Базисные концепции обработки исключений
Отказы
Исключения
Источники исключений
Ситуации отказа
Обработка исключений

Как не следует делать это - C-Unix пример
Как не следует делать это - Ada пример
Как не следует делать это - Ada пример - 2
Принципы обработки исключений
Принципы обработки исключений - 2
Цепочка вызовов
Механизм исключений
Спаси и Повтори (Rescue и Retry)
Как отказаться сразу
Таблица истории исключений

Таблица истории исключений - 2
Примеры обработки исключений
Поломки при вводе
Восстановление при исключениях, сгенерированных операционной системой
Повторение программы, толерантной к неисправностям
N-версионное программирование
N-версионное программирование - 2
Задача предложения rescue
Корректность предложения rescue
Четкое разделение ролей

Когда нет предложения rescue
Продвинутая обработка исключений
Запросы при работе с классом EXCEPTIONS
Запросы при работе с классом EXCEPTIONS - 2
Какой должна быть степень контроля?
Исключения разработчика
Обсуждение
Дисциплинированные исключения
Должны ли исключения быть объектами?
Методологическая перспектива

Ключевые концепции
Библиографические замечания
У12.1 Наибольшее целое
У12.2 Объект Exception

Взаимодействие с не объектным ПО

Взаимодействие с не объектным ПО
Внешние программы
Улучшенные варианты
Использование внешних программ
ОО-изменение архитектуры (re-architecturing)
ОО-изменение архитектуры (re-architecturing) - 2

Вопрос совместимости: гибридный программный продукт или гибридные языки?
Передача аргументов
Передача аргументов - 2
Инструкции
Вызов процедуры
Присваивание (Assignment)
Создание (Creation)
Условная Инструкция (Conditional)
Множественный выбор
Множественный выбор - 2

Циклы
Проверка
Отладка
Повторение вычислений
Выражения
Манифестные константы
Вызовы функций
Текущий объект
Выражения с операторами
Нестрогие булевы операторы

Нестрогие булевы операторы - 2
Строки
Ввод и вывод
Лексические соглашения
Ключевые концепции
У13.1 Внешние классы
У13.2 Избегая нестрогих операторов

Многоугольники и прямоугольники

Многоугольники и прямоугольники
Многоугольники
Многоугольники - 2

Прямоугольники
Прямоугольники - 2
Основные соглашения и терминология
Наследование инварианта
Наследование и конструкторы
Пример иерархии
Полиморфизм
Полиморфное присоединение
Что на самом деле происходит при полиморфном присоединении?
Полиморфные структуры данных

Типизация при наследовании
Согласованность типов
Пределы полиморфизма
Экземпляры
Статический тип, динамический тип
Обоснованы ли ограничения?
Может ли быть польза от неведения?
Когда хочется задать тип принудительно
Полиморфное создание
Динамическое связывание

Использование правильного варианта
Использование правильного варианта - 2
Переопределение и утверждения
О реализации динамического связывания
Отложенные компоненты и классы
Движения произвольных фигур
Отложенный компонент
Эффективизация компонента
Отложенные классы
Соглашения о графических обозначениях

Что делать с отложенными классами?
Задание семантики отложенных компонентов и классов
Задание семантики отложенных компонентов и классов - 2
Способы изменения объявлений
Повторное объявление функции как атрибута
Повторное объявление функции как атрибута - 2
Обратного пути нет
Использование исходной версии при переопределении
Смысл наследования
Двойственная перспектива

Взгляд на класс как на модуль
Взгляд на класс как на модуль - 2
Взгляд на класс как на модуль - 3
Взгляд на класс как на тип
Взгляд на класс как на тип - 2
Наследование и децентрализация
Независимость от представления
Парадокс расширения-специализации
Роль отложенных классов
Назад к абстрактным типам данных

Назад к абстрактным типам данных - 2
Отложенные классы как частичные интерпретации: классы поведения
Отложенные классы как частичные интерпретации: классы поведения - 2
Не вызывайте нас, мы вызовем вас
Не вызывайте нас, мы вызовем вас - 2
Программы с дырами
Роль отложенных классов при анализе и глобальном проектировании
Обсуждение
Явное переопределение
Доступ к предшественнику процедуры

Динамическое связывание и эффективность
Динамическое связывание и эффективность - 2
Динамическое связывание и эффективность - 3
Оценка накладных расходов
Статическое связывание как оптимизация
Статическое связывание как оптимизация - 2
Статическое связывание как оптимизация - 3
Кнопка под другим именем: когда статическое связывание ошибочно
Кнопка под другим именем: когда статическое связывание ошибочно - 2
Подход языка С++ к связыванию

Подход языка С++ к связыванию - 2
Подход языка С++ к связыванию - 3
Подход языка С++ к связыванию - 4
Ключевые концепции
Библиографические замечания
У14.1 Многоугольники и прямоугольники
У14.2 Многоугольник с малым числом вершин
У14.3 Геометрические объекты с двумя координатами
У14.4 Наследование без классов
У14.5 Классы без объектов

У14.6 Отложенные классы и прототип
У14.7 Библиотека поиска в таблицах (семестровый проект)
У14.9 Комплексные числа

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

Примеры множественного наследования
Пример, неподходящий для введения
Может ли самолет быть имуществом?
Числовые и сравнимые значения
Окна - это деревья и прямоугольники
Деревья - это списки и их элементы
Составные фигуры

Составные фигуры - 2
Брак по расчету
Брак по расчету - 2
Структурное наследование
Наследование функциональных возможностей
Лунка и кнопка
Оценка
Переименование компонентов
Конфликт имен
Конфликт имен - 2

Результат переименования
Смена имен и переопределение
Подбор локальных имен
Играем в имена
Использование родительской процедуры создания
Плоские структуры
Плоская форма класса
Применение плоской формы
Краткая плоская форма
Дублируемое наследование

Общие предки
По обе стороны океана
Совместное использование и репликация
Совместное использование и репликация - 2
Совместное использование и репликация - 3
Ненавязчивое дублирующее наследование
Правило переименования
Конфликт переопределений
Конфликт при совместном использовании: отмена определения и соединение компонентов
Конфликт при совместном использовании: отмена определения и соединение компонентов - 2

Конфликты при репликации: выделение
Выделение всех компонентов
Сохранение исходной версии при переопределении
Сохранение исходной версии при переопределении - 2
Пример повышенной сложности
Пример повышенной сложности - 2
Пример повышенной сложности - 3
Дублируемое наследование и универсальность
Правила об именах
Обсуждение

Переименование
ОО-разработка и перегрузка
ОО-разработка и перегрузка - 2
ОО-разработка и перегрузка - 3
Ключевые концепции
Библиографические замечания
У15.1 Окна как деревья
У15.2 Является ли окно строкой?
У15.3 Завершение строительства
У15.4 Итераторы фигур

У15.5 Связанные стеки
У15.6 Кольцевые списки и цепи
У15.7 Деревья
У15.8 Каскадные или "шагающие" (walking) меню
У15.9 Плоский precursor (предшественник)
У15.10 Дублируемое наследование и репликация

Наследование и утверждения

Наследование и утверждения
Инварианты
Предусловия и постусловия при наличии динамического связывания
Предусловия и постусловия при наличии динамического связывания - 2

Как обмануть клиентов
Как быть честным
Пример
Пример - 2
Устранение посредника
Субподряды
Абстрактные предусловия
Абстрактные предусловия - 2
Правило языка
Правило языка - 2

Повторное объявление функции как атрибута
Замечание математического характера
Глобальная структура наследования
Универсальные классы
Нижняя часть иерархии
Универсальные компоненты
Замороженные компоненты
Запрет повторного объявления
Фиксированная семантика компонентов copy, clone и equality
Фиксированная семантика компонентов copy, clone и equality - 2

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

Когда правила типов становятся несносными - 2
Проблема
Механизм решения
Правильное использование попытки присваивания
Типизация и повторное объявление
Устройства и принтеры
Одно- и двусвязные элементы
Правило повторного объявления типов
Закрепленные объявления
Несогласованность типов

Примеры из практики
Серьезное затруднение
Понятие опорного элемента
Опорный элемент Current
Еще раз о базовых классах
Правила о закрепленных типах
Когда не используются закрепленные объявления
Статический механизм
Наследование и скрытие информации
Кое-что о политике

Применение
Зачем нужна такая гибкость?
Интерфейс и повторное использование реализаций
Слово в защиту реализаций
Два стиля
Выборочный экспорт
Ключевые концепции
Библиографические замечания
У16.1 Наследование: простота и эффективность
У16.2 Векторы

У16.3 Экстракт?

Проблема типизации

Проблема типизации
Базисная конструкция
Статическая и динамическая типизация
Правила типизации
Реализм
Пессимизм
Статическая типизация: как и почему
Преимущества
Преимущества - 2

Аргументы в пользу динамической типизации
Типизация: слагаемые успеха
Типизация: слагаемые успеха - 2
"Типизирована ли кроха"?
Типизация и связывание
Типизация и связывание - 2
Ковариантность и скрытие потомком
Ковариантность
Ковариантность - 2
Ковариантность - 3

Параллельные иерархии
Своенравие полиморфизма
Скрытие потомком
Корректность систем и классов
Практический аспект
Корректность систем: первое приближение
Контравариантность и безвариантность
Использование родовых параметров
Типовые переменные
Полагаясь на закрепление типов

Полагаясь на закрепление типов - 2
Полагаясь на закрепление типов - 3
Полагаясь на закрепление типов - 4
Глобальный анализ
Глобальный анализ - 2
Глобальный анализ - 3
Остерегайтесь полиморфных кэтколлов!
Назад, в Ялту
Одно правило и несколько определений
Одно правило и несколько определений - 2

Оценка
Полное соответствие
Ключевые концепции
Библиографические замечания

Константы базовых типов

Константы базовых типов
Атрибуты-константы
Использование констант
Константы пользовательских классов
Константы с манифестом для этого непригодны
Однократные функции

Применение однократных подпрограмм
Разделяемые объекты
Однократные функции с результатами базовых типов
Однократные процедуры
Параметры
Однократные функции, закрепление и универсальность
Однократные функции, закрепление и универсальность - 2
Константы строковых типов
Unique-значения
Unique-значения - 2

Обсуждение
Инициализация: подходы языков программирования
Инициализация: подходы языков программирования - 2
Строковые константы
Unique-значения и перечислимые типы
Unique-значения и перечислимые типы - 2
Ключевые концепции
Библиографические замечания
У18.1 Эмуляция перечислимых типов однократными функциями
У18.2 Однократные функции для эмуляции unique-значений

У18.3 Однократные функции в родовых классах
У18.4 Однократные атрибуты?

Содержание