当程序从控制台获取命令时,验证命令是否有效并执行它的标准/最佳实践是什么?
我在想类似 HashMap<String,Object>
的东西但这不会降低所有字符串比较的性能吗?
最佳答案
首先,不用担心性能。这个时间会稍后到来(或者更可能根本不会到来)。解析命令不会比执行命令花费更多时间,不是吗?
对于处理命令:首先,您应该将输入拆分为原子标记。这些可能是命令本身、开关 -a -b -c 或参数值,有时可能位于“”之间。
将输入拆分为标记后,验证该命令是否存在。如果是,请检查 token 供应是否对该命令有效。
不知道你想用什么样的架构。有时人们对一个命令使用一个类,有时有一个类和很多方法,有时有一个方法有一个非常长的情况。哪个最适合您?可能不是最后一个,但无论您选择什么,都应该与命令及其工作的复杂性相匹配。
示例1:
abstract class Command {
public abstract String getName();
public abstract int execute(String[] parameters); // not implemented in Cmd* below
}
class Cmd1 extends Command {
public String getName()
{
return "Cmd1";
}
}
class Cmd2 extends Command {
public String getName()
{
return "Cmd2";
}
}
//somewhere else:
public void execute(String[] params) {
Command[] commands = {new Cmd1(), new Cmd2()};
for (Command cmd: commands) {
if (cmd.getName().equals(params[0]) {
cmd.execute(params);
return;
}
}
throw new RuntimeException("unknown command "+params[0]);
}
示例2:
void processCmd1(String[] params);
void processCmd2(String[] params);
public static final String CMD1 = "cmd1";
public static final String CMD2 = "cmd2";
static HashSet<String> availableCommands = new HashSet<String>();
static {
availableCommands.put(CMD1);
availableCommands.put(CMD2);
}
{
if (availableCommands.contains(params[0])) {
switch(params[0]) { // java 7
case CMD1:
processCmd1(params[0]);
break;
case CMD2:
processCmd2(params[0]);
break;
}
} else {
throw new RuntimeException("unknown command "+params[0]);
}
}
示例3:
abstract class Command {
public abstract String getName();
public abstract int execute(String[] parameters); // not implemented in Cmd* below
}
class Cmd1 extends Command {
public String getName()
{
return "Cmd1";
}
}
class Cmd2 extends Command {
public String getName()
{
return "Cmd2";
}
}
static HashMap<String,Command> commandMap = new HashMap<String,Command>();
static {
Command cmd = new Cmd1();
commandMap.put(cmd.getName(), cmd);
cmd = new Cmd2();
commandMap.put(cmd.getName(), cmd);
}
//somewhere else:
public void execute(String[] params) {
Command cmd = commandMap.get(params[0]);
if (cmd == null) {
throw new RuntimeException("unknown command "+params[0]);
} else {
cmd.execute(params);
}
}
关于java - 验证来自控制台的用户输入。命令是否有效等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14333377/