【问题标题】:How to avoid a loop-switch anti pattern如何避免循环切换反模式
【发布时间】:2013-11-17 21:21:49
【问题描述】:

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

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

在这种情况下如何防止循环切换?有没有为此目的而设计的设计模式?

【问题讨论】:

  • 循环/切换有什么问题?您可以轻松地将 switch/case 语句替换为 if/else 语句
  • 我看不出有什么问题,但我读到它是一种反模式。 en.wikipedia.org/wiki/Loop-switch_sequence
  • 这真的不是一个反模式,只是一个让你上 DailyWTF 的愚蠢的东西。我的意思并不是说使用带有switch 的每个循环构造是错误的,而是在编译时已知的范围内使用forforeachswitch 显然是愚蠢的。
  • @JavaDeveloper:你真的读过那篇文章吗?第二段以it is not necessarily an antipattern to use a switch statement within a loop [...] 开头,然后讨论它不是反模式的情况。它没有特别提到这种用法,但它绝对不会被视为反模式。

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


【解决方案1】:

这不是Loop-Switch Anti-Pattern

反模式发生在使用循环和切换对某些操作进行排序时,这些操作可能只是作为程序中的语句排序(实际上是让处理器的循环切换称为获取执行循环来处理它):

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。

【讨论】:

    【解决方案2】:

    一般来说,您应该考虑将 switch 语句更改为某种委托,因为它将循环和每个正则表达式字符强烈导致的操作的实现耦合在一起。

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

    1. 循环正则表达式/匹配字符串
    2. 处理正则表达式/匹配字符串中给定位置对的字符

    在这种情况下,可以通过将您的正则表达式从哑字符字符串转换为消耗匹配字符串中的 0、1 或 n 个字符的对象列表来实现。然后,您只需使用匹配字符串 + 状态作为每个对象的输入遍历这些对象。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 2015-10-29
      相关资源
      最近更新 更多