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
5
referential-transparency
l-freeze
October 13, 2024
Tweet
Share
More Decks by l-freeze
See All by l-freeze
エンティティリレー
lfz
0
3
CQRS そして現実へ
lfz
0
33
Featured
See All Featured
Designing Dashboards & Data Visualisations in Web Apps
destraynor
228
52k
Reflections from 52 weeks, 52 projects
jeffersonlam
346
20k
How to Ace a Technical Interview
jacobian
275
23k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
504
140k
How To Stay Up To Date on Web Technology
chriscoyier
788
250k
How STYLIGHT went responsive
nonsquared
95
5.2k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5k
Building an army of robots
kneath
302
42k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
How to Think Like a Performance Engineer
csswizardry
19
1.1k
Code Reviewing Like a Champion
maltzj
519
39k
Happy Clients
brianwarren
97
6.7k
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. デバッグログなら好きに出してください。ビジネス上必要なログなら関数のスコープ が大き過ぎです。関数を分解し、それぞれの関数を呼ぶ間でログを出してください。
おしまい