オースティンが指摘したように、while ループ ステートメントで ReadLine を 2 回使用しています。
言及する価値のあることの 1 つは、モジュール性のルールに従うようにすることです。これにより、コードの実装とデバッグが高速化されます。
C# プログラミングを久しぶりに行ったので、これを Java スタイルで sudo コーディングしました。
これはコマンド ライン プログラミングであるため、おそらくユーザー入力を複数回検証する必要があります。私がすることの 1 つは、ユーティリティ クラスを作成して、一般的なユーザー入力タスクを含めることです。
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 ですが、ボールが転がるには十分なはずです。
おそらく再考すべきことの 1 つは、トッピングを表すために整数コードを使用することです。列挙型を使用すると、実装が容易になる場合があります。
また、3 つの異なるタイプのピザを追加していることにも気付きました。これは、3 つの別個のオブジェクトであると想定しています。
ピザにトッピングを追加するためにループしているので、ピザの抽象クラスを作成します。このようにして、ペパロニやチーズなどの一般的な事前構築済みのピザを拡張し、顧客に注文をカスタマイズしてもらいたい場合は、抽象的なピザ クラスを使用できます。