我正在编写一个正则表达式解析器,其中一个循环切换反模式似乎是唯一的方法。请忽略实际的解析规则,因为这个解析逻辑只是为内部应用程序定制的,并且不同于常用。
public static boolean match(String regex, String str) {
int i = 0;
int j = 0;
while ((i < regex.length() && j < str.length())) {
switch(regex.charAt(i)) {
case '.' : i++; j++; break;
case '*' : // do something ; break
default : if (regex.charAt(i) != str.charAt(j)) { return false; } else {i++; j++};
}
}
}
在这种情况下如何防止环路开关?是否有任何设计模式用于此目的?
答案 0 :(得分:11)
当使用循环和开关对某些操作进行排序时会发生反模式,这些操作可能只是作为程序中的语句排序(实际上让处理器的循环开关称为fetch-execute循环处理它): / p>
for (step = 0; step < 3; step++) {
switch (step) {
case 0:
do_the_first_thing();
break;
case 1:
do_the_second_thing();
break;
case 2:
do_the_third_thing();
break;
}
}
而不是:
do_the_first_thing();
do_the_second_thing();
do_the_third_thing();
您的代码中没有这样做。您的代码正在处理正则表达式,因此案例可以按表达式内容隐含的任何顺序执行。
在上述反模式中,事实上的顺序步骤隐藏在逻辑之后,似乎准备好处理任何执行顺序;但实际上它不处理任何数据,只处理循环虚拟变量,可预测地从0到2步进。
答案 1 :(得分:0)
通常,您应该考虑将switch语句更改为某种委派,因为它将循环与每个正则表达式字符强制导致的操作的实现相结合。
这将允许你解耦这里发生的两件事:
在这种情况下,可以通过将regexp从一串哑字符转换为从匹配字符串中消耗0,1或n个字符的对象列表来实现。然后,您只需将匹配字符串+ state作为每个对象的输入循环遍历这些对象。
然而!在这种情况下,您的代码非常简单。除非您计划实现更多元字符,否则这可能是最干净,最清晰的实现。