如何重写程序以消除副作用?

时间:2017-12-12 18:20:18

标签: java lambda functional-programming

我正在尝试在java教科书中研究这个问题。 问题是要重写这个程序以消除副作用, 通过调用函数(或方法,有点相同)生成对象或程序变量状态的更改。

包边效应;

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。 有没有办法理顺程序,所以没有副作用? 我以为我删除了全局变量行,因为它在书中说它会导致这种不好, 令人困惑的代码。 但我还能尝试什么呢?

3 个答案:

答案 0 :(得分:0)

我知道这是一项任务,但像这样的事总是有些令人发狂。 "问题"是他们正在以一种永远不会被使用的方式使用全局变量。 "当我这样做时医生会疼。不要这样做"。

一般来说静态(类级别)变量很少是你真正想要的。另外main()用于实例化你的对象并让它们失去世界,而不是像C程序那样繁重。

创建类并按值传递。不要使用全局变量,除非你真的想拥有一个且只有一个实例。

这真的是我能提供的最好的东西,因为从你的问题中可以清楚地知道"正确的"结果是。

答案 1 :(得分:0)

好的,好多了:

包边效应;

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);

    }
}

我在x中作为公共static int中的int brou所以我不必初始化变量。

答案 2 :(得分:-1)

这可能会奏效,但我不确定。我评论了全局变量,然后在f方法和main方法中声明了int x。结果是,我是否使用" int result"并不重要。电话,它仍然是10输出。但我可能错了:

<!doctype html>
<html>
  <body>
    -3, -1, -2, 0, 2, 1, 2, 4, 5, 3, 4, 2, 4, 5, 6, 2, 3, 1, 3, 4, 1, -1, -3, -1