当前位置: 代码迷 >> java >> 对控制台输入(命令)做出反应-如何最有效地处理多个选项?
  详细解决方案

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

热度:78   发布时间:2023-07-26 14:02:04.0

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

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

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

我保存在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 -class。 您可以隔离组并验证收到的值。 尽管它不会为您节省异常/错误处理的时间,但它确实对分段和解释工作有很大帮助。

  相关解决方案