nekoTheShadow’s diary

IT業界の片隅でひっそり生きるシステムエンジニアです(´・ω・`)

『関数型ドメインモデリング』を読んだ

www.e-hon.ne.jp

関数型プログラミングでドメイン駆動設計を進めるためにはどうすればよいのかというちょっとマニアックな切り口の本です。

読者層に関して、関数型プログラミング初心者でもOKという前提にはなっていますが、正直なところまったく触れたことのないレベルだと読むのは厳しいかもしれません (初心者に対してかなりわかりやすい記載にはなっていますが)。ただF#については、関数型プログラミング言語の一例として利用している感じなので、ほかの関数型プログラミング言語の経験があれば、なんなく理解できると思います。F#特有の知識が特別必要だったり、そればかりが紹介されたりもありません。

関数型プログラミング初心者だと厳しいとしましたが、ドメイン駆動設計初心者に対しては、むしろおすすめできるレベルだと思います。いくつかドメイン駆動設計に関する本を読んできましたが、そのなかではもっとも簡潔でわかりやすいと感じました。ドメイン駆動設計導入にはぴったりでしょう。

読んでみての感想として、本書の内容すべてをビジネスに取り入れることは難しいが、しかし多くの示唆に富んだ本であると思いました。現代のプログラミング言語やフレームワークには、関数型プログラミングやドメイン駆動設計のパラダイムが取り入れられていることも少なくないので、純粋な関数型プログラミングやドメイン駆動設計を指向しなくとも、本書にて紹介されるエッセンスを現場のソフトウェア開発で導入できるのではないでしょうか。

多くの示唆に富んだ本と書きましたが、個人的に感心したのは、ワークフローを型で表現する点。たとえば、顧客から注文があり、その注文の内容を検証するというワークフローがあったとします。このワークフローでは注文伝票の製品コードをチェックしたあと、顧客住所をチェックする場合、本書のやりかたにのっとれば、まず次のような関数型を定義します。

type ValidateOrder =
    CheckProductCodeExists  // 依存関係
     -> CheckAddressExists  // 依存関係
     -> UnvalidatedOrder    // 入力
     -> ValidatedOrder

そのあと、この関数型を満たす関数を実装します。

let validateOrder : ValidateOrder =
    fun checkProductCodeExists checkAddressExists unvalidatedOrder -> ...

このやり方のよいところは、型宣言を見ればワークフローで何をするのかが一目でわかること、そして仕様変更に強いことです。たとえば、仕様変更が発生して、注文の内容を検証する際に、顧客のメールアドレスをチェックする必要が増えたとします。この場合、まず型宣言を修正します。

type ValidateOrder =
    CheckProductCodeExists  // 依存関係
     -> CheckAddressExists  // 依存関係
     -> CheckEmailExists    // 依存関係
     -> UnvalidatedOrder    // 入力
     -> ValidatedOrder

すると、この関数型の実装関数であるvalidateOrder関数はコンパイルエラーになります。これはつまり仕様と実装に差異があることをコンパイラによって機械的に検出できているといえます。自分の仕事柄「Excel仕様書の中身とソースコードの実装が違って困る」ということが多々あるので、こういう仕様と実装の一致を強制できる仕組みには本当に感動しました。

これ以外にも本書にはソフトウェア設計に役立つさまざまなアイディアが紹介されています。全293ページと分量はほどほど。図表も多くてわかりやすく、なにより翻訳がこなれていて、非常に読みやすいので、自分のソフトウェア設計の持ち駒を増やしたい、新たな風を取り入れたい人は読んでみて損はないかと思います。