私が常に理解しているように、プログラムの状態 (または IO に関連するもの) への変更は副作用です。変更がグローバル変数で発生するか、メソッドが呼び出されるオブジェクトのプライベート フィールドで発生するかは問題ではありません。したがって、何も返さないすべてのメソッドは、まったく何もしないか、副作用があります。
私の混乱は、私たちの大学のインストラクターの 1 人から来ています (彼はまだ学生なので、まだ全知ではありません;)) セッターには副作用がないと言っていました。
3 に答える
あなたの指導者は間違っています。記事全体をここに貼り付けなかったことを SO 編集者に謝罪し、ウィキペディアは次のように述べています。
http://en.wikipedia.org/wiki/Side_effect_(コンピュータ科学)
お金の見積もり #1:
コンピューター サイエンスでは、関数または式は、値を生成するだけでなく、何らかの状態を変更したり、関数の呼び出しや外界との観察可能な相互作用を行ったりする場合に、副作用があると言われています。
お金の見積もり #2:
副作用がある場合、プログラムの動作は過去の履歴に依存します。つまり、評価の順序が重要です。
非 NOP セッターは常にその基準を満たします。
まず第一に、私は言語にとらわれないタグを認識しています! 「runako」はその質問にかなり正確に答えました。しかし、多くの場合、自分の知識を現実の世界に適用したいので、この問題にもっと実用的な方法で対処する回答も提供できればと思います.
c++、c#、Java などの現実世界の言語を扱う場合、nop 関数でさえ、コードが実行される可能性のある実際の副作用があります。
静的コンストラクターについて考えてみてください。仕様では、静的コンストラクターがクラスに対して実行される時間を常に指定しているわけではありませんが、ほとんどの場合、クラスのメソッドまたはメンバーが最初にアクセスされる時点になります。
C# での例:
class NotSoObvious
{
static NotSoObvious()
{
CauseSomeSideEffects();
}
// calling this can cause the constructor to run first!
public static void DoNothing()
{
return;
}
}
さらに、まったく呼び出されていないメソッドでさえ、副作用を引き起こす可能性があるということです! リフレクション (プログラムが自身の構造に関する情報を照会する能力) について考えてみてください。メソッドが存在するが呼び出されていない場合でも、リフレクションによって検出できます。
呼び出しのないメソッドは、内部のメソッドの数を出力するプログラムに確実に副作用をもたらします!
要約すると、メソッドの実際の副作用について知りたい場合は、まず、何が「副作用」であると考えているかを判断する必要があります。
ゲッターとセッターは、get_ および set_ メソッドの構文糖衣にすぎません。それらは絶対に副作用をもたらす可能性があります (ただし、呼び出し元がカウンターまたは何かをインクリメントすることだけを望んでいたときに、多くのフィールドを微調整し始めるのはおそらく悪い考えです)。