Предисловие
Об авторах
Введение
Часть I. Гибкая разработка
Глава 1. Гибкие методики
Организация Agile Alliance
Люди и их взаимоотношения важнее процессов и инструментов
Работающая программа важнее исчерпывающей документации
Плодотворное сотрудничество с заказчиком важнее формальных договоренностей по контракту
Оперативное реагирование на изменения важнее следования плану
Принципы
Заключение
Библиография
Глава 2. Обзор экстремального программирования
Методики экстремального программирования
Единая команда
Пользовательские истории
Короткие циклы
Приемочные тесты
Парное программирование
Разработка через тестирование
Коллективное владение
Непрерывная интеграция
Умеренный темп
Открытое рабочее пространство
Игра в планирование
Простота
Рефакторинг
Метафора
Заключение
Библиография
Глава 3. Планирование
Первичное обследование
Объединение, разбиение и скорость
Планирование выпуска
Планирование итерации
Определения понятия "готово"
Планирование задач
Подведение итогов итераций
Мониторинг
Заключение
Библиография
Глава 4. Тестирование
Разработка через тестирование
Пример проектирования начиная с тестов
Изоляция тестов
Разделение в придачу
Приемочные тесты
Архитектура в придачу
Заключение
Библиография
Глава 5. Рефакторинг
Простой пример рефакторинга: генерация простых чисел
Автономное тестирование
Рефакторинг
Последнее прочтение
Заключение
Библиография
Глава 6. Эпизод программирования
Игра в боулинг
Заключение
Часть II. Гибкое проектирование
Глава 7. Что такое гибкое проектирование
Ароматы дизайна
Ароматы дизайна - запахи гниющей программы
Жесткость
Хрупкость
Косность
Вязкость
Ненужная сложность
Ненужные повторения
Непрозрачность
Почему программы загнивают
Программа Copy
Знакомый сценарий
Гибкий дизайн программы Copy
Заключение
Библиография
Глава 8. Принцип единственной обязанности (SRP)
Определение обязанности
Разделение связанных обязанностей
Обеспечение сохранности
Заключение
Библиография
Глава 9. Принцип открытости/закрытости (OCP)
Описание принципа OCP
Приложение Shape
Нарушение OCP
Решение, удовлетворяющее принципу OCP
Предвидение и "естественная" структура
Расстановка "точек подключения"
Применение абстракции для явного закрытия
Закрытие за счет применения таблицы данных
Заключение
Библиография
Глава 10. Принцип подстановки Лисков (LSP)
Нарушения принципа LSP
Простой пример
Более тонкое нарушение
Реальный пример
Факторизация вместо наследования
Эвристика и соглашения
Заключение
Библиография
Глава 11. Принцип инверсии зависимости (DIP)
Разбиение на слои
Инверсия владения
Зависимость от абстракций
Простой пример принципа DIP
Отыскание глубинных абстракций
Задача об управлении печью
Заключение
Библиография
Глава 12. Принцип разделения интерфейсов (ISP)
Загрязнение интерфейса
Разделение клиентов означает разделение интерфейсов
Интерфейсы классов и интерфейсы объектов
Разделение путем делегирования
Разделение путем множественного наследования
Пользовательский интерфейс банкомата
Заключение
Библиография
Глава 13. Обзор UML для программистов
Диаграммы классов
Диаграммы объектов
Диаграммы последовательности
Диаграммы кооперации
Диаграммы состояний
Заключение
Библиография
Глава 14. Работа с диаграммами
Зачем нужно моделировать
Зачем строить модели программ
Нужно ли проектировать систему до конца, прежде чем приступать к кодированию
Эффективное использование UML
Общение с другими людьми
Карты
Финальная документация
Что сохранить, а что выбросить
Итеративное уточнение
Сначала поведение
Проверяем структуру
Набрасываем код
Эволюция диаграмм
Когда и как рисовать диаграммы
Когда рисовать диаграммы и когда остановиться
CASE-средства
Ну а как насчет документации?
Заключение
Глава 15. Диаграммы состояний
Основные понятия
Специальные события
Суперсостояния
Начальное и конечное псевдосостояния
Использование диаграмм состояний
Заключение
Глава 16. Диаграммы объектов
Мгновенный снимок
Активные объекты
Заключение
Глава 17. Прецеденты
Записывание прецедентов
Альтернативные потоки событий
Что-нибудь еще?
Представление прецедентов на диаграммах
Заключение
Библиография
Глава 18. Диаграммы последовательности
Основные понятия
Объекты, линии жизни, сообщения и прочее
Создание и уничтожение
Простые циклы
Различные сценарии
Более сложные конструкции
Циклы и условия
Сообщения, занимающие время
Асинхронные сообщения
Несколько потоков
Активные объекты
Отправка сообщений интерфейсам
Заключение
Глава 19. Диаграммы классов
Основные понятия
Классы
Ассоциация
Наследование
Пример диаграммы классов
Детали
Стереотипы классов
Абстрактные классы
Свойства
Агрегирование
Композиция
Кратность
Стереотипы ассоциаций
Вложенные классы
Классы ассоциаций
Квалификаторы ассоциаций
Заключение
Библиография
Глава 20. Эвристика и кофе
Кофеварка Mark IV Special
Спецификация
Типичное, но никуда не годное решение
Иллюзорная абстракция
Улучшенное решение
Реализация абстрактной модели
Достоинства описанного дизайна
Объектноориентированный перебор
Библиография
Часть III. Задача о расчете заработной платы
Краткая спецификация системы расчета заработной платы
Упражнение
Прецедент 1: добавление нового работника
Прецедент 2: удаление работника
Прецедент 3: регистрация карточки табельного учета
Прецедент 4: регистрация справки о продажах
Прецедент 5: регистрация платежного требования от профсоюза
Прецедент 6: изменение сведений о работнике
Прецедент 7: расчет заработной платы на сегодня
Глава 21. Команда и Активный объект: многогранность и многозадачность
Простые команды
Транзакции
Разрыв физических и темпоральных связей
Разрыв темпоральных связей
Метод Undo
Активный объект
Заключение
Библиография
Глава 22. Шаблонный метод и Стратегия: наследование или делегирование
Шаблонный метод
Злоупотребление паттерном
Пузырьковая сортировка
Стратегия
Заключение
Библиография
Глава 23. Фасад и Посредник
Фасад
Посредник
Заключение
Библиография
Глава 24. Одиночка и Моносостояние
Одиночка
Достоинства
Недостатки
Одиночка в действии
Моносостояние
Достоинства
Недостатки
Моносостояние в действии
Заключение
Библиография
Глава 25. Null-объект
Описание
Заключение
Библиография
Глава 26. Система расчета заработной платы: первая итерация
Краткая спецификация
Анализ по прецедентам
Добавление работников
Удаление работников
Регистрация карточки табельного учета
Регистрация справки о продажах
Регистрация платежного требования от профсоюза
Изменение сведений о работнике
Расчетный день
Осмысление: поиск основополагающих абстракций
Тарификация работника
График выплат
Способы платежа
Принадлежность к другим организациям
Заключение
Библиография
Глава 27. Система расчета заработной платы: реализация
Операции
Добавление работников
Удаление работников
Карточки табельного учета, справки о продажах и плата за услуги
Изменение сведений о работнике
Что я курил?
Начисление зарплаты
Начисление зарплаты работникам с твердым окладом
Начисление зарплаты работникам с почасовой оплатой
Головная программа
База данных
Заключение
Об этой главе
Библиография
Часть IV. Пакетирование системы расчета заработной платы
Глава 28. Принципы проектирования пакетов и компонентов
Пакеты и компоненты
Принципы сцепленности компонентов: детальность
Принцип эквивалентности повторного использования и выпуска (Reuse/Release Equivalence Principle - REP)
Принцип общей закрытости (Common Closure Principle - CCP)
Резюме
Принципы связанности компонентов: устойчивость
Принцип ацикличности зависимостей (Acyclic Dependencies Principle - ADP)
Принцип устойчивых зависимостей (Stable-Dependencies Principle - SDP)
Принцип устойчивых абстракций (Stable-Abstractions Principle - SAP)
Заключение
Глава 29. Фабрика
Проблема зависимости
Статическая и динамическая типизация
Взаимозаменяемые фабрики
Использование фабрик в тестовых фикстурах
Важность фабрик
Заключение
Библиография
Глава 30. Система расчета заработной платы: анализ пакетов
Структура компонентов и обозначения
Применение принципа общей закрытости (CCP)
Применение принципа эквивалентности повторного использования и выпуска (REP)
Связанность и инкапсуляция
Метрики
Применение метрик к задаче о расчете зарплаты
Фабрики объектов
Еще раз о границах сцепленности
Окончательная структура пакетов
Заключение
Библиография
Глава 31. Компоновщик
Составные команды
Кратный или не кратный
Заключение
Глава 32. Наблюдатель: превращение в паттерн
Цифровые часы
Паттерн Наблюдатель
Модели
Связь с принципами ООП
Заключение
Библиография
Глава 33. Абстрактный сервер, адаптер и мост
Абстрактный сервер
Адаптер
Адаптер класса
Задача о модеме, адаптеры и принцип LSP
Мост
Заключение
Библиография
Глава 34. Заместитель и Шлюз: управление сторонними API
Заместитель
Реализация Заместителя
Резюме
Базы данных, ПО промежуточного уровня и прочие сторонние интерфейсы
Шлюз к табличным данным
Тестирование и шлюз к табличным данным в памяти
Тестирование шлюзов к базе данных
Другие паттерны работы с базами данных
Заключение
Блиблиография
Глава 35. Посетитель
Посетитель
Ациклический посетитель
Применения паттерна Посетитель
Декоратор
Объект расширения
Заключение
Библиография
Глава 36. Состояние
Вложенные предложения switch/case
Поле State с внутренним доступом
Тестирование действий
Достоинства и недостатки
Таблицы переходов
Интерпретация таблицы
Достоинства и недостатки
Паттерн Состояние
Паттерны Состояние и Стратегия
Достоинства и недостатки
Компилятор конечных автоматов (SMC)
Файл Turnstile.cs, сгенерированный SMC, и другие вспомогательные файлы
Виды приложений конечных автоматов
Высокоуровневые политики приложения и ГИП
Контроллеры взаимодействия с ГИП
Распределенная обработка
Заключение
Библиография
Глава 37. Система расчета заработной платы: база данных
Построение базы данных
Изъян в дизайне программы
Добавление работника
Транзакции
Выборка работника
Что осталось?
Глава 38. Система расчета заработной платы: МодельВид-Презентатор
Интерфейс
Реализация
Конструирование окна
Окно Payroll
Снимаем покрывало
Заключение
Библиография
Приложение A. Сказ о двух компаниях
Приложение B. Что такое проектирование программного обеспечения
Алфавитный указатель