【ふくさよう】

副作用 とは?

最終更新:
💡 返す値以外に、外の世界も変わる

値を返すことに加え、関数の外から観察できる状態や動作へ影響する処理。保存やログの例、純粋関数との違い、Reactでの扱いを解説します。

📌 このページのポイント
副作用:返す値以外に、外も変わる関数の処理例:注文を保存して番号を返す返す値注文番号呼び出した側へ外への影響保存先の更新これが副作用意図した保存も、副作用に含まれる
一つの処理に返り値と外部への影響がある例です。返した番号から保存が起きる順序ではありません。副作用は悪い動作だけを指す言葉ではありません。
ひよこ ひよこ
副作用って、プログラムの悪い動き?
ペンギン先生 ペンギン先生
悪いものだけを指すわけではないよ。関数が値を返す以外に、外から観察できる影響を起こすことだ。ファイル保存やログ出力、外の変数の変更などが例になるんだ。
ひよこ ひよこ
注文を保存するのが本来の仕事でも?
ペンギン先生 ペンギン先生
それでも副作用だよ。「本業ではない」という意味ではない。結果を返すことと、データベースなど外の状態を変えることを、分けて考えるための呼び方なんだ。
ひよこ ひよこ
何が難しくなるの?
ペンギン先生 ペンギン先生
同じ処理をもう一度呼ぶと、二重に送信や保存をするかもしれない。テストでは外の状態も確認する必要がある。いつ、どこへ、何を変えるかを明確にすると扱いやすくなるよ。
ひよこ ひよこ
純粋関数は、副作用がない関数?
ペンギン先生 ペンギン先生
それに加えて、同じ入力に同じ結果を返すことも大切だよ。計算する部分と、保存・送信する部分を分けると、計算だけを確認しやすい。関数の中だけで完結する一時的な変数の変更は、外の状態の変更とは違うんだ。
ひよこ ひよこ
Reactなら、全部useEffectに入れる?
ペンギン先生 ペンギン先生
一律には入れないよ。画面を計算するレンダー中には外の状態を変えず、クリックへの対応はイベントハンドラー、外部のシステムとの同期はEffectなどへ分ける。画面用の値を計算するだけなら、Effectが不要なこともあるんだ。
もっと詳しく知りたい人へ

同じ値を返せば、純粋関数?

返り値が同じでも、毎回ファイルへ追記するなど外へ影響するなら純粋関数ではありません。結果と外部への影響を両方確認します。

副作用をアプリ全体からなくす?

保存や送信など必要な処理もあるので、ゼロを目的にはしません。計算と外への操作を分け、実行の条件や繰り返した場合の影響を扱えるようにします。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「副作用」って出てきたら「返す値以外に、関数の外から観察できる影響を起こすこと」と思えばだいたいOK!
📖 おまけ:英語の意味
「Side Effect」 = 返す結果以外に生じる作用
💬 プログラミングでの用語です。望ましくない効果だけを指すわけではなく、保存や送信など目的に沿った処理も含みます。

参考資料

← 用語集にもどる