一些信息(不想用大量糟糕的代码让您感到困惑):
我已经完成了一个相当大的控制台程序(迄今为止我最大的项目),这对我管理一些帐户/ 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 else 和 switch-case 中的default-case错误处理(抛出错误代码并解释模式不匹配的原因等等)。
- 这好吗?还有更好的方法吗?
- 我考虑过使用很多子方法,这也会导致崩溃 我的程序花费了大量时间,但也许可以提高可读性/概述。这样可以吗,或者什么是最好的 在这种情况下的选项(大量的 if 和 switch-case)?
既然我想围绕这个程序构建越来越多的东西,也许我应该现在就开始修复糟糕的设计,以免为时已晚。 :)
最佳答案
关于设计问题 1:
我的做法是注册许多处理程序,您可以基于通用接口(interface),然后单独实现特定行为。这很好,因为处理输入的中央方法很精简,并且您只需要在初始化时注册一次大量单例。缺点:如果忘记了,就不行了。所以也许,您可以自动注册它们(反射或类似的东西)。
除此之外,在这种情况下, map 比列表更好,因为(我假设)您不需要排序。您需要从键到行为的映射,因此映射似乎更好(尽管如果您坚持使用列表,即使是非常大的关键字集也可能不会非常低效)。
关于设计问题2:
如果我是你,我会使用实际的正则表达式模式。看一下 java.util.regex.Pattern
类。您可以隔离组并验证您收到的值。虽然它不能免除您的异常/错误处理,但它确实对分段和解释工作有很大帮助。
关于java - 对控制台输入(命令)使用react - 如何最有效地处理多个选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54978385/