Slide 1

Slide 1 text

Rubyで始める関数型ドメインモデリング 湘.なんか #2 @shogo_tksk / 2025/02/15

Slide 2

Slide 2 text

話しているひと ● 高崎(@shogo_tksk) ● 普段はRails/Reactを書いています ● 一番好きなモールは湘南モールフィル🏝

Slide 3

Slide 3 text

今日話すこと ● 関数型の思考を取り入れることで、より堅牢なコードをかける(かも?) ● Rubyにおける実装例

Slide 4

Slide 4 text

モチベーション ● 本書はF#で書かれているが、その考え方自 体は言語仕様に依らず普遍的。 ● そのエッセンスをRuby / Railsで書かれた コードに落とし込むとしたらどうか? 引用: https://amzn.asia/d/7Lh0iN4

Slide 5

Slide 5 text

関数型プログラミングのエッセンスとは?🤔

Slide 6

Slide 6 text

不変性(Immutable) ● オブジェクトを直接変更せず、新しいオブジェクトを生成して操作を行う ● 意図せず他のオブジェクトの状態を壊さない

Slide 7

Slide 7 text

純粋関数 ● 引数が同じ場合、常に同じ値を返す(参照透過性) ● 副作用を持たない(関数の場合は「値を返す」ことが主たる作用) 引数以外の状態に依存

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

Railsにおける典型的な副作用(I/O) 不純な世界(副作用)と計算を分離する I/O境界 I/O境界 👈ココを純粋に保ちたい

Slide 10

Slide 10 text

引用: https://zenn.dev/coconala/articles/2a885527bf2f32 ○ dry-monadsというGemを使った例 ○ 処理のステップ1つ1つを純粋関数にする ■ 副作用を避けるため、例外を吐かない。大 域脱出もしない。 ■ その代わりにResultクラス(Success / Failure)を返す ○ そのステップを組み合わせることで、大きな処理 (ワークフロー)を作る 👈 ドメインロジックをそのまま書く

Slide 11

Slide 11 text

引用: https://gitlab.com/gitlab-org/gitlab/-/blob/d8b87be14c3c27eb7cfef1bc502d9cc4e5c8ff0f/app/services/service_response.rb ● 独自でResultクラスを定義するパターン ● Gem依存を避けたい、欲しいのは Resultク ラスのみで、多機能なのは too muchな場 合など ● GitLabのコードでは独自に定義した Result を返すことでドメインロジック上の例外を表 現している

Slide 12

Slide 12 text

やってみて嬉しいポイント ● 関数を純粋に保つことでテストが早い &書きやすい ○ 副作用(I/O)とロジックを分離することで、純粋な計算として扱える。 ○ 逆にテストが書きにくい場合は、責務の分割が適切じゃないかも?副作用を孕んでいない か?などを考えられるようになった。 ■ よりよいコードを書くためにテストを書く ● 各関数がResultクラスを返すことがある程度担保されているので、エラーパターンの把握が容 易。

Slide 13

Slide 13 text

まとめ ● 部分的に関数型のアプローチを取り入れることで、設計や実装時に立ち返る指針 が出来た ● それによりメンテナビリティ、テスタビリティが向上した