こんにちは、 @kz_morita です。
今回は、 『関数型ドメインモデリング ドメイン駆動設計とF# でソフトウェアの複雑さに立ち向かおう』 という本を読んだので感想を書きます。
書籍について
『関数型ドメインモデリング ドメイン駆動設計とF# でソフトウェアの複雑さに立ち向かおう』 という本で、アスキードワンゴから出版されています。
2024 年 6 月 28 日に出版されているので割と新しめな本です。
以下のような目次の内容になっています。
推薦のことば
日本語版へ寄せて
訳者まえがき
はじめに
第1部 ドメインの理解
第1章 ドメイン駆動設計の紹介
第2章 ドメインの理解
第3章 関数型アーキテクチャ
第2部 ドメインのモデリング
第4章 型の理解
第5章 型によるドメインモデリング
第6章 ドメインの完全性と整合性
第7章 パイプラインによるワークフローのモデリング
第3部 モデルの実装
第8章 関数の理解
第9章 実装:パイプラインの合成
第10章 実装:エラーの扱い
第11章 シリアライズ
第12章 永続化
第13章 設計を進化させ、きれいに保つ
著者紹介
訳者紹介
感想など
X (旧 Twitter) でこの書籍が発売されたことをしり、関数型でドメインモデリングするという非常に興味深い内容だったので購入して読んでみました。
大きく分けて 3 部構成になっています。
1 部では、ドメインを理解することについて書かれていて、DDD でいうところの戦略的設計について書かれています。 2 部では、モデリングについてで型を使ってモデリングしていく方法について書かれています。 3 部では、実際に関数型でどのように実装するかという点を F# を使ってかなり具体的に書かれています。
それぞれで感想を書いていきます。
第 1 部 ドメインの理解
第 1 部では、ドメイン駆動設計についての紹介から始まり、実際にドメインを探索していく方法について書かれていました。
イベントストーミングというアクティビティを使って、ビジネスのワークフローをモデル化していく説明がかなりわかりやすくて、個人的にあまり理解できてなかった戦略的設計の具体的な進め方がかなり参考になりました。
イベントストーミングについては、以下のページが参考になりました。
- https://zenn.dev/yamachan0625/books/ddd-hands-on/viewer/chapter5_event_storming
- https://www.figma.com/file/g04nAogGCGgM62IKXHUSLT?type=whiteboard%27&node-id=10:1551
ビジネスイベントに特に着目していくやりかたなので、ビジネスワークフローをパイプラインのように扱うことができるため、そういった意味でも関数型の考え方にマッチしたやり方だなと思いました。
書籍の中では、イベントに着目しデータ変換のパイプラインを組み合わせることでシステムを作っていく方法がメインとなっていました。
第 2 部 ドメインのモデリング
第 2 部では、型によりドメインモデリングしていく様子が順を追って説明されていました。
ビジネスのロジックを型の変換のフローとしてみなしてパイプラインを設計していくやり方です。
書籍の中でたとえば、注文をバリデーションするロジックがあったときに UnvalidatedOrder
という型で未検証なことを示し、検証ロジックにより ValidatedOrder
が生成されるといった内容が書かれています。
具体的に、以下のようなテキストでモデルを記述しています。
ValidatedOrder
input: UnvalidatedOrder
output: ValidatedOrder OR ValidationError
dependencies: CheckProductCodeExists, CheckAddressExists
このあたりの、input, output, dependencies を明確にしてモデリングしていくの見覚えあるなと思ったら、まさに Scala の ZIO ライブラリで行われていることそのもので、なるほどと思いました。
一連のロジックを上記のような型の変換ととらえ、全体をステートマシンのように扱うのは非常にシンプルで協力な考え方だと思いました。
また、Result 型や、Async 型といった型の概念を導入することで、エフェクトを表現するというはなしも関数型っぽく非常に参考になりました。
第 3 部 モデルの実装
第 3 部では、実際にモデリングした内容を実装する際のプラクティスが書かれていました。
実装するときに考慮する、エラー、シリアライズ、永続化といった事項について詳細なプラクティスが書かれているのが良かったです。
全体をパイプラインで表現するときに、パイプラインの中に Result などを返すモナディック関数が合ったときに後続の関数であつかえないため、どのようにパイプラインを合成するか?という点について触れられていて、ここで FlatMap や map、pure などの概念に触れられていて、とてもわかりやすかったです。 全体的に少しずつシステムを進化させていくような書き方なので、FlatMap、map などがなぜ必要なのかという話が自然なながれで出てきていて、このかかれ方ならば関数型馴染みのない人ですっきり理解できるんじゃないかと思います。
また永続化など外部 I/O が発生する部分をパイプラインの端においやって純粋なロジックをテスタブルにする考え方も非常にわかりやすかったです。
さいごに
実際に読んでみて、関数型でドメインモデリングする方法についてかなりイメージが湧きました。 本を読む前から、WebAPI でも、スマートフォンアプリケーションでも、結局はデータやユーザーからの入力などをどうやって変換していくかというように抽象化できるなとぼんやり思っていたのですが、この本でそれがかなり明確に実践されていて非常にわかりやすかったです。
DDD 読んでみてじゃあ実際にどうやってコードを書いていこうかといった状況でこの本に出会うと非常に学びが多いと思います。 とても読んでいて楽しいし、学びも多い良い本でした。