正如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