验证字符串与多个模式的最佳方法

6

这是一个关于最佳实践/设计模式的问题,而不是正则表达式。

简而言之,我有三个值:起始点、终点和我想要改变的值。起始点必须匹配多种模式之一:

XX.X
>XX.X
>=XX.X
<XX.X
<=XX.X
XX.X-XX.X

其中From必须是一个十进制数。根据给定的From值,我必须检查要更改的值是否满足From条件。例如,用户输入“From:>100.00 To:150.00”表示每个大于100.00的值都应该更改。

正则表达式本身不是问题。问题在于,如果我将整个From与一个正则表达式匹配,并且它通过了,我仍然需要检查输入了哪个选项 - 这将在我的代码中生成至少5个IF语句,每次我想添加另一个选项时,都需要添加另一个IF语句 - 不好。同样的事情如果我创建5个模式。

现在我有一个HashMap,它将模式作为键,ValueMatcher作为值。当用户输入From值时,我会在循环中将其与该映射中的每个键进行匹配,如果匹配,则使用相应的ValueMatcher来实际检查我要更改的值是否满足“ From”值。

与此方法相反,我需要拥有一个包含所有可能性的HashMap,一个ValueMatcher接口和5个实现,每个实现只有1个短的“matches”方法。我认为这比IF语句好,但看起来仍然像是一个夸张的解决方案。

还有其他方法可以做到这一点吗?还是这就是我应该做的方式?我真的很遗憾我们不能在HashMap /将它们作为参数传递中保存方法,因为那样我只需要一个类中的所有匹配方法,并将它们存储在HashMap中。


我自己遇到了类似的情况并使用了HashMap。但我希望Java能够支持一级函数。 - Poindexter
2个回答

2
如何使用责任链模式?
每个ValueMatcher对象都有一个From/To规则和对责任链中下一个ValueMatcher的引用。每个ValueMatcher都有一个方法,检查候选项并将其转换或传递给链中的下一个对象。
这样添加新规则就变得非常容易,并且控制代码只需将候选项传递给链的第一个成员即可。

嗯,但这不是和我代码中的5个IF一样吗?我的意思是,首先我必须使用第一个ValueMatcher并检查From值是否与其匹配,这将是第一个if,然后我必须继续下一个Matcher等等。每个匹配器都意味着1个if。我想我的解决方案也是一堆“ifs”,但作为HashMap“隐藏”起来了。 - Mateusz Dymczyk
将会有相同数量的if语句,但它们以非常规律的方式出现,每个ValueMatcher都是“如果(对我而言)执行,否则传递”。你不会最终得到一个越来越多的if语句堆积。由于您的规则并不完全规则化,我看不到除了具体的if语句之外还有其他选择,我们只需要以一些清晰的方式对它们进行结构化。 - djna

0
一个ValueMatcher接口和5个实现,每个实现只有一个短的“matches”方法。我认为这肯定比IF语句更好,但仍然看起来像是一个夸张的解决方案。
嗯,对于像评估数字与运算符和限制值之间的关系这样简单的事情,你不仅可以编写一个稍微通用一些的ValueMatcher,它具有限制值和运算符作为其参数,而且还可以很容易地添加5个此类ValueMatcher实例,其中包括几个组合,如>、>=等。
编辑:删除非Java内容...对此感到抱歉。

1
我希望我能够 - 不幸的是,Java没有提供委托。可能实现类似功能的唯一方法是使用反射,但我真的不想这样做。 - Mateusz Dymczyk
我认为我可以,但首先我必须检查输入的选项,并根据此获取相应的运算符和值(有些选项只有1个值,有些选项有2个)。不太清楚我如何在没有if语句的情况下完成它。 - Mateusz Dymczyk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接