Как я могу удалить избыточность из этой проблемы Java, если она существует?

#java

#java

Вопрос:

Я в CS140 и пытаюсь решить проблемы на практике-It. Я не уверен, что еще нужно сделать для решения этой проблемы, чтобы исправить ее. Инструкции таковы: «Следующая программа избыточно повторяет одни и те же выражения много раз. Измените программу, чтобы удалить все избыточные выражения, используя переменные соответствующих типов. » Я только учусь использовать целые числа и борюсь с этим, поэтому я уверен, что мне не хватает чего-то простого. Я опубликовал код в его первоначальном виде ниже, как я пытался его решить. Заранее спасибо за любую помощь! 🙂

 // 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 x=38 40 30;
        double y=.08;
        double z=.15;
        System.out.println("Subtotal:");
        System.out.println(x);
        System.out.println("Tax:");
        System.out.println((x) * y);
        System.out.println("Tip:");
        System.out.println((x) * z);
        System.out.println("Total:");
        System.out.println((x)   (x) * y   (x) * z);
                           
                            

    }
}

  

Исходная проблема приведена ниже.

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

    }
}
  

Комментарии:

1. Я думаю, вы справились с этим, хотя (x) всегда равно x , чтобы вы могли удалить ненужные круглые скобки. Также я бы переименовал y в tax и z tip для ясности. x , y и z не являются значимыми именами.

2. Вы могли бы еще больше уменьшить ее, потому что вы повторяете x * y и x * z дважды каждый. Назначьте их переменным и используйте вместо них переменные.

3. Для меня это нормально. Вы могли бы заменить все вхождения (x) просто x . И x , y и z соответствующим именам (например tax , и tip ).

Ответ №1:

Вы на правильном пути. Очевидно, что вы предназначены для присвоения общих значений переменным, что вы сделали как x и y и z . Обратите внимание, однако, что эти имена переменных не очень описательны — лучшим решением было бы начать с того, что называть эти вещи такими, какие они есть на самом деле subtotal , taxMultiplier и tipMultiplier .

Но обратите внимание, что у вас все еще есть некоторые избыточности. Вы повторяете свой расчет налога дважды — один раз при печати налога, а затем снова при печати итога. Поэтому вы должны присвоить это значение новому double ( tax ). Аналогичный рефакторинг можно выполнить с tip помощью and 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 — это сумма промежуточного итога, налога и чаевых. Из-за числового супа в исходном коде это было действительно трудно увидеть. Кроме того, если значение изменяется (например, промежуточный итог), вам нужно будет изменить его только в одном месте, и соответствующие изменения будут каскадироваться по всему остальному коду.

Комментарии:

1. Спасибо всем за вашу помощь в этом! Мне было интересно, создаю ли я больше избыточности, используя некоторые из переменных, которые я объявил, оказывается, да, я был. Ha. Я надеюсь, что я не единственный, кому поначалу было трудно изучать этот материал, у вас у всех это так хорошо! Еще раз, спасибо всем за вашу помощь! Вероятно, сегодня я снова застряну и задам еще один вопрос, но пальцы скрещены.

2. Вы были на правильном пути. Лично я думал, что инструкции по назначению были излишне расплывчатыми. Удачи!

Ответ №2:

Я подозреваю, что урок учит вас отделять ваши вычисления от вашего отображения.

Вот что, я думаю, урок хотел, чтобы вы написали.

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

}
  

Наконец, можно напечатать текст и значение в одной строке со значением, отформатированным знаком доллара, но пока это выходит далеко за рамки вашего урока.

Комментарии:

1. Спасибо вам за это! После решения проблемы, с помощью всех присутствующих, это в основном то, как выглядело мое решение.

Ответ №3:

Моя версия:

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