当用户输入错误时循环回到上一个问题的问题

问题描述 投票:0回答:1

我正在创建一个非常简单的交互式程序,用户可以在其中选择饮料的类型、配菜及其大小。 该程序可以工作,但我想知道是否有一种更智能的方法可以将所有内容都放在一个 while 循环中。每个用户提示问题都有一个 while 循环的原因是因为我想再次询问上一个问题,直到用户做出一个有效输入。我想不出一种方法可以在一个 while 循环中具有相同的功能。

此外,我的辅助方法似乎也很重复(drinkTypeChecker 方法和 sideTypeChecker 方法)。如果有人可以帮助我以更简洁的方式写作,减少重复,这会对我有很大帮助。

这是java代码:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        boolean drinkTypeChecker = false;
        boolean sizeChecker= false;
        boolean sideTypeChecker = false;

        String drinkType = "";
        String drinkSize = "";
        String sideType = "";
        String sideSize = "";

        Scanner in = new Scanner(System.in);
        System.out.println("Welcome to Bills Burger!");

        while(!drinkTypeChecker) {
            System.out.println("Please select a Drink Type! (Coke, Zero, Sprite, Fanta)");
            drinkType = in.nextLine();
            drinkTypeChecker = drinkTypeChecker(drinkType);
        }
        while(!sizeChecker) {
            System.out.println("Please select a Drink Size! (S, M, L)");
            drinkSize = in.nextLine();
            sizeChecker = sizeChecker(drinkSize);
        }

        while(!sideTypeChecker) {
            System.out.println("Please select a Side Type! (Fries, Salad, Coleslaw)");
            sideType = in.nextLine();
            sideTypeChecker = sideTypeChecker(sideType);
        }

        sizeChecker = false;
        while(!sizeChecker) {
            System.out.println("Please select a Side Size! (S, M, L)");
            sideSize = in.nextLine();
            sizeChecker = sizeChecker(sideSize);
        }

        Drink drink = new Drink(drinkType, drinkSize);
        Side side = new Side(sideType, sideSize);

        System.out.println("Your total price is $" + (drink.getPrice() + side.getPrice()));

        in.close();

    }
    public static boolean drinkTypeChecker(String drinkType) {
        if(drinkType.length() == 0) {
            System.out.printf("ERROR: You have not selected a drink type. Please input a drink type!%n%n%n");
            return false;
        }

        return switch (drinkType.toUpperCase()) {
            case  "COKE", "ZERO", "SPRITE", "FANTA"-> true;
            default -> {
                System.out.printf("ERROR: Invalid Drink Type!%n%n%n");
                yield false;
            }
        };
    }

    public static boolean sideTypeChecker(String type) {
        if(type.length() == 0) {
            System.out.printf("ERROR: You have not selected a side type. Please input a side type!%n%n%n");
            return false;
        }

        return switch (type.toUpperCase()) {
            case  "FRIES", "SALAD", "COLESLAW" -> true;
            default -> {
                System.out.printf("ERROR: Invalid Side Type!%n%n%n");
                yield false;
            }
        };
    }

    public static boolean sizeChecker(String size) {
        return switch (size.toUpperCase()) {
            case "S", "M", "L" -> true;
            default -> {
                System.out.printf("ERROR: Invalid Size!%n%n%n");
                yield false;
            }
        };
    }

}

这里有单独的饮料和副食课程供参考

public class Drink {
    private String type;
    private String size;
    private double price;

    public Drink(String type, String size) {
        this.type = type;
        this.size = size;
    }

    public double getPrice() {
        String size = this.size.toUpperCase();
        return switch (size.toUpperCase()) {
            case "S" -> 0.00;
            case "M" -> 0.50;
            case "L" -> 0.75;
            default -> -1;
        };
    }
}
public class Side {
    private String type;
    private String size;
    private double price;

    public Side(String type, String size) {
        this.type = type;
        this.size = size;
    }

    public double getPrice() {
        String size = this.size.toUpperCase();
        return switch (size.toUpperCase()) {
            case "S" -> 0.00;
            case "M" -> 0.65;
            case "L" -> 0.90;
            default -> -1;
        };
    }
}

该程序已经可以运行,但我想学习使我的代码更简单,减少重复。

java loops interactive
1个回答
0
投票

看起来是使用工厂模式的好机会,您可以在这里查看更多信息:工厂模式。什么时候使用工厂方法?

还可以尝试泛型与工厂实现,这是一个很好的实践:Java 通用工厂模式实现

© www.soinside.com 2019 - 2024. All rights reserved.