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

问题描述 投票:0回答:1

一些信息(不想让你混淆很多糟糕的代码):

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

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

我的关键字保存在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-blocks都有一堆switch-case选项,这些选项也有很多ifs等等。上。在switch-case中的最后一个else和default-case我总是用于错误处理(抛出错误代码和解释为什么模式不匹配等等)。

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

由于我想围绕这个程序建立越来越多,也许我现在应该开始修复糟糕的设计,为时已晚。 :)

java if-statement switch-statement
1个回答
1
投票

关于设计问题1:

我的目标是注册许多处理程序,您可以基于通用接口,然后单独实现特定的行为。这很好,因为处理输入的中心方法很小,而且在初始化时只需要注册很多单例。缺点:如果你忘了一个,它将无法正常工作。也许,你可以自动注册它们(反射或类似的东西)。

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

关于设计问题2:

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

© www.soinside.com 2019 - 2024. All rights reserved.