对控制台输入(命令)做出反应-如何最有效地处理多个选项?

时间:2019-03-04 07:23:25

标签: java if-statement switch-statement

一些信息(不想让您混淆很多卑鄙的代码):

我已经完成了一个相当大的控制台程序(到目前为止,这是我最大的项目),它可以帮助我管理一些帐户/资产等。我会不断添加更多功能,但同时我会重塑代码以使用糟糕的 编码风格

控制台程序具有很多 命令 ,用户可以键入,并且对于每个命令,调用不同的方法/创建/操作对象的方式等等。

保存在ArrayList<String>中的

我的 关键字 和我的 命令 具有以下类型: [keyword] [...n more Strings]

设计问题1:

我有一个方法cmdProcessor(String[] arguments)处理用户的输入(命令),而[keyword]始终是第一个参数arguments[0]。这意味着我有大量这种类型的if语句: if(arguments[0].equalsIgnoreCase("keyword") callMethod(argmts);String[] argmts中的其余 自变量[1] ... ... [n]

  • 这是处理此问题的好方法还是我应该使用开关盒?
  • 还是其他(什么?)?将关键字保存在HashMap<String, Method>中会更好吗?

设计问题2:

由输入的 关键字 触发的方法(请参见callMethod(argmts))看起来更加混乱。由于相同的方法可以在String[] argmts中保存不同数量和形式的参数,因此该方法充满了if(argmts.length == ...)来检查长度,并且每个if块都有一堆switch-case选项,这些选项也有很多ifs等等。我经常在 中使用的 最后一个 切换时的默认情况 错误处理 (抛出错误代码并说明模式不匹配的原因,依此类推)。

  • 这好还是有更好的方法?
  • 我考虑过要使用很多子方法,这也会使 我的程序花了很多时间,但可能会提高可读性/概述。这可以吗,或者什么是最好的 在这种情况下的选择(大量的ifs和switch-case)?

由于我想围绕这个程序构建更多的东西,也许我应该现在就开始修复错误的设计,以免为时已晚。 :)

1 个答案:

答案 0 :(得分:1)

关于设计问题1:

我要做的是注册许多处理程序,您可以基于一个公共接口,然后分别实现特定的行为。这很好,因为处理输入的中央方法很苗条,并且初始化时只需要注册一次多个单例。缺点:如果忘记一个,它将无法正常工作。因此,也许您可​​以自动注册它们(反射等)。

除此之外,在这种情况下,地图比列表更好,因为(我认为)您不需要排序。您需要从键到行为的映射,因此映射似乎更好(尽管即使坚持使用列表,即使是很大的一组关键字也可能效率不高)。

关于设计问题2:

如果我是你,我会使用实际的正则表达式模式。看一下java.util.regex.Pattern类。您可以隔离组并验证收到的值。尽管它不会为您节省异常/错误处理的时间,但确实对分段和解释工作有很大帮助。