Skip to content

Instantly share code, notes, and snippets.

@Morozzzko
Created February 10, 2021 07:27
Show Gist options
  • Select an option

  • Save Morozzzko/d2e9ef34a4050138ecb73212afc1ae3d to your computer and use it in GitHub Desktop.

Select an option

Save Morozzzko/d2e9ef34a4050138ecb73212afc1ae3d to your computer and use it in GitHub Desktop.
Domain modelling made functional review

Domain Modelling Made Functional

Date: 2020-02-10 Author: @morozzzko

Дочитал книгу Domain Modelling Made Functonal от Скотта Влашина. Потратил на это почти год — читал неспешно и с большими перерывами. Эта заметка — конспект, в котором я описываю не только мысли из самой книги, но и своё отношение к ним.

Для кого эта книга

В DMMF много примеров с кодом, но я не могу сказать, что она для программистов. Если человек умеет читать и писать код даже на уровне скриптов, есть все шансы понять и оценить тему. Но я бы не рекомендовал — для того, чтобы осознать ценность написанного всё же лучше иметь бэкграунд в написании софта.

Я выделяю две группы людей, которые получат максимум от этой книги.

Практикам DDD, которые хотят посмотреть на один из подходов к проектированию в функциональных языках. Для них покажут способы обеспечить соблюдение инвариантов, описать конечные автоматы, организовать бизнес-логику и переходы на границах системы.

Начинающим в DDD. Им простым языком расскажут про основные концепции: bounded context, value object, entity, aggregate, domain, domain event, domain expert, ubiquitious language. Покажут, как моделировать предметную область: превращать требования в данные и процессы. В конце книги покажут, как работать с границами системы и выходить за пределы «идеального» мира.

Что понравилось

Книга постепенно вводит в контекст. Не бросает читателя в сложный жаргон, а постепенно наращивает сложность и рассказывает о ценности DDD и вводит новые понятия

Повествование фокусирует на важном. В этой книге предлагается конкретный подход к проектированию, но его нужно сначала понять. Программисты могут захотеть проектировать через таблицы, либо через классы. Чтобы этого не было, автор заостряет на этом внимание и подсказывает, как направить мышление в нужное русло.

Рекомендации по использованию доменных событий. Например, рекомендует не использовать их внутри одного контекста — потому что это создаёт неявную зависимость. Вместо этого предлагается добавить ещё одну функцию в цепочку.

Понятие Railway-Oriented Programming. Тот самый подход к проектированию пошёл именно отсюда — Скотт Влашин популяризовал этот термин и дал ему имя.

Идеи из фунционального программирования. Если программист никогда не писал на Rust, OCaml, F#, Haskell или Scala (там это уже есть), то будут новые концепции:

  • Типы-суммы. Также известны как variant type, choice type, or-type, sum type. Мне очень понравилось, как их вводят
  • Тип Result — его используют, чтобы выразить успешность или неуспешность вычислений. А ещё он монадичен
  • Тип Async для асинхронных вычислений. Как и Result, он монадичен
  • Railway oriented programming для организации пайплайнов, которые могут быть успешными или нет. Скотт — основной популяризатор этого подхода.
  • Как пользоваться Result + Async и не страдать

Рассказывает, как использовать типы. Это одна из причин, почему я вообще захотел её прочитать. Мне близко проектирование через типы, и в этой книге этого много. По сути, его цель — сделать так, чтобы типы документировали предметную область и гарантировали соблюдение инвариантов.

Примеры, как быть. Иногда DDD критикуют за то, что это абстрактная идея, и непонятно, как к ней подойти. Скотт в конце книги рассказывает:

  • Как организовать границы контекста: как валидировать, как парсить
  • Как работать с базой данных: читать и писать. Больше акцента на «писать» — с этим вопросов больше
  • Как быть, когда процессы усложняются и разрастаются. Рассказывает о конкретных усложнениях и предлагает варианты

Легко читается. Можно даже пропускать участки кода и будет нормально.

Автор ссылается на более широкие темы. Например, на ивент-сорсинг, CQRS и похожие архитектуры. Упоминает, что вместе с его идеями отлично сочетаются и другие. Например:

Что не понравилось

Слишком много типов. Одна из идей — уйти от строкотипизированных структур. В итоге почти все строковые типы получают специализированные обёртки — PhoneNumber, Email, Name. Это хорошо ложится в систему ценностей, но мне так писать не понравилось

Да и в общем-то всё. Можно придираться, что чего-то не хватило, но это уже за скоупом книги

Резюме

8/10 для своего уровня, берите

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment