如何避免循环切换反模式

时间:2013-11-17 21:21:50

标签: java loops design-patterns switch-statement strategy-pattern

我正在编写一个正则表达式解析器,其中一个循环切换反模式似乎是唯一的方法。请忽略实际的解析规则,因为这个解析逻辑只是为内部应用程序定制的,并且不同于常用。

 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++};
            }
        }     
   }

在这种情况下如何防止环路开关?是否有任何设计模式用于此目的?

2 个答案:

答案 0 :(得分:11)

这不是Loop-Switch Anti-Pattern

当使用循环和开关对某些操作进行排序时会发生反模式,这些操作可能只是作为程序中的语句排序(实际上让处理器的循环开关称为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语句更改为某种委派,因为它将循环与每个正则表达式字符强制导致的操作的实现相结合。

这将允许你解耦这里发生的两件事:

  1. 循环使用正则表达式/匹配字符串
  2. 处理regexp / match string中给定位置对的字符
  3. 在这种情况下,可以通过将regexp从一串哑字符转换为从匹配字符串中消耗0,1或n个字符的对象列表来实现。然后,您只需将匹配字符串+ state作为每个对象的输入循环遍历这些对象。

    然而!在这种情况下,您的代码非常简单。除非您计划实现更多元字符,否则这可能是最干净,最清晰的实现。