这个问题不是专门关于使用正则表达式执行标记化的,而是关于如何匹配适当类型的对象(或对象的适当构造函数)以处理标记器输出的标记。
为了解释更多,我的目标是将包含标记行的文本文件解析为描述数据的适当对象。我的解析器实际上已经完成了,但目前是一堆switch
...case
语句,我的问题的重点是如何使用一个好的 OO 方法来重构它。
首先,这里有一个例子来说明我在做什么。想象一个包含许多条目的文本文件,如下两个:
cat 50 100 "abc"
dog 40 "foo" "bar" 90
在解析文件的这两个特定行时,我需要分别创建类Cat
和实例Dog
。实际上,有大量不同的对象类型被描述,有时参数数量的不同变化,如果值不存在以明确说明它们,则通常假定默认值(这意味着通常适合使用构建器创建对象时的模式,或者某些类有多个构造函数)。
每行的初始标记化是使用Tokenizer
我创建的一个类完成的,该类使用与每种可能的标记(整数、字符串和与此应用程序相关的一些其他特殊标记类型)匹配的正则表达式组以及Pattern
和Matcher
。这个标记器类的最终结果是,对于它解析的每一行,它都会返回一个Token
对象列表,其中每个对象Token
都有一个.type
属性(指定整数、字符串等)以及原始值属性。
对于解析的每一行,我必须:
switch
...case
关于对象类型(第一个标记);switch
关于参数的数量并为该数量的参数选择适当的构造函数;- 检查每个标记类型是否适合构造对象所需的参数类型;
- 如果参数类型的数量或组合不适合所调用的对象类型,则记录错误。
我目前拥有的解析器有很多switch
/case
或if
/else
到处都可以处理这个问题,虽然它可以工作,但有相当多的对象类型,它变得有点笨拙。
有人可以建议一种替代、更清洁和更“面向对象”的模式将标记列表与适当的方法调用匹配吗?