三流プログラマが脱三流するために書くブログ

PHP, オブジェクト指向プログラミング, デザインパターン, リファクタリング, DDD, 関数プログラミング, etc.

7. 「Fanctional and Reactive Domain Modeling」を読んでる

本当は「読んだ」って記事にしたかったんですが、このわくわく感を早く吐き出したかったので、エントリー書いてしまいます (まだ「1. An Introduction」読んだだけですが)。

Functional and Reactive Domain Modeling

Functional and Reactive Domain Modeling

ここに至るまでの経緯

ドメイン駆動設計

去年つくっていたアプリケーションに、少し複雑なルールとかデータ構造とかがあって、プログラム設計に難儀したというか、もっと良くなるはずなんだけどなーと思いながらコードを書いていて、でも、当時はなにか対策を打つでもなく、そのまま契約が切れて去年いっぱいでプロジェクトを去ることになりました。

で、今年に入って、なぜかは忘れましたが「エリック・エバンスのドメイン駆動設計」と「実践ドメイン駆動設計」をセットで買って、読んでいたら、これはなんだかいいことが書いてあるぞって思って、新しく参加したプロジェクトで、本に書かれていること (モデル駆動開発、レイヤードアーキテクチャ、サービス、etc.) を意識しながら手探りで進めていたら、なんかテストはやりやすいし、コードがすっきりして不具合も出にくくなったし、これはもっと理解したい、使いこなせるようになりたいってことで、勉強会に参加したり自分で勉強したりしている今日この頃というかんじでした。

関数プログラミング

これも今年に入って、どっかで関数言語でプログラム書くと不具合が出にくくなるらしいよって話を読んで、「関数プログラミング実践入門」という本を買って、Haskell やら Elixir やら触りながら、なぜ関数プログラミングだと不具合が出にくいのかっていうのがなんとなーく分かってきて (まだ業務では試してないので、実際の複雑である程度大きいアプリケーションで、不具合を減らすのがどれだけ楽か、あるいは大変か、という感覚はまだ分かりません)、

ドメイン駆動設計と関数プログラミング

で、私にとっては、ドメイン駆動設計も関数プログラミングも、自分のプログラミングから不具合を減らしたいっていう欲求から学んでいるもので、オブジェクト指向でなくてもドメイン駆動設計はできると思っていたし、オブジェクト指向言語 (私のメイン言語は PHP です) でも関数プログラミングできると思っていたので、当然の帰結として、両方を組み合わせられないだろうか…と思い始めていて、あるときググってみたら、けっこう古くからこの二つを組み合せているひとたちがいて、ですよねーと思っていたわけです。

I T.A.K.E. talk: "When DDD meets FP, good things happen"

Ruminations of a Programmer: Functional Patterns in Domain Modeling - Anemic Models and Compositional Domain Behaviors

Functional Programming and Domain Driven Design | David Ron

読書会に参加した

dots の新着イベントメールを見ていたら目に止まったイベントがあって、

Functional and Reactive Domain Modeling 読書会 第1回 - connpass

ん? Functional? Domain Modeling?なにこれこんな本あったの? (Reactive ってなんだ…)

ということで参加表明して、本買って (紙版と電子版セットで 73.94 USD) 読んでみたら、これだあああー、うおおおおーってなって夢中で読んで、Reactive のところは飛ばして、先週読書会に参加して、今日これを書いている、という経緯です。

ちなみに、サンプルコードが Scala で書かれているため Scala を勉強しながらで、英語で書かれているため分からない単語を調べながら (と言っても Kindle で読んでるから大して大変じゃないけど)、なので、時間がかかります…

「1. An Introduction」ざっくり説明

  • ドメインモデルにおいてミュータブルな状態を共有するのはやめよう (Avoid shared mutable state within your model)
  • ドメインの振る舞いを純粋関数にしよう (When most of your model behaviors are built out of pure functions, you get the power of compositionality)
  • レイヤーごとにイミュータブルにしよう (Strive for immutability in each layer of your DDD code)
  • 関数プログラミングはリアクティブプログラミングと相性がいいよ (Functional makes reactive easier)
  • ビジネスロジックと例外処理は分離しよう (manage failures as a separate concern without coupling exception handlers with business logic code)
  • イベント駆動にするとドメインモデルが「何」であるかが明確になるよ (Event-based programming delineates the “what” from the “how” of your model)

というようなことかな、と。すごいざっくりですが (章の末尾の Summary から抜粋)。

キーワードは、ミュータブル/イミュータブル、参照透過性、副作用、イベント駆動、あたりでしょうか。

そう言えば、DDD本にもミュータブル/イミュータブルとか、クエリーから副作用をなくそうとか、ドメインイベントとかって書いてあったっけ。

今後どう活かしていきたいか

PHP でウェブアプリケーションを書くことが多いんですが、状態を完全にイミュータブルにはできない (っていうかしたくない) し、すべてのメソッドを純粋関数にはできないので、そこら辺は調節しながら最適なブレンドを探っていきたいと思います (この辺はメンテナビリティとパフォーマンスのトレードオフと似ている気がします)。

まとめ

ドメイン駆動設計と関数プログラミングの相性は、けっこうよさそうです (When DDD meets FP, good things happen - Cyrille Martraire)。

エリック・エヴァンスのドメイン駆動設計

エリック・エヴァンスのドメイン駆動設計