一些信息(不想让您与很多卑鄙的代码混淆):
我已经完成了一个相当大的控制台程序(到目前为止,这是我最大的项目),它可以帮助我管理一些帐户/资产等。我不断添加更多功能,但同时我重塑了代码以适应我糟糕的编码风格。
控制台程序具有许多用户可以键入的命令,并且对于每个命令,调用不同的方法/创建/操作对象的方法等等。
我保存在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:
我要做的就是注册许多处理程序,您可以基于一个公共接口,然后分别实现特定的行为。这很好,因为处理输入的中央方法很苗条,并且初始化时只需要注册一次多个单例。缺点:如果忘记一个,它将无法正常工作。因此,也许您可以自动注册它们(反射等)。
除此之外,在这种情况下,地图比列表更好,因为(我假设)您不需要排序。您需要从键到行为的映射,因此映射似乎更好(尽管即使坚持使用列表,即使是非常大的关键字集也可能效率不高)。
关于设计问题2:
如果我是你,我会使用实际的正则表达式模式。看一下java.util.regex.Pattern
类。您可以隔离组并验证收到的值。尽管它不会为您节省异常/错误处理的时间,但它确实对分段和解释工作有很大帮助。
关于java - 对控制台输入(命令)使用react-如何最有效地处理多个选项?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54978385/