Domain Modeling Made Functional
Отличная книга и по основной теме и по DDD. Легкое и последовательное изложение с отличным балансом повторения и краткости. Важный нюанс - все примеры кода на F#, и в рассматриваемых решениях много его специфики. На Haskell и Scala думаю решения вполне можно повторить, хотя это будет неканоничный для этих языков стиль. Для других языков надо творчески переосмысливать. Вся книга прошита одним сквозным примером - системой биллинга для магазина. Пример плавно развивает её от абстрактной модели до фрагментов кода, готового компонента с минимальным набором зависимостей.
Первая пара глава книги вводит в DDD, в частности в организационные аспекты и терминологию. Мне она показалась очень удачной и даже существенно лучшей многих других введений в DDD. Отдельная глава выделена на концепцию контекстов. Тому как их организовывать в функциональных языках и как логически устраивать коммуникацию между ними.
Вторая часть посвящёна непосредственно моделированию в функциональных языках. Начинает естественно с использования типов структур и сигнатур функций. Дальше в двух главах рассматриваются методы отображения домена и выражения ограничений в типах, представление инвариантов и бизнес-правил. Выражение ошибок в сигнатурах и стратегии их обработки также обсуждаются, но почему то уже в середине следующей части. Заканчивается эта часть идеей пайплайна, тут в основном рассматриваются подходы к согласованию сигнатур и глава сильно F# специфична.
Третья часть уже непосредственно про реализацию. Включает главы про функции высшего прядка и их использование как интерфейсов разных процессов и подпроцессов, а так же как аналог dependency injection. Главы про сериализацию и персистентность. Заканчивается эта часть объёмными примерами адаптации дизайна под новые требования, где рассматривается вся цепочка внесения изменений от формулировки запроса потребителем до обновления кода.
Мне в книге понравились:
- Итеративный подход к разработке моделей и кода.
- Довольно реалистичный пример.
- Доведение примера до стадии кода условно готового к интеграции компонента.
Правда эти особенности порождают и явные недостатки. Из за итеративности надо вспоминать что было несколько десятков страниц назад, и листать книгу туда сюда для сравнения разных версий. Реалистичный пример пример значит много кода и фичей, без хорошей памяти о которых трудно понять о чём толкует автор. Большое количество завершённого кода подразумевает много возни с особенностями F#, в которые тоже приходится вникать. Не смотря на это, книга в общем очень полезна и в меру сложна в восприятии, рекомендую.