3

假设我有一个稍微复杂的 for 循环,用于不同的情况。有没有办法提取那个forloop并且仍然保持代码可读?

例如:

private function bar(){
    for(i=0;i<arrayA.length;i++){
       if(arrayA[i].someVar == foobar){
         doSomethingA();
       }
    }
}
private function foo(){
    for(i=0;i<arrayA.length;i++){
       if(arrayA[i].someVar == foobar){
         doSomethingB();
       }
    }
}

我会这样做/回答问题的方式是写这样的东西:

private function loopFunction(callback:Function){
        for(i=0;i<arrayA.length;i++){
           if(arrayA[i].someVar == foobar){
             callback();
           }
        }
    }
  private function bar(){
       loopFunction(doSomethingA);
  }
  private function foo(){
       loopFunction(doSomethingB);
   }

但是我发现这种方法有时会使代码变得难以阅读,因为您不太确定谁在什么时候做什么。特别是如果传入的函数来自另一个类。有一个更好的方法吗?

此解决方案可能不起作用的另一个原因是您是否需要将不同的参数传递给回调函数。例如。

private function bar(){
        for(i=0;i<arrayA.length;i++){
           if(arrayA[i].someVar == foobar){
             doSomethingA(arrayA);
           }
        }
    }
    private function foo(){
        for(i=0;i<arrayA.length;i++){
           if(arrayA[i].someVar == foobar){
             doSomethingB(i);
           }
        }
    }
4

2 回答 2

2

正如其他人指出的那样,高阶函数map,foldfilter提供这种功能。当然,精确的实现会因语言而异。

这是 C# 中的示例:

var foobarList = arrayA.Where(x => x.someVar == foobar).ToList();
foobarList.ForEach(x => doSomethingA());
foobarList.ForEach(x => doSomethingB());

和 VB.NET:

Dim foobarList = arrayA.Where(Function(x) x.someVar = foobar).ToList()
foobarList.ForEach(Function(x) doSomethingA())
foobarList.ForEach(Function(x) doSomethingB())

和 Javascript:

var foobarList = arrayA.filter(function(x) { return x.someVar == foobar });
foobarList.forEach(function(x) { doSomethingA(); });
foobarList.forEach(function(x) { doSomethingB(); });
于 2013-03-13T14:41:42.590 回答
1

当它使您的代码变得更糟时,您应该停止抽象:)

许多语言都内置了更高级别的结构来处理常见的迭代模式。C++11 具有基于范围的 for 循环,以减少对数据结构的迭代。函数式语言通常有map,foldfilter.

于 2013-03-13T14:39:32.483 回答