関数型ドメインモデリングを読んだ
関数型ドメインモデリング ドメイン駆動設計とF#でソフトウェアの複雑さに立ち向かおう
感想
関数型の思考でDDDを使ったシステム開発を行うにはどうすればいいか?について書かれてる
関数型プログラミングについての実装の話は8章くらいから出てくるんだけど、逆にいうとそこまでは関数型的なモデリングとはどうやるのか?について解説しているから言語的な習熟は気にしなくて良さそう。
具体的な実装の部分はそんな興味なければコードだけ読めば十分な雰囲気があった。いざプロジェクトで必要になった時に参考にすれば良さそう程度
イベントストーミングでドメインイベントを洗い出してシステムの全体像を描き出す。その過程でドメインイベント->ワークフロー->ドメインイベント..といった感じでinputとoutputに着目して合成していく様が関数型って感じ
型でエンティティや値オブジェクトを表現したり集約にまとめていったりする部分は関数型というより型ベースのプログラミング言語を使った開発ならよくある設計で特段感動はなかった。境界付けられたコンテキストの設定も関数型だから楽とかそういうのは関係ない。
ただ関数型プログラミングの技術を用いることで小さなワークフローを合成して大きなパイプラインへと進化させられたり、あらゆるルールを型にすることで不正な状態をかなり防げるという面はある。
DDDが関数型プログラミングと相性が良いということはわかる。というかDDDを型のない言語でやるのは無理がある。クラスで値オブジェクトとかいちいち作ってるのだるすぎる。
だから動的型付け言語ではクリーンアーキテクチャやOOP界隈が積み上げてきたお作法とかがあったりテスト重要のような独自のプラクティスがありそれらを組み合わせて変更用意性を高めた設計や開発が行われることが多い印象
本書とは関係ないんだけどいろいろ調べてる時に見つけたZennのこのDDD解説良かった
【DDD入門】TypeScript × ドメイン駆動設計ハンズオン
メモ
最初は関数型とか関係なくDDDのお話
イベントストーミング
イベントストーミング|【DDD入門】TypeScript × ドメイン駆動設計ハンズオン
ワークフローのインプットとアウトプットに着目、というあたり関数型への布石な感じがある。
DB/クラス駆動設計をしたいという衝動との戦い
現実のワークフローにDB/クラスは存在しない。まずドメインの設計をやる。やりがち。
代数的な型システム
全ての複合型がより小さな型をANDまたはORで合成してできているもの
簡潔でわかりやすい
型の合成によって↓のような感じでドメインを表現する。OO言語と違い振る舞いを一切持たない純粋なドメイン。
code:fsharp
type CardType = Visa | Mastercard
type CreditCardInfo = {
CardType: CardType
CardNumber: CardNumber
}
type PaymentMethod =
| Cash
| Check of CheckNumber
| Card of CreditCardInfo
1,2章で出てきたワークフローを表現した型の例
code:fsharp
type PaymentInvoice =
UnpaidInvoice -> Payment -> PaidInvoice
スマートコンストラクタ
スマートコンストラクタ in Dart
すべてのコンストラクタをprivateにし、代わりに有効な値ならインスタンスを返し無効な値ならエラーを返すようなコンストラクタのみを提供するような実装パターンのことを指す。
名詞->型、動詞->関数
DTO
DTO具体的にイメージできてなかったけどただの(デ)シリアライザか
読書メモ