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
JavaScript に “ちょい関数型”を入れると テストが楽になるという話 (気付けば G...
Search
Shimpei TAKEDA
July 25, 2025
Programming
0
38
JavaScript に “ちょい関数型”を入れると テストが楽になるという話 (気付けば Go 風味)
社内LT会でJavaScript に “ちょい関数型”を入れると テストが楽になるという話をしました。
Shimpei TAKEDA
July 25, 2025
Tweet
Share
Other Decks in Programming
See All in Programming
ユーザーも開発者も悩ませない TV アプリ開発 ~Compose の内部実装から学ぶフォーカス制御~
taked137
0
180
複雑なドメインに挑む.pdf
yukisakai1225
5
1.2k
テストコードはもう書かない:JetBrains AI Assistantに委ねる非同期処理のテスト自動設計・生成
makun
0
320
CloudflareのChat Agent Starter Kitで簡単!AIチャットボット構築
syumai
2
500
AI Coding Agentのセキュリティリスク:PRの自己承認とメルカリの対策
s3h
0
230
パッケージ設計の黒魔術/Kyoto.go#63
lufia
3
440
さようなら Date。 ようこそTemporal! 3年間先行利用して得られた知見の共有
8beeeaaat
3
1.5k
Flutter with Dart MCP: All You Need - 박제창 2025 I/O Extended Busan
itsmedreamwalker
0
150
Updates on MLS on Ruby (and maybe more)
sylph01
1
180
rage against annotate_predecessor
junk0612
0
170
AWS発のAIエディタKiroを使ってみた
iriikeita
1
190
「手軽で便利」に潜む罠。 Popover API を WCAG 2.2の視点で安全に使うには
taitotnk
0
860
Featured
See All Featured
Designing Experiences People Love
moore
142
24k
Optimizing for Happiness
mojombo
379
70k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
Site-Speed That Sticks
csswizardry
10
820
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Into the Great Unknown - MozCon
thekraken
40
2k
Rebuilding a faster, lazier Slack
samanthasiow
83
9.2k
Building Adaptive Systems
keathley
43
2.7k
How STYLIGHT went responsive
nonsquared
100
5.8k
The Language of Interfaces
destraynor
161
25k
What's in a price? How to price your products and services
michaelherold
246
12k
Automating Front-end Workflow
addyosmani
1370
200k
Transcript
LT版 “ちょい関数型”の話 1 JavaScript に “ちょい関数型”を入れると テストが楽になるという 話 (気付けば Go
風味)
JavaScript に“ちょい関数型”を⼊れるとテストが楽になるという話 (気付けば Go ⾵味) 2 今回フォーカスする “ちょい関数型” 要素 1.
✅ 純粋関数 同じ入力 → 同じ出力 / 副作用ゼロ 2. ✅ 不変データ 値は作り直す・失敗は null / Error() で返す 3. ✅縦直列フロー const x = getX(); if (!x) return … で一直線 • 使わないもの 🙅 ◦ 高階関数・モナド・pipe・外部ライブラリ ―― 全部ナシ • 得られる効果 👍 ◦ ネスト 0 ◦ 読み筋が上 → 下に並ぶ ◦ 各関数が独立するので ユニットテストが数行で完結
あえて”嫌な”命令型コード 😭 3 あえて“嫌な” 命令型コードを作ってみる あえて“嫌な” 命令型コードのテストサンプル • 1つの関数に対してテストケースが無限に増えていっ てしまう(左は正常系のみ)
😭 • モックが多くなりがち 😭 • テストケースの漏れも起きがち 😭
“ちょい関数型”にしてみる 👍 4 “ちょい関数型” バージョン “ちょい関数型” バージョンのテストサンプル(3関数) • 関数ごとにユニット テストが書ける
👍 • 行数が短くなる(読 みやすい)👍 • テストケースがその まま関数のドキュメ ントになる 👍 • テストケースの追加 がしやすい 👍
まとめ:”ちょい関数型”にする理由とリターン 5 • 保守がラクになる ◦ 1 本の直列フローで読める • ネスト・再代入が減ってバグを埋め込みにくくなる ◦
テストが軽くなる • 関数ごとに入力→出力だけ比べれば OK ◦ モックや後片づけが最小限で済む • 学習コストが低い ◦ 特別なライブラリや新しい概念を覚えなくてよい ◦ 既存の if / return だけで「値+エラー」の形を再現できる • 意図せず Go ライクになる理由(補足) ◦ ライブラリ追加しない・モナドも使わないという制約 ◦ “全部 関数型” に振らず 早期 return だけで分岐 ◦ 失敗は 値+エラーの二値返却 (value | Error) ◦ すると自然に val, err := fn() と同型 のパターンが生成され る ◦ const data = getData(); if (!data) return Error('…') ◦ Go の if err != nil { return err } と構造が一致 ◦ モナド(Maybe / Either)を導入しなくても 同様のメリットを 享受 ◦ 扱う側 はモナドという “箱” を意識せず単純な null / Error 判定で済む ◦ 読む側 は try / catch や深いネストから解放
LT版 “ちょい関数型”の話 Shimpei TAKEDA (⽵⽥慎平) 6 おわり