【ふくさよう】

副作用 とは?

💡 関数の「本業以外のお仕事」
📌 このページのポイント
関数の副作用(Side Effect) 純粋関数 入力 A 関数 同じ出力のみ 副作用のある関数 入力 A 関数 出力 DB書込/ ログ出力等 副作用 = 関数の外部状態を変更すること
副作用のイメージ
ひよこ ひよこ

副作用ってなんで問題になるの?

ペンギン先生 ペンギン先生

たとえば計算するだけのはずの関数がこっそりデータベースを書き換えていたら怖いでしょ?副作用が「どこで何をしているか」不明だとバグの原因になる。だから副作用を明確に管理して、予想外の動きを防ぐのが大事。

ひよこ ひよこ

useEffectってどう使うの?

ペンギン先生 ペンギン先生

useEffect(() => { ここに副作用 }, [依存配列]) という形で書く。コンポーネントの描画後に実行される。依存配列に指定した値が変わったときだけ再実行される。API呼び出しやイベントリスナーの登録はここに書く。

ひよこ ひよこ

副作用をゼロにすることはできないの?

ペンギン先生 ペンギン先生

できない。ユーザーの入力を受け取ること、画面を描画すること、データを保存すること、これらはすべて副作用。目指すべきは「副作用ゼロ」ではなく「副作用の発生場所を限定して管理する」こと。

ひよこ ひよこ

純粋関数って何がうれしいの?

ペンギン先生 ペンギン先生

同じ入力に対して必ず同じ出力を返し、副作用がない関数のことだよ。テストが簡単(入力と出力を確認するだけ)、並列実行しても安全、結果をキャッシュできる、リファクタリングしやすい。関数型プログラミングはこの「純粋関数をできるだけ増やす」という方針で設計するんだ。

ひよこ ひよこ

Reactコンポーネントの中で直接APIを呼んじゃダメなの?

ペンギン先生 ペンギン先生

レンダリング中(returnまでの処理)で副作用を起こすと、コンポーネントが何回描画されるか予測できなくなるから危険なんだ。React 18のStrict Modeでは意図的に2回レンダリングして副作用のバグを検出する。副作用はuseEffectの中に閉じ込めるか、イベントハンドラの中で実行するのがReactのルール。これを守ることで「UIは状態の関数」という予測可能な設計が実現できるんだよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
副作用って出てきたら「関数が値を返す以外に外部に影響を与える処理」と思えばだいたいOK!
📖 おまけ:英語の意味
「side effect」 = 副次的な作用
💬 医薬品の「副作用」と同じ言葉で、本来の目的(値を返す)以外に起こる効果を指す
← 用語集にもどる