2017-12-12 6 views
-1

私はこの問題をJavaの教科書で研究しようとしています。 問題は、このプログラムを書き換えて副作用をなくすことです。 ここで、オブジェクトまたはプログラム変数の状態への変更は、関数(またはメソッドと同じことです)の呼び出しによって生成されます。副作用を排除するためにプログラムを書き直すには?

パッケージsideeffect;

public class SideEffect { 

    **public static int x;** 

    public static int f(int n){ 
     x = x * 2; 
     return x + n; 
    } 
    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     x = 5; 

     //int result = f(x) + f(x); 
     int result = 2 * f(x); 
     //System.out.println(result); 
    } 

} 

コメントアウトされた行は、整数変数を実装してプリントアウトするとどうなりますか。 これらの行を実装して他の行をコメントアウトすると、 の結果は45です。 の結果は30です。 副作用がないようにプログラムを整える方法はありますか? 私はグローバル変数ラインを削除すると考えていました。本書では、この悪いことにつながる可能性があります。 混乱しているコードです。 他に何ができますか?

+0

希望の出力は何ですか? –

+0

この問題は特定の出力を示していません。関数がグローバル変数を変更するのではなく、パラメータとして使用するxの値を受け入れるようにすることだけを示唆しています。 –

+0

"副作用を排除する"とは、メソッドの実行によって生成される*外部から見える*副作用*を意味すると思います。副作用の種類もありますが、これはJavaで簡単に回避できません。 –

答えて

0

私はこれが割り当てであることを知っていますが、このようなものは常にいくらか狂っています。 "問題"は、決して使用されるべきではない方法でグローバル変数を使用しているということです。 "医者は私がこれをすると痛い。それをしないで"。

一般に、静的(クラスレベル)変数は、ほとんどあなたが本当に望むものではありません。また、main()はオブジェクトをインスタンス化して世界で失わせるためのもので、Cプログラムのように重い持ち上げをしません。

クラスを作成し、値渡しします。本当にインスタンスが1つだけであることを意味しない限り、グローバル変数は使用しないでください。

「正しい」結果が何であるかは、あなたの質問からはっきりしないので、実際に私が提供できる最高のものです。

0

これはうまくいくかもしれませんが、わかりません。私はグローバル変数にコメントしてから、fメソッドとmainメソッドの両方でint xを宣言しました。結果は、どちらかの "int result"呼び出しを使用するかどうかは関係ありませんが、それでも出力として10になるでしょう。しかし、私はを通じて間違っている可能性:

public class SideEffect { 

    **//public static int x;** 

    public static int f(int n){ 
     int x = 0; 
     x = x * 2; 
     return x + n; 
    } 
    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     int x = 5; 

     //int result = f(x) + f(x); 
     int result = 2 * f(x); 
     System.out.println(result); 
     //System.out.println(result2); 
    } 

} 
+0

次のように書き直すことができます: 'public static int f(int n){return n;}'おそらくあなたが望むものではありません。 –

0

さて、はるかに優れて:

パッケージsideeffect。

public class SideEffect { 

     public static int f(int x, int n){ 
     x = x * 2; 
     return x + n; 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     int x = 5; 
     int result = f(x , 5) + f(x, 5); 
     System.out.println(result); 

    } 
} 

私はpublic static intのintとしてxを書きましたので、変数を初期化する必要はありません。

関連する問題