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
referential-transparency
Search
l-freeze
October 13, 2024
0
10
referential-transparency
l-freeze
October 13, 2024
Tweet
Share
More Decks by l-freeze
See All by l-freeze
エンティティリレー
lfz
0
24
CQRS そして現実へ
lfz
0
49
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
The Straight Up "How To Draw Better" Workshop
denniskardys
238
140k
Unsuck your backbone
ammeep
671
58k
Navigating Team Friction
lara
190
15k
Typedesign – Prime Four
hannesfritz
42
2.8k
Keith and Marios Guide to Fast Websites
keithpitt
411
23k
The Cult of Friendly URLs
andyhume
79
6.6k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
32
2.3k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
37
2.6k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
9
590
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.2k
Transcript
参照透過性と純粋関数
参照透過性
参照透過性とは 計算機言語の概念の一種である その式をその式の値に置き換えてもプログラムの振る舞いが変わらない
計算機言語? プログラムを記述する為に用いる言語 phpとかjavascriptの事ね ゲーム プログラム? WEBサービス キッチンタイマー 電圧センサー
その式を式の結果に置き換えても振る舞いが変わらない? f(x) = 2x+x^2 100+f(5) = 100 + (2*5 +
5^2) = 100 + 35
関数化とインライン化ね! それは違わない? どうして?インライン化して一度だけ呼 び出せば同じ結果でしょう? 現在時刻を取得する関数だったら実行 する度に結果変わるよね?
参照透過性のある関数式とは • 関数を式の値に置き換えられる • 式の値に置き換えられるという事は、何度実行しても同じ影響があり同じ結果が返 される
参照透過性のない社長
ここの社長って見る度 に人変わってるよね。 トランポリン 海下 鈴木
参照透過性のある社長
明日の14時に社長が伺います。 そうです、4年前のあの人です。10年前にも 会食なされてらっしゃいますね。
参照透過性のある関数の恩恵 • いつ呼び出しても同じ結果が返される ◦ 状態を持たない(関数の中だけ見れば良い) • 意味の汲み取れる関数名、明確なインプット・アウトプットが定義されていれば処理 を読まなくても良い • 関数の動作保証が取れれば、その関数を利用する側は関数の動作を気にしなくて
良い
純粋関数
純粋関数とは 同じ入力に対して同じ出力がある 副作用がない (つまり参照透過性)
参照透過性と同じ・・・?
純粋関数の特徴 • 参照透過性がある • 副作用が無い
純粋ではないが参照透過性のある関数 いつimpureDouble(7)を呼んでも14が返される →参照透過性がある impureDouble(7)を呼ぶ度にログが出力される →副作用がある
純粋関数 いつimpureDouble(7)を呼んでも14が返される →参照透過性がある それ以外の一切の影響が無い →副作用がない
純粋関数の恩恵 • 参照透過性を持つ関数と同じ恩恵を受けられる • ログ出力やファイル出力など、関数の外に影響を及ぼすことが無いので何度でも実 行できる ◦ この処理実行しても良いかな?大丈夫かな?という心配がいらない
みんな参照透過性しよう
気にしてみよう • その関数、本当に状態を持つ必要がありますか? ◦ 必要でないのならstaticな関数にしましょう。関数の外を気にしなくてよくなるの で可読性が上がります。 • その関数、本当に副作用が必要ですか? ◦ まずは関数から取り払いましょう。関数の中身が処理の本質だけになるので
可読性があがります。 ◦ 副作用を起こすのに適した場所がないか見直しましょう。
やっぱり状態や副作用が欲しい・・・ Q. 処理に必要なデータ群がクラスのフィールドが持っているんだけど・・・ A. 関数の引数としてデータを渡すようにしましょう。 Q. 処理の経過をログに出したいんだけど・・・ A. デバッグログなら好きに出してください。ビジネス上必要なログなら関数のスコープ が大き過ぎです。関数を分解し、それぞれの関数を呼ぶ間でログを出してください。
おしまい