Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
4分間でわかった気になるRailway Oriented Programming
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
mashi
November 22, 2025
0
140
4分間でわかった気になるRailway Oriented Programming
mashi
November 22, 2025
Tweet
Share
More Decks by mashi
See All by mashi
JJUG_CCC_2024 プロダクトが変われば、テストも変わる
yukishima
7
1.8k
Featured
See All Featured
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
590
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
400
Accessibility Awareness
sabderemane
0
58
The Spectacular Lies of Maps
axbom
PRO
1
530
GraphQLとの向き合い方2022年版
quramy
50
14k
Paper Plane
katiecoart
PRO
0
46k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
0
2.4k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
130
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
100
Designing for Timeless Needs
cassininazir
0
130
Context Engineering - Making Every Token Count
addyosmani
9
670
Mobile First: as difficult as doing things right
swwweet
225
10k
Transcript
4分間でわかった気になる Railway Oriented Programming 2025年11月23日
シマ ユウキ 富山県高岡市出身 大学時代は石川県金沢市に住ん でいました TypeScript好き 2 自己紹介
今日話すこと Railway Oriented Programmingのエッセンス 今日話さないこと TypeScriptでもResultを使おうという話はしません!! 会社紹介 ミッションは「スタートアップエコシステムをブーストし、日本からGoogle級のスタートアップを生み出す」 フロントエンドはTypeScript、バックエンドKotlin/Javaです 3
4分間でわかった気になるRailway Oriented Programming
Railway Oriented Programming(ROP) 「関数型ドメインモデリング」の著者Scottさんが2014年に発表 関数型プログラミングでのエラーハンドリングを初心者にもわかりやすく説 明した 関数を「成功」と「失敗」の2つの分岐がある鉄道の比喩で直感的に示した 日本語版では「鉄道指向プログラミング」と訳されています ※スライド中では本のことをDMMF本、Railway Oriented
Programmingを ROPと略します 関数型ドメインモデリング Scott Wlaschin 著 猪股 健太郎 訳 https://asciidwango.jp/post/754242099814268928/ %E9%96%A2%E6%95%B0%E5%9E%8B%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3% E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0 4 4分間でわかった気になるRailway Oriented Programming
3つのエラー分類 パニック 処理不可能なシステムエラー(メモリ不足、ゼロ除算など) インフラストラクチャエラー アーキテクチャの一部として予想されるエラーだが、ビジネスプロセス の一部ではないもの(ネットワークタイムアウト、認証エラーなど) ドメインエラー ビジネスプロセスの一部として予想されるエラー(ECなら在庫が足りな い、無効な製品コードなど) これをROPで扱うと良いとされている
5 4分間でわかった気になるRailway Oriented Programming
Railway Oriented ProgrammingのRailway 成功を緑のレール、失敗を赤のレールで表現 緑のレールを走っている間(成功)は、次の処理を 実行する 赤のレールを走ることになったら(失敗したら)次 の処理はバイパスする 戻り値は必ず同じ型(Result) 連ねたものをワークフローと呼ぶ
筆者のスライドから引用 https://github.com/swlaschin/RailwayOrientedProgramming 6 4分間でわかった気になるRailway Oriented Programming
Railway Oriented Programmingを支えるResult 関数がどんな返り値が存在するかを「型」で示す Result<Ok, Err>だとすると OKの間はずっと緑のレール Errorになったら赤のレール 右の場合10個より買おうとするとエラー 関数型でよくあるパターン
言語によって名前が違ったりする TypeScriptにはない 7 4分間でわかった気になるRailway Oriented Programming 筆者のスライドから引用 https://github.com/swlaschin/RailwayOrientedProgramming
線路を繋ぐときに出てくるのが「bind/flatMap」 処理が連続した時に繋げるのがbind/flatMap 緑のレールを走っている間(成功)は、次の処理を 実行する 赤のレールを走ることになったら(失敗したら)次 の処理はバイパスする 8 4分間でわかった気になるRailway Oriented Programming
筆者のスライドから引用 https://github.com/swlaschin/RailwayOrientedProgramming
結果が型に現れる 9 4分間でわかった気になるRailway Oriented Programming バリデーションと在庫チェックを行なった結果起き うるのは3パターンと型が示している OK 10個以上買おうとしてNG 在庫不足でNG
エラーのパターンがふえたとき 10 4分間でわかった気になるRailway Oriented Programming ハンドリングの不足を型レベルで怒ってくれる バリデーションと在庫チェックを行なった結果起き うるのは3パターンから4パターンに OK 在庫不足でNG
10個以上買おうとしてNG 0個買おうとしてNG←NEW
ROPのメリット:それぞれの処理の失敗を抽象化して扱うことができる 11 4分間でわかった気になるRailway Oriented Programming バリデーションに失敗したとしても在庫不足でも ワークフローはかわらない 失敗したら同様に後続処理がスキップされる ということは バリデーションのパターンが増えてもワークフロー
は安定 Errorの種類が増えても同じようにレールに乗る だけ 他の関数は触らなくてOK 関数の独立度が高いのでテストも書きやすい 増えたエラー自体は型に現れる
ROPのメリット:それぞれの処理の失敗を抽象化して扱うことができる 12 4分間でわかった気になるRailway Oriented Programming バリデーションに失敗したとしても残高不足でも ワークフローはかわらない 失敗したら同様に後続処理がスキップされる ということは バリデーションのパターンが増えてもワークフロー
は安定 Errorの種類が増えても同じようにレールに乗る だけ 他の関数は触らなくてOK 関数の独立度が高いのでテストも書きやすい 増えたエラー自体は型に現れる ROPのエッセンス エラーハンドリングの扱いに着目した手法 失敗を型(Result<Ok, Error>)で表現することで、成功か失敗かを判別可能にする flatMapが型を見て、成功なら次の処理を実行、失敗ならスキップして伝播する if文や例外処理を書かずに、複数の処理を安全に連鎖できる
いつでも使うべき?TypeScriptとの相性は? ResultはTypeScriptの標準にはない仕組み パターンマッチングやパイプラインがない(型の絞り込みなどはできる) ROPの利点である「例外処理を呼び出し元に強制できる」ほどではない 自分で実装、サードパーティライブラリなどの選択肢はあるが、標準から離れる覚悟は必要 有効な箇所は? 起きうるエラーを分類し、ドメインエラーかどうかを考えるのには有効 また、それを値として扱うと便利か、I/Oを分離できるかなどがファクターになりえる 筆者のScottさんも軽率には使うなと書いている Against
Railway-Oriented Programming 13 4分間でわかった気になるRailway Oriented Programming
ROPを知ることで得られる栄養がある。それは、呼び出し側への意図の表明 起きうる結果を型で表すという発想は、「呼び出し側への意図の表明」という利点がある 「あり得る状態だけを型定義するべき」 この処理(関数)で起きうることが型によって文書化できているとも言える。AIにも優しい。 表明ではなく強制を求めるなら他の言語かも(TSでもできる) ROPは「起きた結果の処理の抽象化」という点でとても噛み合わせがいい。文字通り関数を”合成”することでドメイ ンを表現できる プロダクトにおける様々な例外、中でもドメインエラーを扱う一つの手段としてROPがある エラー分類などは普遍的な内容(言語標準にResultがあるかないかではないよ) 14
4分間でわかった気になるRailway Oriented Programming
ご清聴ありがとうございました Nstockブースに来てね!キーホルダーもあるよ! ResultをTypeScriptのプロジェクトで使っているよ・使うのやめたよの話があればぜひ聞かせてください! 15 4分間でわかった気になるRailway Oriented Programming