java - 验证来自控制台的用户输入。命令是否有效等

标签 java design-patterns data-structures io console

当程序从控制台获取命令时,验证命令是否有效并执行它的标准/最佳实践是什么?
我在想类似 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/

相关文章:

java - Sea Glass 外观和感觉错误

java - Jetty websocket客户端类WebSocketClient线程安全吗?

asp.net-mvc - ASP.NET MVC : Best practice or design pattern for getting the DTO/EditModel into the Database

java - 处理控制台命令的最佳 Java 设计模式

C 结构 - 合法成员?

python - 使用 python 的类型库指定不止一种可能的类型

java - 与 FileNet 内容引擎交互的 Web 服务中的 JAAS 授权

java - 相同的查询在 MySQL 中工作,而不在 Java 客户端中工作

javascript - 有没有关于如何组织 JavaScript 代码的好例子?

c - 使用 fwrite 将结构体指针写入文件