Java:重构嵌套循环

标签 java refactoring

我目前正在实现一种基于数学公式构建矩阵模式的算法。为了实现这一点,我在其中使用了深度嵌套的 for 循环和大量 if 条件。问题是,我不能在不提供大量参数的情况下将循环拆分为多个方法。现在代码看起来像一个不需要的意大利面条代码。

这是一个小的伪示例:

int steps = 10;

void evaluate( int numOuterArea , int numInnerArea , int[] solution , int[] factor , int[] indices )
{
  int counterA = 0;
  int counterB = 0;

  for( int outerAreaIter = 0 ; outerAreaIter < numOuterArea ; outerAreaIter++ )
  {
    for( int curOuterAreaIter = 0 ; curOuterAreaIter < steps ; curOuterAreaIter++ )
    {
      for( int innerAreaIter = 0 ; innerAreaIter < numInnerArea ; innerAreaIter++ )
      {
        for( int curInnerAreaIter = 0 ; curInnerAreaIter < curOuterAreaIter ; curInnerAreaIter++ )
        {
          if( curInnerAreaIter == curOuterAreaIter )
          {
            // do something with solution, factor or indices
          }
          else if( /* some other fancy condition */)
          {

          }
          ...
        }
      }
    }
  }

  // similar nested loops follow here
}

如果我要为每个循环或循环的一部分编写类/方法,我必须提供来自 evaluate() 的所有参数(如示例所示,可以更多)并且还所有先前的迭代器和可能的变量。

是否有一种方法/常见做法/任何提示或建议以更好的方式重写此类代码?

最佳答案

最简单的方法是将所有参数封装在单个对象中。您可以使用此对象将数据作为唯一参数传递给评估方法。像这个例子:

class EvaluationContext {
    int numOuterArea;
    int numInnerArea;
    int[] solution;
    int[] factor;
    int[] indices;
}

interface Evaluator {
    void evaluate(EvaluationContext ctx); 
}

class FirstEvaluator implements Evaluator {
    void evaluate(EvaluationContext ctx) {
        SecondEvaluator e2 = new SecondEvaluator(); 
        for (...) {
            e2.evaluate(ctx);
        }
    }
}

class SecondEvaluator implements Evaluator {
    void evaluate(EvaluationContext ctx) {
        // evaluate something and put result into context
    }
}

关于Java:重构嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25400129/

相关文章:

java - 预加载图像以用作 JLabel 图标

java - 太阳路径的计算

java - 如何在 IntelliJ IDEA 中忽略 "navigate to class"上的某些包

java - 非法参数异常 : Jetty ALPN/NPN has not been properly configured

crash - Visual Studio 2015在重命名时崩溃

java - 如何消除类似方法中重复的try-catch代码?

java - 如何通过 Maven 在 Servlet 应用程序中使用 Java 日志记录 API

python - 在Python中重命名类变量而不使用self

asp.net - 有什么实用工具可以帮助我重构 CSS

c++ - 用 C++ 中的函数调用替换强制转换