差分

ナビゲーションに移動 検索に移動

副作用

3,372 バイト追加, 2015年3月8日 (日) 00:02
ページの作成:「'''副作用'''とは、プログラミングにおいて、あるメソッド引数戻り値以外の要素が、そのメソッドの動作に影...」
'''副作用'''とは、[[プログラミング]]において、ある[[メソッド]]の[[引数]]と[[戻り値]]以外の要素が、そのメソッドの動作に影響を及ぼすことをいう。

==概要==
副作用とは[[グローバル変数]]などの要素がある[[メソッド]]の動作に影響を及ぼすことをいう。本来であればメソッドの[[引数]]と[[戻り値]]だけを考慮すればいいはずであるが、メソッド内部で[[グローバル変数]]を参照するなどしていることにより、それらもすべて把握していなければそのメソッドを利用することができないという状態である。

==オブジェクト指向で顕著になる==
とくに肥大化したオブジェクト指向プログラミング言語を使用したプロジェクトで問題視されることが多い。たとえば[[C Sharp|C#]]などのクラスベースオブジェクト指向におけるフィールド変数(言語によってはメンバ変数やインスタンス変数とも呼ばれる)やプロパティは、実質的に[[C言語]]などの[[グローバル変数]]となんら変わらなく、その内容がメソッドの動作に影響を及ぼすため、これらをすべて把握していなければ正しい利用は難しくなる。

また、オブジェクト指向ではフィールド変数(言語によってはメンバ変数やインスタンス変数とも呼ばれる)やプロパティがクラスになっていることも多いため、その先々まで同様にすべてを把握していなければならない。小規模なうちはC言語のグローバル変数よりも影響範囲は少ないように思えるが、階層構造が複雑化した後には地獄である。まさに「[[階層化の有害性]]」であるともいえる。

プロジェクトの規模が小さいうちは問題になることは少ないが、複数人が関わるプロジェクトでは認識の食い違いなどが発生し、最終的に殴り合いになる。

==回避策==
これらを回避する目的で様々な手法が考案されている。

まず、そのような副作用をもつ[[プログラミング言語]]を根絶しようという「[[純粋関数型プログラミング言語]]」である。[[Haskell]]などでは引数と戻り値がすべてであり、それ以外は絶対に許されないという言語使用で副作用を封じ込めている。ただそこれらに移行するには慣れと経験が必要であり学習能力の低い[[プログラマー]]には難易度が高いという問題点を抱えている。

その他にも急激な変化は難しい[[プログラミング言語]]などは現状維持し、プロジェクトに関わる人々の人事などで副作用を軽減しようという手法が考案されている。それらをまとめて最近では「[[アジャイル]]」という。なかでも[[ペアプログラミング]]や[[RAIDプログラミング]]は有名であるが実践しているという話はあまり聞いたことがない。また、やらないよりはマシな程度の効果ではあるが[[コードレビュー]]も有効であるとされる。

==関連項目==
*[[staticおじさん]]
*[[人月の神話]]

==参考文献==
{{reflist}}

{{stub}}
匿名利用者

案内メニュー