ついに来た!「関数型ドメインモデリング」

はじめに

ご縁があって翻訳者の猪股さんよりご恵贈いただきました。 この場をお借りして御礼申し上げます。

本書は F# 界隈では F# for fun and profit でお馴染みの Scott Wlaschin 氏による「Domain Modeling Made Functional」の翻訳です。

僕はもともと F# を書く人なので、数年前にそちら由来で原著を読んでおりました。 とても学びを得ることができていい本だけど翻訳されるのは難しいだろうなと思っていたので、この度の本書の出版はまさに偉業!

本書について

ドメイン駆動設計や関数型プログラミングに、なんか難しそうというイメージを持っている方は少なくないと思います。 自分もその一人で、エリック・エヴァンスのドメイン駆動設計は何回読んでも理解しきれないし、モナドとかファンクタとかよくわからんまま過ごしています。

「本書を読むためには、ドメイン駆動設計や関数型プログラミングの予備知識は必要ありません。本書は入門書であり、すべての重要な概念は必要に応じて説明されます。」という想定読者の記述の通り、 ある程度のソフトウェア開発経験があれば、読み進められるでしょう。

ドメイン駆動設計と関数型プログラミングについては教科書的な内容でなく、重要な部分を中心に実践的な範囲にフォーカスしているので、この分野にありがちな概念の渦に圧倒されるみたいなことはありませんでした。 ページ数がエヴァンス本の半分くらいなのでそれはそうですよね。

感想とか

個人的に印象に残った点をいくつか紹介したいと思います。 書ききれない、というか書きすぎてもアレなのでほどほどに。

衝動との闘い

データベース駆動設計をしたい衝動、クラス駆動設計をしたい衝動。わかる。

しかしそれらを堪えてドメインに向き合って理解することで、実装の制約や先入観にとらわれずにモデリングで表現していくことができるとのこと。肝に銘じたい。

本書は3部構成のうち、第1部が丸々ドメインの分析とそれをどう関数的に捉えるかに充てられて、実際のコードが出てきません。 コードを書く前に、設計を始める前に、ドメインに関する理解を深めることの重要さが伝わりました。

鉄道指向プログラミング

といわれてもなんじゃそれって感じでスッと流れていっちゃうのですが、原著では「Railway Oriented Programming」とのことで、略して「ROP」として言及されている記事をたまに見かけます。

関数合成によってワークフローをパイプライン化することで、成功フローと失敗フローを意識しすぎることなく一本化できるみたいな、ある種のフレームワーク的な考えと捉えました。

そのままでは合成できない関数を、Result.mapResult.bindをアダプターとして用いることで繋げられるのを学び、実はモナドだったんだよ!あーそういうことだったのねと理解できました。

本書では紙面の都合かモナディックなアプローチのみが紹介されていて、バリデーションなどはアプリカティブなアプローチを使うといいよぐらいしか書かれておらず、そっちのが気になるんじゃーという気持ちになるのですが、原著を読んだ後に気になって学んでいたので、忘れてなければ後日ご紹介したいと思います。

ちなみに著者自身による数年越しのアンサーソングが出ています。

Against Railway-Oriented Programming | F# for fun and profit

超要約すると「何でもかんでも Result 使うべきではない」なんですが、本書を読んで実践して、違和感を覚えたころに読むとなるほど感が高そうです。 興味が湧いた人は是非読んでほしい。

不正な状態を私たちのドメインで表現できないようにすること

こちらも原著では「Making Illegal States Unrepresentable」とされ、参照されている記事を見かけることがあります。

ビジネス上で起こりえないならそんな型は存在しないとも言い換えることができ、そのような状態をコンパイルすらできない実装として強制的に排除する考えです。 ドメイン知識がコードと完全に対応して、狭義のモデルのみならずワークフローまで含んだ広義のモデルが、型としてドキュメントにまで昇華するという本書のキモを表現する一文ではないでしょうか。

リポジトリパターン

そんなものはない。とまでは言ってないけど、本書では部分適用や永続化を端に追いやることで、そもそも必要なくなるというスタンスでした。 関数型プログラミングを活用することで、オブジェクト指向において有効だった概念を、よりシンプルな形で実現できるのはよいですね。

リポジトリパターンをやるとしたら、F# 8の新機能でいい塩梅にできるんじゃないかという案があるので後で実験しよう。

おわりに

原著を読んでからコードの書き方が変わった感はありましたが、本書を読んだことで、微妙に理解やニュアンスが曖昧だった部分が確信できた気がします。 ドメイン駆動設計と関数型プログラミングの組み合わせは、これまでオブジェクト指向で考えていた時よりもずっと腑に落ちました。 これまでとは違った観点からドメインモデリングを学んでみたい方には、お勧めの一冊として推したいです。

ちなみに原著がちょっと昔なので F# のバージョンが 4.1 と古く、現在の 8 ではよりよい書き方ができそうな部分もありますが、そこは本筋ではないのでさしたる問題ではないでしょう。 そもそも F# を学ぶ本ではないので、本書で興味を持った方がこっちに来て盛り上がってくれ~って感じです。

ところで僕の所属するはてなでは、5月からエンジニア有志による原著の輪読会が開催されているのですが、第1回をした週に翻訳が発表されて何とも言えない空気になったのが印象深いです。 もうすぐ本書3部からの F# のコードを、Go、TypeScript、Scalaで書き換えてみようという回に入っていくので、その試みもどこかで紹介できたらいいですね。