如何消除冗余';如果存在任何java问题,那么它与此java问题有什么关系?

如何消除冗余';如果存在任何java问题,那么它与此java问题有什么关系?,java,Java,我在CS140,并试图在实践中解决问题。我不知道还需要做些什么来纠正这个问题。说明是,“下面的程序重复多次相同的表达式。修改程序,使用适当类型的变量删除所有冗余表达式。”我只是在学习如何使用整数,并且正在努力解决它,所以我确信我缺少一些简单的东西。我将代码以其原始形式发布在下面我是如何试图解决它的。提前感谢您的帮助!:) 最初的问题如下 // This program computes the total amount owed for a meal, // assuming 8% tax an

我在CS140,并试图在实践中解决问题。我不知道还需要做些什么来纠正这个问题。说明是,“下面的程序重复多次相同的表达式。修改程序,使用适当类型的变量删除所有冗余表达式。”我只是在学习如何使用整数,并且正在努力解决它,所以我确信我缺少一些简单的东西。我将代码以其原始形式发布在下面我是如何试图解决它的。提前感谢您的帮助!:)

最初的问题如下

// This program computes the total amount owed for a meal,
// assuming 8% tax and a 15% tip.
public class Receipt {
    public static void main(String[] args) {
        System.out.println("Subtotal:");
        System.out.println(38 + 40 + 30);
        System.out.println("Tax:");
        System.out.println((38 + 40 + 30) * .08);
        System.out.println("Tip:");
        System.out.println((38 + 40 + 30) * .15);
        System.out.println("Total:");
        System.out.println(38 + 40 + 30 +
                            (38 + 40 + 30) * .08 +
                            (38 + 40 + 30) * .15);

    }
}

你在正确的轨道上。显然,您打算为变量分配公共值,您已经按照
x
y
z
的方式完成了这项工作。然而,请注意,这些变量名并不是非常具有描述性的——更好的解决方案应该从调用它们的实际名称开始<代码>小计,
税收乘数
TIP乘数

但请注意,您仍然有一些冗余。你重复计算税款两次——一次是在打印税款时,另一次是在打印总额时。因此,您应该将该值分配给一个新的双精度(
tax
)。类似的重构可以通过
tip
total
完成

这会将代码转换为如下内容:

// This program computes the total amount owed for a meal,
// assuming 8% tax and a 15% tip.
public class Receipt {
    public static void main(String[] args) {
        int subtotal = 38 + 40 + 30; // formerly x
        double taxMultiplier = 0.08; // formerly y
        double tipMultiplier = 0.15; // formerly z
        double tax = subtotal * taxMultiplier;
        double tip = subtotal * tipMultiplier;
        double total = subtotal + tax + tip;

        System.out.println("Subtotal:");
        System.out.println(subtotal);
        System.out.println("Tax:");
        System.out.println(tax);
        System.out.println("Tip:");
        System.out.println(tip);
        System.out.println("Total:");
        System.out.println(total);
    }
}
当然,你可以看看这段代码,然后说“嘿,我只使用taxMultiplier和tipMultiplier一次,为什么还要麻烦声明它们呢?”你是对的——然后你可以再次重构,将taxMultiplier和tipMultiplier的值内联到税收和小费计算中

将中间值分配给具有合理名称的变量是一种技术,我们使用它来最小化错误(例如,在重复时键入一个值),并明确发生了什么。在这段代码中,您可以清楚地看到total是小计、税和小费的总和。原始代码中的数字使它很难看到。此外,如果某个值发生更改(例如小计),您只需在一个位置进行更改,相应的更改将在代码的其余部分进行级联。

我的版本:

public class Receipt {

  public static void main(String[] args) {
    int firstMealPrice = 38;
    int secondMealPrice = 40;
    int thirdMealPrice = 30;

    double taxMultiplier = 0.08;
    double tipMultiplier = 0.15;

    int mealSubtotalPrice = firstMealPrice + secondMealPrice + thirdMealPrice;
    double mealTax = mealSubtotalPrice * taxMultiplier;
    double mealTip = mealSubtotalPrice * tipMultiplier;

    double mealTotalPrice = mealSubtotalPrice +
        mealTax +
        mealTip;

    print("Subtotal:");
    print(mealSubtotalPrice);
    print("Tax:");
    print(mealTax);
    print("Tip:");
    print(mealTip);
    print("Total:");
    print(mealTotalPrice);

  }

  private static void print(Object obj) {
    System.out.println(obj);
  }
}

我怀疑这节课是在教你如何将计算与显示分开

以下是我认为课程希望您编写的代码

public class Receipt {

    public static void main(String[] args) {
        int subTotal = 38 + 40 + 30;
        double tax = .08 * subTotal;
        double tip = .15 * subTotal;
        double total = subTotal + tax + tip;

        System.out.println("Subtotal:");
        System.out.println(subTotal);
        System.out.println("Tax:");
        System.out.println(tax);
        System.out.println("Tip:");
        System.out.println(tip);
        System.out.println("Total:");
        System.out.println(total);
    }

}
通过创建打印方法来打印值,可以进一步减小代码的大小

public class Receipt {

    public static void main(String[] args) {
        int subTotal = 38 + 40 + 30;
        double tax = .08 * subTotal;
        double tip = .15 * subTotal;
        double total = subTotal + tax + tip;

        printAmount("Subtotal:", subTotal);
        printAmount("Tax:", tax);
        printAmount("Tip:", tip);
        printAmount("Total:", total);
    }

    private static void printAmount(String label, double value) {
        System.out.println(label);
        System.out.println(value);
    }

}

最后,可以使用美元符号格式的值在同一行打印文本和值,但这远远超出了您的课程内容。

我认为您已经搞定了,尽管
(x)
始终等于
x
,因此您可以删除不必要的括号。为了清楚起见,我还将
y
重命名为
tax
,将
z
重命名为
tip
x
y
z
都不是有意义的名称。您可以进一步缩小它,因为您可以分别重复
x*y
x*z
两次。把它们分配给变量,然后用变量代替。我觉得很好。您可以将所有出现的
(x)
替换为
x
。和
x
y
z
到合适的名称(如
tax
tip
)。感谢大家在这方面的帮助!我想知道我是否通过使用我宣布的一些变量来创造更多的冗余,结果证明是的。哈我希望我不是唯一一个一开始很难学习这些东西的人,你们都学得很好!再次感谢大家的帮助!我今天可能会再次陷入困境,并发布另一个问题,但祝你好运。你的思路是对的。就我个人而言,我认为任务的指示是不必要的含糊不清。祝你好运谢谢你!在大家的帮助下,解决了这个问题后,我的解决方案基本上就是这样的。
public class Receipt {

    public static void main(String[] args) {
        int subTotal = 38 + 40 + 30;
        double tax = .08 * subTotal;
        double tip = .15 * subTotal;
        double total = subTotal + tax + tip;

        printAmount("Subtotal:", subTotal);
        printAmount("Tax:", tax);
        printAmount("Tip:", tip);
        printAmount("Total:", total);
    }

    private static void printAmount(String label, double value) {
        System.out.println(label);
        System.out.println(value);
    }

}