FLINTERS Engineer's Blog

FLINTERSのエンジニアによる技術ブログ

Domain Modeling Made Functional の訳本が出ます

弊社、ブログ祭りやってます。(自分のテーマは #DDD #関数型プログラミング #書籍 ということで)

界隈では度々話題に上がる名著「Domain Modeling Made Functional」の訳本がついに発売されるようです。発売を祝して、この本がどんな本なのか、何のための本なのかをネタバレにならない程度に紹介しようと思います。(私は原著を読みました。)

ドメインの理解

第一部では、そもそもソフトウェアを作る前段階として、どのようにして解決したい問題領域を理解していくかを紹介しています。ドメイン駆動設計についても言及されていますが、本書の冒頭にもドメイン駆動設計の主要な概念が説明されています。本書を読む上では冒頭の説明だけでも十分ですが、より深く理解したい場合はエリックエバンスのドメイン駆動設計実践ドメイン駆動設計を読むのが良いかもしれません。

現状のビジネスプロセスを「ワークフロー」と捉えてシステムに落とし込んでいく過程や、そのために使える細かな手法など、実際のシステム開発に使えるテクニックが凝縮されています。

ドメインのモデリング

第二部では、第一部で理解した問題領域を言語の「型」として実装する過程を示しています。型を使って普遍条件を表現するためのテクニックや、エラーを表現する型など、関数型プログラミングに詳しい方であればお馴染みの内容かもしれません。コード例は F#で書かれていますが、TypeScript や Go、Rust などを読める人であれば何となくで理解できるようになっています。

モデルの実装

第三部では、第二部で実装した型をもとに、実際にコードを実装する方法を示しています。関数を第一級のオブジェクトとして扱うことや関数の合成などから始まり、関数型プログラミングの基本的な概念を紹介したうえで、実際のビジネスプロセスをどのようにして実装に落とし込んでいくかを紹介しています。特に

  • エラーが起こりうるワークフローをどのように組み合わせるか
  • IO を局所化して実装する方法(例えば、データベースに聞きに行かないとその後のプロセスを進められない時、こんな時どうする?)
  • 戻り値が無い関数をどうやって合成していくか

などは必見です。

もう 1 つ嬉しいのは、最終章で完成した実装に新しい機能を追加するところまでやってくれることです。実際にシステムを作っていると、一度書いたコードで完成なんてことはほとんどなく、常に新しい機能の追加やバグの修正でコードはどんどん書き変えられていきます。本書の最終章では、これまでに作り上げたコードに対して新しい要望を追加するところを見せてくれます。ここでも関数をワークフローと捉えて、関数の合成を上手く使っていきます。

その他全体を通して

本書全体として、1 つのビジネスプロセスを例として使い、そのプロセスをシステムとして落とし込んでいく過程を示しています。書籍全体で例が共通しているので、非常に理解がしやすいです。また、文章とコード以外に概念図がいくつか出てくるのですが、これがとてもわかりやすくて書籍の内容を上手く補完してくれます。実装例は F#ですが、説明がわかりやすいおかげですんなり理解できました。

さらに、各章の終わりにまとめが書いてあるので、1 ステップずつしっかり理解しながら読み進めることができます。書籍の内容はもちろんですが、そういった細かい部分にも配慮が行き届いた良著だと思いました。

まとめ

「ドメイン駆動設計」や「関数型」というワードが目を引く本書ですが、言語によらない、システムを作る上で欠かせない設計と実装のテクニックが満載の書籍です。システムで問題を解決しようとする全てのプログラマにとって、読んで損の無い内容になっていると思います。