Skip to content
Latchkey

副作用とは?コードが世界を変えるとき

副作用とは、ディスクへの書き込み、APIの呼び出し、共有状態のmutateのように、関数が結果を返す以外に引き起こす観測可能な変化のことです。

副作用のない関数は値を計算して返すだけです。ファイルを書き込む、出力を印字する、リクエストを送る、グローバルを変えるなど、観測可能な他のことをした瞬間、それは副作用を持ちます。副作用はプログラムが実際に有用な仕事を行う手段ですが、コードをテストし、推論し、並列で安全に実行することも難しくします。

何が副作用に当たるか

  • ディスク、データベース、ネットワークへの書き込み。
  • 関数の外側の変数やオブジェクトのmutate。
  • コンソールへの印字やログ出力。
  • 時計やランダムソースのようなミュータブルな外部状態の読み取り。

副作用が物事を複雑にする理由

副作用を持つ関数は周囲の世界に依存し、それを変えるため、その振る舞いは隠れたコンテキストによって変わり得ます。それはテストを難しくし(作用のセットアップと検証が必要)、順序と環境が問題になるため推論も難しくします。

副作用とテスト

純粋なロジックはテストが容易ですが、作用のあるコードにはmock、fixture、実リソースが必要です。実際の副作用を行うテスト(ライブサービスへのアクセス、共有ファイルへの接触)は遅く、共有CIインフラでflakyになりやすいです。

副作用の管理

よくある規律は、副作用をプログラムの境界に隔離し、コアのロジックを純粋に保つことです。そうすればほとんどのコードはテストが容易になり、作用のある小さな殻だけが、より重い統合テストを必要とする唯一の部分になります。

手短な例

合計を計算して返す関数は作用がありません。その合計をログファイルにも書き込む関数は副作用、すなわちファイル書き込みを持ち、テストは今やそれを考慮しなければなりません。

CIにおける副作用

制御されない副作用、共有ファイル、実際のネットワーク呼び出し、残留したグローバル状態は、CIにおける順序依存でflakyなテストの主要な原因です。作用を隔離することでテストは決定論的に保たれます。Latchkeyは本当に一時的な障害を自動でリトライしつつ、あなたは副作用由来のflakinessを取り除けます。

重要なポイント

  • 副作用とは、戻り値以外に関数が行う観測可能な変化のことである。
  • 副作用は有用な仕事を行うが、コードのテストと推論を難しくする。
  • 制御されない副作用は、flakyで順序依存なCIテストの主要な原因である。

関連ガイド