与正则表达式相比,这是一个关于最佳实践/设计模式的问题。
简而言之,我有 3 个值:从、到和我要更改的值。 From 必须匹配以下几种模式之一:
XX.X
>XX.X
>=XX.X
<XX.X
<=XX.X
XX.X-XX.X
而 To 必须是十进制数。根据 From 中给出的值,我必须检查我要更改的值是否满足 From 条件。例如,用户输入“From: >100.00 To: 150.00”意味着应该更改每个大于 100.00 的值。
正则表达式本身不是问题。问题是,如果我将整个 From 与一个正则表达式匹配并且它通过了,我仍然需要检查输入了哪个选项——这将在我的代码中生成至少 5 个 IF,每次我想添加另一个选项时,我都需要添加另一个如果 - 不酷。如果我要创建 5 个模式,也是一样。
现在我有一个 HashMap,它包含一个模式作为键和一个 ValueMatcher 作为值。当用户输入 From 值时,我会在循环中将其与该映射中的每个键进行匹配,如果它匹配,则我会使用相应的 ValueMatcher 实际检查我要更改的值是否满足“From”值。
另一方面,这种方法要求我拥有一个包含所有可能性的 HashMap、一个 ValueMatcher 接口(interface)和 5 个实现,每个实现只有一个简短的“匹配”方法。我认为它肯定比 IF 更好,但看起来仍然是一个夸张的解决方案。
还有其他方法吗?或者这是我实际上应该怎么做?我真的很遗憾我们不能在 HashMap 中保存方法/将它们作为参数传递,因为那样我只有 1 个类和所有匹配的方法并将它们存储在 HashMap 中。
最佳答案
责任链怎么样。
每个 ValueMatcher 对象只有一个 From/To 规则和对链中下一个 ValueMatcher 的引用。每个 ValueMatcher 都有一个方法来检查候选者并将其转换或传递给链中的下一个。
通过这种方式添加新规则是一个微不足道的扩展,控制代码只是将候选者传递给链中的第一个成员。
关于java - 针对多种模式验证字符串的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7162340/