web-dev-qa-db-ja.com

副作用-これは何ですか?

次の行で「副作用」の意味を教えてもらえますか?

何も返さないEL関数を呼び出している場合は、その副作用のためだけに呼び出しています。

22
Java_Noob

副作用とは、値を計算して返す以外に、メソッドが行うことです。インスタンスまたはクラスフィールドの値を変更すると、画面に何かを描画したり、ファイルやネットワーク接続に書き込んだりするのと同様に、副作用が発生します。

厳密に言えば、「関数」は副作用がないこととして定義されます-そのため、Javaは代わりに「メソッド」という単語を使用します。戻り値のない実際の関数は無意味です。

明らかに、戻り値を持たないメソッドには、その存在を正当化する何らかの副作用が必要です。セットメソッドは一例です-副作用はオブジェクトの内部状態を変更することです。

45

これは、数学的な意味で「真の」関数を呼び出していないことを意味します。このような関数は常に値を返しますが、これは入力パラメーターによって完全に決定されます。変更する「状態」はなく、他に何も起こり得ません。これが、並列化の観点から関数型プログラミングが興味深い理由です。それはそれを証明することをより簡単にします例えば2つの関数呼び出しは独立しており、並行して実行できます。

詳細については、 純粋関数 のウィキペディアのエントリを参照してください。

15
unwind

副作用は、メソッド呼び出しがクラスの状態を変更した場合です。そう

public class SideEffectClass{

    private int state = 0;


    public doSomething(int arg0){
        state += arg0;
    }
}

ここで、doSomething(int arg0)には、状態変数を変更するという副作用があります。

プログラムについて考えるとき、それは命令+状態+入力と考えることができます。したがって、プログラムのドメインがすべての可能な入力*状態の範囲であり、プログラムに副作用がある場合、副作用の数が増えるにつれて、アプリケーションの可能な結果の終域が爆発的に大きくなる可能性があることがわかります。これにより、プログラムの可能な状態が大きくなり、複雑なテストにつながります。関数型プログラミングパラダイムは、副作用を排除するように設計されています。関数を第一級市民にし、すべての宣言を不変にすることにより、関数型プログラミングは副作用を防ぎ、同期の問題が軽減されるため、並列処理で関数型プログラミングを際立たせます。

3
codethulhu

あなたが薬を使うとき、それは一般的に望ましくない悪影響である副作用です。それを使用する主な目的は、それが「要求される」効果を得ることです。ここで、関数の角度を見ると、一般的に関数を呼び出すと、計算値を取得して使用します。 「要求された」値を計算するときにいくつかの値を変更する他の関数もあるため、ここで「いくつかの値を変更する」ことは副作用です。文の説明で、関数が何も返さない場合、それはその副作用にのみ使用されるため、ここでは、副作用は「いくつかの値を変更する」ことです。

1

上記のコードを少し操作して、比較して明確にします。

public class SideEffectClass{

    private int state = 0;

    public doSomething(...){//Does not matter
        state ++;
    }
}
1
Oekel