我目前正在实现一种基于数学公式构建矩阵模式的算法。为了实现这一点,我在其中使用了深度嵌套的 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/