来自程序背景,我在设计基于菜单的控制台应用程序和用户输入验证时遇到了一个概念块。我的目标是显示一个启动其他进程的菜单。我想在菜单上将用户输入限制为 1、2 或 3。
在程序语言中,我会做这样的伪代码:
10 print "Make a choice"
20 choice = [dataFromKeyboard]
30 if choice < 4 && choice > 0
40 then 10
50 else 60
60 process valid choices
而且无论我尝试什么,在设计 OO 程序时我都无法忘记这一点。考虑(简化为仅包括 3 个菜单项):
class Menu
{
public static void Main(String[] args)
{
DisplayMenu thisdm = new DisplayMenu;
int menuChoice = thisdm.displayMenu();
ProcessMenu thispm = new ProcessMenu();
thispm.processMenu(menuChoice);
}
}
class DisplayMenu
{
public int displayMenu()
{
Console.WriteLine("1 - foo3");
Console.WriteLine("2 - foo2");
Console.WriteLine("3 - foo3");
Console.WriteLine("choose");
String choice = Console.ReadLine();
int intChoice = Convert.ToInt32(choice);
return intChoice;
}
}
class ProcessMenu
{
public void processMenu(int choice)
{
switch(choice)
{
case 1:
foo1();
break;
case 2:
foo2();
break;
case 3:
foo3();;
break;
default:
Console.WriteLine("Invalid selection. Please select 1, 2, or 3.");
break;
}
}
}
所以这就是我卡住的地方。我只是无法用一种简单而优雅的方式来验证我的用户输入,这是从 OO 而不是程序的角度来看的。
假设我在 中进行验证DisplayMenu
,我将在读取输入后进行验证。但如果结果无效,我该如何重新请求有效输入,因为我已经调用了displayMenu
方法 from Main
?
我已经玩while
了大约一个小时的循环,像这样:
intChoice = 0;
[print the menu]
while ((intChoice<1) || (intChoice>3))
Console.WriteLine("Please make a valid choice from the menu");
choice = Console.ReadLine();
etc.
但似乎找不到我可以控制用户输入的最佳位置。
我怀疑这是因为我在程序上思考,而不是足够面向对象。有人有任何提示或意见可以帮助我解决这个问题吗?