Предметно-ориентированное проектирование (DDD). Структуризация сложных программных систем (Эрик Эванс)
Классическая книга Э. Эванса освещает наиболее общий, стратегический круг вопросов, связанных с объектно-ориентированной разработкой программного обеспечения. Это переработка и структуризация знаний о предметных областях, применение типовых архитектурных шаблонов, построение и анализ моделей предметных областей, проектирование программных объектов с точки зрения качества их взаимодействия и передачи логической структуры знаний, организация программ на основе крупномасштабных структур, выработка общего языка и стратегии коммуникации в группе. Подход автора строится на динамичном рефакторинге модели и постоянной дистилляции знаний. Это позволяет достигнуть высокой степени гармонии между логикой предметной области и кодом программы, а также достаточной гибкости программной архитектуры для целей удобной доработки и интеграции программного обеспечения. Книга насыщена практическими примерами из реальных проектов.
Мировое сообщество программистов признает, что моделирование предметных областей — ключевой раздел проектирования программного обеспечения. В моделях предметных областей разработчики выражают сложные функции своих программ, реализуя их затем в таком виде, который отвечает реальным потребностям пользователей. Но несмотря на очевидную важность предмета, существует очень мало пособий по эффективному внедрению моделирования предметных областей в практику разработки программ.
Книга Эрика Эванса заполняет этот пробел. Она посвящена не отдельным технологиям, а систематическому предметно-ориентированному подходу. В ней представлен широкий набор приемов и методик, основанных на практическом опыте, и фундаментальных принципов, помогающих в реализации программных проектов из сложных предметных областей. Органично переплетая практику проектирования и реализации программ, эта книга содержит множество фактических примеров, иллюстрирующих применение общих стратегических принципов в реальных программных проектах.
Из книги читатель узнает, как с помощью модели предметной области придать разработке сложной системы нужную направленность и динамику. Выделены основные приемы и образцы-шаблоны, образующие общий язык группы разработчиков. Особо подчеркивается необходимость рефакторинга не только кода, но и модели в его основе, что в сочетании с итерационной agile-методикой приводит к углублению знаний о предметной области и повышению качества взаимодействия между специалистами и программистами. Подход книги строится именно на этом фундаменте, предлагая модели и архитектуры для систем и организаций любой сложности.
Модель предметной области в работе
Роль и выбор модели
Алгоритмическая часть программы
Переработка знаний
Составляющие эффективного моделирования
Переработка знаний
Непрерывное обучение
Информоемкая архитектура
Извлечение скрытого понятия
Углубленные модели
Коммуникация и язык
Единый язык
Моделирование вслух
Одна команда — один язык
Документация, диаграммы, схемы
Письменная проектная документация
Выполняемый код решает все
Пояснительные модели
Связь между моделью и реализацией
Проектирование по модели
Парадигмы моделирования и средства программирования
Анатомия модели: зачем модель нужна пользователю
Моделировщики-практики
Структурные элементы предметно-ориентированного проектирования
Изоляция предметной области
Многоуровневая архитектура
Связь между уровнями
Архитектурные среды
Уровень предметной области - вместилище модели
Антишаблон интеллектуального интерфейса пользователя
Другие виды изоляции
Модель, выраженная в программе
Ассоциации
Сущности (указуемые объекты)
Моделирование сущностей
Проектирование операций идентификации
Объекты-значения
Проектирование объектов-значений
Проектирование ассоциаций с помощью ОБЪЕКТОВ-ЗНАЧЕНИЙ
Службы
Службы и изоляция уровня предметной области
Степень модульности
Доступ к службам
Модули (пакеты)
Гибкая модульность
Ловушки инфраструктуры
Парадигмы моделирования
Причины доминирования объектной парадигмы
He-объекты в объектном мире
Проектирование по модели в условиях смешения парадигм
Цикл существования объектов модели
Агрегаты
Фабрики
Выбор фабрик и их местонахождения
Когда достаточно конструктора
Проектирование интерфейса
Где реализовать логику инвариантов?
Отличия между фабриками сущностей и фабриками объектов-значений
Восстановление хранимых объектов
Хранилища
Запросы к хранилищам
Клиентам безразлична реализация хранилищ, а разработчикам - - нет
Реализация хранилища
Работа в рамках архитектурной среды
Связь с фабриками
Проектирование объектов для реляционной базы данных
Работа с языком: расширенный пример
Введение в систему управления доставкой
Изоляция предметной области: добавление прикладных операций
Отделение сущностей от значений
Роль и другие атрибуты
Проектирование ассоциаций в модели
Границы агрегатов
Выбор хранилищ
Проход по сценариям
Пример рабочей функции: изменение места назначения груза
Пример рабочей функции: повторение заказов
Создание объектов
Фабрики и конструкторы для объекта Груз
Добавление объекта Манипуляция
Перерыв на рефакторинг: альтернативный агрегат Груз
Модули в модели грузопоставок
Новая функция: распределение заказов ,
Связь между двумя системами
Усовершенствование модели: введение подразделений
Оптимизация быстродействия
Итоги
Углубляющий рефакторинг
Уровни рефакторинга
Углубленные модели
Углубленная модель и гибкая архитектура
Процесс познания
Качественный скачок
История успеха
Модель неплоха, но.
Скачок
Углубленная модель
Трезвое решение
Воздаяние
Потенциал
Концентрация на основах
Каскад озарений
Перевод неявных понятий в явные
Извлечение понятий
Внимание к языку
Выявление узких мест
Размышление над противоречиями
Чтение книг
Метод проб и ошибок
Моделирование неочевидных понятий
Явные условия-ограничения
Процессы как объекты предметной области
Спецификация
Применение и реализация спецификаций
Гибкая архитектура
Информативные интерфейсы
Функции без побочных эффектов
Утверждения
Концептуальные контуры
Изолированные классы
Замкнутость операций
Декларативная архитектура
Декларативный стиль архитектуры
Углы атаки
Выделение подобластей
Использование сложившихся формальных систем
Применение аналитических шаблонов
Аналитические шаблоны как источник знания
Шаблоны и модель
Стратегия
Композит
Почему не мелкий объект (flyweight)?
Углубляющий рефакторинг
Инициирование
Исследовательские группы
Предыдущие наработки
Архитектура для разработчиков
Расчет времени
Кризис как потенциальная возможность
Стратегическое проектирование
Поддержание целостности модели
Ограниченный контекст
Распознавание дефектов внутри ограниченного контекста
Непрерывная интеграция
Карта контекстов
Тестирование в границах контекста
Организация и документирование карт контекстов
Взаимосвязи между ограниченными контекстами
Общее ядро
Группы заказчик-поставщик
Конформист
Предохранительный уровень
Проектирование интерфейса предохранительного уровня
Реализация предохранительного уровня
Поучительная история
Отдельное существование
Службы с открытым протоколом
Общедоступный язык
Унификация слона
Выбор стратегии построения контекстов
Уровень принятия решений: разработчики или выше
Помещение самих себя в контекст
Преобразование границ
Принятие того, что нельзя изменить: контуры внешних систем
Взаимоотношения с внешними системами
Проектируемая система
Учет особых случаев отдельными моделями
Установка системы
Компромиссы
Если проект уже в работе
Преобразования
Слияние контекстов: от отдельного существования к общему ядру
Слияние контекстов: от общего ядра к непрерывной интеграции
Вытеснение устаревшей системы
От открытого протокола к общедоступному языку
Дистилляция
Смысловое ядро
Выбор ядра
Как распределить работу
Эскалация дистилляции
Неспециализированные подобласти
Неспециализированный не значит хорошо переносимый
Управление рисками в проекте
Введение в предметную область
Схематическое ядро
Дистилляционный документ
Разметка ядра
Дистилляционный документ как методическое средство
Связные механизмы
Сравнение связных механизмов и неспециализированных подобластей
Когда механизм входит в смысловое ядро
Дистилляция к декларативному стилю
Выделенное ядро
Цена создания выделенного ядра
Эволюция коллективных решений
Абстрактное ядро
Дистилляция в углубленных моделях
Выбор целей рефакторинга
Крупномасштабная структура
Эволюционная организация
Метафорический образ системы
Наивный образ: почему он нам не нужен
Уровни разделения обязанностей
Выбор подходящих уровней
Уровень знаний
Среда подключаемых компонентов
Насколько жесткой должна быть структура
Структурирующий рефакторинг
Минимализм
Коммуникативность и самодисциплина
Реструктуризация дает гибкую архитектуру
Дистилляция
Объединение стратегических подходов
Сочетание крупномасштабных структур и ограниченных контекстов
Сочетание крупномасштабной структуры и дистилляции
Первоначальная оценка
Кому планировать стратегию
Самозарождение структуры в ходе разработки
Смежная группа по разработке архитектуры
Шесть принципов принятия решений при стратегическом проектировании
То же верно и для технических сред проектирования
Долой генеральный план
Заключение
Взгляд в будущее
Приложение. Использование шаблонов в этой книге
Глоссарий