忍者ブログ
情報処理技術者試験の合格を目指す全受験者のための、1問1問「徹底解説」ブログです。単なる過去問の暗記ではなく、なぜその答えになるのかを本質的に理解できるよう解説します。書籍などでは学べない最新用語やトレンドを踏まえてご紹介します。

【アルゴリズム】バグを減らす設計の極意!「関数の参照透過性」|情報処理

プログラムの動作を予測しやすくし、テストや並列処理を容易にする「参照透過性」という概念があります。数学的な関数に近い、そのクリーンな性質を攻略しましょう。

1. 問題:関数の参照透過性の定義

【 問題 】 プログラミングにおける「関数の参照透過性」を説明したものとして、最も適切なものはどれでしょうか?

ア、関数が自分自身を再帰的に呼び出すことができる性質
イ、同じ引数に対しては常に同じ結果を返し、かつ外部の状態に影響を与えない性質
ウ、関数の引数として、別の関数を渡すことができる性質
エ、関数内部からグローバル変数に自由にアクセスし、書き換えができる性質

2. 正解:プログラミング理論に関する正解

正解: イ、同じ引数に対しては常に同じ結果を返し、かつ外部の状態に影響を与えない性質

3. 解説:「置き換え可能」であることの価値

参照透過性(Referential Transparency)とは、ある関数呼び出しを「その実行結果の値」に置き換えても、プログラムの意味が変わらないことを指します。

【図解:参照透過な関数(純粋関数)の条件】

■ 副作用がない (No Side Effects)
・関数の外にある変数を書き換えない。
・画面出力やファイル書き込みを行わない。

■ 入力のみに依存する
・現在時刻や乱数、外部ファイルの内容など、呼び出すたびに変わるものに依存しない。

■ 例: add(2, 3)
・いつどこで実行しても必ず「5」を返す。このため、コード中の `add(2, 3)` を直接 `5` と書いてもプログラムの結果は同じになる。
[ 参照透過性のメリット ]
メモ化が可能:一度計算した結果を再利用できるため、パフォーマンス向上に寄与する。
テストが容易:外部の状態を準備(モック化)する必要がなく、引数だけでテストが完結する。
スレッド安全:共有データを書き換えないため、マルチスレッド環境でも安全に動作する。

1. 理解のコツ: 「数学の関数($y = f(x)$)」をイメージしてください。数学では同じ $x$ を入れれば必ず同じ $y$ が出ますし、計算したからといってノートの別の場所の数字が変わることもありません。これが参照透過な状態です。
2. 試験対策の視点: 関数型プログラミングの文脈でよく出題されます。「副作用がない」「引数だけで結果が決まる」というフレーズがキーワードです。対照的な概念として「非純粋関数」もセットで覚えておきましょう。


4. まとめ

「同じ入力なら同じ出力、副作用なし」。これが関数の参照透過性です。全ての関数を参照透過にすることは難しいですが、可能な限りこの性質を持たせることで、堅牢でメンテナンスしやすいシステムを構築できます。


PR