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
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
167
49k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
32
1.8k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
131
33k
Music & Morning Musume
bryan
46
6.1k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
4
290
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
126
18k
Code Reviewing Like a Champion
maltzj
519
39k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
Testing 201, or: Great Expectations
jmmastey
38
7k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
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. デバッグログなら好きに出してください。ビジネス上必要なログなら関数のスコープ が大き過ぎです。関数を分解し、それぞれの関数を呼ぶ間でログを出してください。
おしまい