java - 对控制台输入(命令)使用react - 如何最有效地处理多个选项?

标签 java if-statement switch-statement

一些信息(不想用大量糟糕的代码让您感到困惑):

我已经完成了一个相当大的控制台程序(迄今为止我最大的项目),这对我管理一些帐户/ Assets 等有很大帮助。我不断添加更多功能,但同时我 reshape 代码以适应我糟糕的编码风格

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

我的关键字保存在 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]是。

  • 这是处理这个问题的好方法还是我应该使用 switch-case?
  • 或者其他什么(什么?)?将关键字保存在 HashMap<String, Method> 中是否更好?

设计问题 2:

由输入的关键字触发的方法(参见上文 callMethod(argmts) )看起来更加困惑。由于相同的方法可以在 String[] argmts 中保存不同数量和形式的参数。该方法充满了 if(argmts.length == ...)检查长度,每个 if block 都有一堆 switch-case 选项,其中还有很多 if 等等。我总是使用 last elseswitch-case 中的default-case错误处理(抛出错误代码并解释模式不匹配的原因等等)。

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

既然我想围绕这个程序构建越来越多的东西,也许我应该现在就开始修复糟糕的设计,以免为时已晚。 :)

最佳答案

关于设计问题 1:

我的做法是注册许多处理程序,您可以基于通用接口(interface),然后单独实现特定行为。这很好,因为处理输入的中央方法很精简,并且您只需要在初始化时注册一次大量单例。缺点:如果忘记了,就不行了。所以也许,您可以自动注册它们(反射或类似的东西)。

除此之外,在这种情况下, map 比列表更好,因为(我假设)您不需要排序。您需要从键到行为的映射,因此映射似乎更好(尽管如果您坚持使用列表,即使是非常大的关键字集也可能不会非常低效)。

关于设计问题2:

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

关于java - 对控制台输入(命令)使用react - 如何最有效地处理多个选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54978385/

相关文章:

java - OpenMPI:MPI.Init 卡在 Java 中 - 如何调试?

java - 如何使用 commons-fileupload 编写单元测试?

r - 如果语句在 Shiny 中不起作用

Swift switch case 语句可以有多个参数吗?

java - DO.. WHILE.. 使用 SWITCH 菜单

swift - 如何在 swift 中在两个以上 View 之间切换

java - 如何编写 HQL Insert 查询?

java - 如何将对主 Activity 的引用传递到每个后续 Activity 的构造函数中

javascript - 制作一个复选框并检查是否已选中

c - IF 语句参数更新和函数调用