Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
referential-transparency
Search
l-freeze
October 13, 2024
21
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
referential-transparency
l-freeze
October 13, 2024
More Decks by l-freeze
See All by l-freeze
エンティティリレー
lfz
0
31
CQRS そして現実へ
lfz
0
58
Featured
See All Featured
[RailsConf 2023] Rails as a piece of cake
palkan
59
7.1k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Crafting Experiences
bethany
1
380
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.4k
The Pragmatic Product Professional
lauravandoore
37
7.5k
Discover your Explorer Soul
emna__ayadi
2
1.3k
Darren the Foodie - Storyboard
khoart
PRO
4
4k
How GitHub (no longer) Works
holman
316
150k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.3k
Designing for Performance
lara
612
70k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
990
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. デバッグログなら好きに出してください。ビジネス上必要なログなら関数のスコープ が大き過ぎです。関数を分解し、それぞれの関数を呼ぶ間でログを出してください。
おしまい