我已经完成了一个相当大的控制台程序(到目前为止,这是我最大的项目),它可以帮助我管理一些帐户/资产等。我会不断添加更多功能,但同时我会重塑代码以使用糟糕的 编码风格 。
控制台程序具有很多 命令 ,用户可以键入,并且对于每个命令,调用不同的方法/创建/操作对象的方式等等。
保存在ArrayList<String>
中的我的 关键字 和我的 命令 具有以下类型: [keyword] [...n more Strings]
我有一个方法cmdProcessor(String[] arguments)
处理用户的输入(命令),而[keyword]
始终是第一个参数arguments[0]
。这意味着我有大量这种类型的if语句:
if(arguments[0].equalsIgnoreCase("keyword") callMethod(argmts);
在String[] argmts
中的其余 自变量[1] ... ... [n] 是
HashMap<String, Method>
中会更好吗?由输入的 关键字 触发的方法(请参见callMethod(argmts)
)看起来更加混乱。由于相同的方法可以在String[] argmts
中保存不同数量和形式的参数,因此该方法充满了if(argmts.length == ...)
来检查长度,并且每个if块都有一堆switch-case选项,这些选项也有很多ifs等等。我经常在 中使用的 最后一个 和 切换时的默认情况 错误处理 (抛出错误代码并说明模式不匹配的原因,依此类推)。
由于我想围绕这个程序构建更多的东西,也许我应该现在就开始修复错误的设计,以免为时已晚。 :)
答案 0 :(得分:1)
关于设计问题1:
我要做的是注册许多处理程序,您可以基于一个公共接口,然后分别实现特定的行为。这很好,因为处理输入的中央方法很苗条,并且初始化时只需要注册一次多个单例。缺点:如果忘记一个,它将无法正常工作。因此,也许您可以自动注册它们(反射等)。
除此之外,在这种情况下,地图比列表更好,因为(我认为)您不需要排序。您需要从键到行为的映射,因此映射似乎更好(尽管即使坚持使用列表,即使是很大的一组关键字也可能效率不高)。
关于设计问题2:
如果我是你,我会使用实际的正则表达式模式。看一下java.util.regex.Pattern
类。您可以隔离组并验证收到的值。尽管它不会为您节省异常/错误处理的时间,但确实对分段和解释工作有很大帮助。