正如Austin刚刚指出的,您在while循环语句中使用了两次ReadLine。
有一点值得一提的是试图遵循模块化的规则,这将有助于加快实施和调试我们的代码。
自从我做了任何C#编程,所以sudo编码这种Java风格已经有一段时间了。
由于它是命令行编程,您可能必须多次验证用户输入。我要做的一件事是让工具类包含常见的用户输入任务。
public class TerminalUtil {
private TerminalUtil() {}
public static boolean isYes(String msg){ return (msg.ToUpper() == "Y" || msg.ToUpper() == "YES"); }
public static boolean isNo(String msg){ return (msg.ToUpper() == "N" || msg.ToUpper() == "NO"); }
// You also might want basic conditionals to check if string is numeric or contains letters.
// I like using recursion for command line utilities so having a method that can re-print messages is handy
public static void display(String[] messages){
for(String msg : messages){
Console.WriteLine(msg);
}
}
public static boolean enterYesOrNo(String[] messages, String[] errorMessages){
display(messages)
String input = Console.ReadLine();
if(isYes(input)){
return true;
} else if(isNo(input)){
return false;
} else {
display(errorMessages); // Maybe something like, you didn't enter a yes or no value.
enterYesOrNo(messages, errorMessages); // Recursive loop to try again.
}
}
}
下面是代码来订购比萨饼可能是什么样子
public class OrderPizza{
public static int selectToppings(){
String[] message = new String[4];
message[0] = ("\nSelect additional topping/s\n");
message[1] = ("1 - Extra meat: 200");
message[2] = ("2 - Extra cheese: 100");
message[3] = ("3 - Extra veggies: 80\n");
int option = TerminalUtils.entryNumeric(message, {"You entered an non-numeric character, try again"});
if(option > 0 && option <= 3){
return option;
} else {
Console.WriteLine("Number must be between 1 - 3, try again.");
return selectToppings();
}
}
public static Pizza order(){
Pizza pizza = new Pizza();
while(true){
int toppingCode = selectTopping();
pizza.addTopping(toppingCode);
if(!TerminalUtil.enterYesOrNo({"\nAdd more toppings? Y/N"}, {"Please enter a 'Y'es or 'N'o"})){
break;
}
}
}
}
这样做的主要好处是,while循环的业务逻辑已经减少,那么你可以在重用代码TerminalUtils。这并不意味着一个优雅的解决方案,我很懒,这是凌晨3点的IRL,但它应该足以让球滚动。
你应该重新考虑做的一件事是使用整数代码来表示浇头。使用枚举可能会使事情更容易实现。
我还注意到,您添加了三种不同类型的比萨,我假设三个不同的对象。
由于您正在循环添加配料到披萨,因此需要制作一个抽象类的披萨。通过这种方式,您可以扩展通用的预制比萨饼,如意大利辣香肠或奶酪,如果您想要客户定制他们的订单,则可以使用抽象比萨类。
来源
2013-01-15 07:49:53
Dan
应该不是你的'Pizza'类有一个'addToppings()'方法或浇头的可公开访问的列表?也许我今天没有足够的咖啡,但是你的代码对我来说似乎没有意义。 – dreamlax
它不起作用? – DWright
请记住,每次调用Console.ReadLine()时,程序都会等待用户写入内容并按Enter键。你有两次,所以为了继续,用户必须先输入Y并按下回车键,然后输入y并按下回车键。提拉克的答案提供了一个简单的方法来做到这一点(你也可以投到更低的水平)。 – MasterMastic