Калькулятор цен на автомобили

Я пишу эту простую программу для школы, и использование NumberFormat для всех переменных кажется очень повторяющимся (обратите внимание, что нас попросили использовать NumberFormat метод). Есть ли способ очистить этот код, чтобы он не выглядел таким загроможденным?

import java.util.Scanner;
import java.text.NumberFormat;

public class CarPrice {

    public static void main(String[] args) {

        double priceInitial;
        double HST;
        double PDI_CHARGE = 0.02;

        String makeModel;

        Scanner scan = new Scanner(System.in);

        System.out.print("makeModel?: ");
        makeModel = scan.nextLine().toUpperCase();

        do {
            System.out.print("Price?: ");
            priceInitial = scan.nextDouble();
            if (priceInitial < 0) {
                System.out.println("Enter A Value  Above 0");
            } else {
                System.out.println(priceInitial);
                break;
            }
        } while (true);

        do {
            System.out.print("HST?: ");
            HST = scan.nextDouble();
            if (HST < 0) {
                System.out.println("Enter A Value  Above 0");
            } else {
                System.out.println(HST);
                break;
            }
        } while (true);

        double tax = priceInitial * (HST / 100) + priceInitial;

        double PDI = (tax + priceInitial) * PDI_CHARGE;
        double AfterPDI = PDI + tax;

        String PDI_Print = NumberFormat.getCurrencyInstance().format(PDI);
        String tax_Print = NumberFormat.getCurrencyInstance().format(tax);
        String priceInitial_Print = NumberFormat.getCurrencyInstance().format(priceInitial);
        String tax_Amount = NumberFormat.getPercentInstance().format(HST / 100);
        String AfterPDI_Print = NumberFormat.getCurrencyInstance().format(AfterPDI);

        System.out.println("Congrats! Your " + makeModel + " is " + priceInitial_Print +
                "n Your total after " + tax_Amount + " HST is " + tax_Print +
                "n with a PDI fee of " + PDI_Print +
                "n making your total " + AfterPDI_Print);


    }


}

1 ответ
1

Самый важный подход к сокращению дублирования кода — поместить повторяющийся код в параметризованный метод. Если вы используете интегрированная среда развития (IDE) как eclipse, IntelliJ или им подобные, у них есть автоматический рефакторинг чтобы помочь вам в этом. (посмотрите онлайн-справку своей IDE, как ее вызвать).

Вот как я делаю это шаг за шагом

Первым шагом является выявление дублированных частей. В вашем случае два while/do петли — первые кандидаты. Они есть похожий это означает, что есть разные переменные и литералы. Нам нужно заставить их смотреть тоже самое так что мы можем заменить их все вызовом нового метода, который будет создан.

  1. Чтобы сделать это, нам нужно предоставить уникальную область видимости переменных для обеих частей. Это делается заключением каждой петли в фигурные скобки. {}

     {
         do {
             System.out.print("Price?: ");
             priceInitial = scan.nextDouble();
             if (priceInitial < 0) {
                 System.out.println("Enter A Value  Above 0");
             } else {
                 System.out.println(priceInitial);
                 break;
             }
         } while (true);
     }
     {
         do {
             System.out.print("HST?: ");
             HST = scan.nextDouble();
             if (HST < 0) {
                 System.out.println("Enter A Value  Above 0");
             } else {
                 System.out.println(HST);
                 break;
             }
         } while (true);
     }
    
  2. Внутри фигурных скобок мы объявляем и используем новые переменные с одинаковыми именами в обоих местах. (важно, чтобы новые переменные объявлен в каждом блоке индивидуально и не используется повторно в нижнем блоке!):

     {
         String message = "Price?: ";
         double userInput = 0;
         do {
             System.out.print(message);
             userInput = scan.nextDouble();
             if (userInput < 0) {
                 System.out.println("Enter A Value  Above 0");
             } else {
                 System.out.println(userInput);
                 break;
             }
         } while (true);
         priceInitial = userInput;
     }
     {
         String message = "HST?: ";
         double userInput = 0;
         do {
             System.out.print(message);
             userInput = scan.nextDouble();
             if (userInput < 0) {
                 System.out.println("Enter A Value  Above 0");
             } else {
                 System.out.println(userInput);
                 break;
             }
         } while (true);
         HST = userInput;
     }
    
  3. Теперь мы выделяем все линии в первой части, которые выглядят точно так же, как и во второй части. Затем вы можете применить метод извлечения рефакторинг IDE. Результат должен выглядеть так:

     {
         String message = "Price?: ";
         // replaces by the IDE
         double userInput = extracted(scan, message);
         priceInitial = userInput;
     }
    
    
      // new method created by the IDE behind main()
     private static double extracted(Scanner scan, String message) {
         double userInput = 0;
         do {
             System.out.print(message);
             userInput = scan.nextDouble();
             if (userInput < 0) {
                 System.out.println("Enter A Value  Above 0");
             } else {
                 System.out.println(userInput);
                 break;
             }
         } while (true);
         return userInput;
     }
    

    Конечно, вы должны дать ему лучшее имя, чем то, что предлагает IDE.

    • Если ваша IDE не заменила другое вхождение выбранного кода, вы копируете вызов метода из первого блока в другой и удаляете устаревший код:

        {
            String message = "Price?: ";
            double userInput = extracted(scan, message);
            priceInitial = userInput;
        }
        {
            String message = "HST?: ";
            double userInput = extracted(scan, message);
            HST = userInput;
        }
      
  4. Затем вставьте новые переменные в оба блока

     {
         priceInitial = extracted(scan, "Price?: ");
     }
     {
         HST = extracted(scan, "HST?: ");
     }
    
  5. И, наконец, удалите блоки.

     priceInitial = extracted(scan, "Price?: ");
     HST = extracted(scan, "HST?: ");
    

Почему я предлагаю этот довольно сложный подход?

  • Каждый отдельный шаг — это очень небольшое изменение в вашем коде.
  • Вам не нужно думать о подписи нового метода, кроме того, чтобы дать ему хорошее имя.
  • После каждого шага вы можете скомпилировать и запустить код, чтобы проверить, продолжает ли он делать то, что должен. (имея Модульный тест будет кстати …)

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *