3

さまざまな状況で使用されている、少し複雑なforループがあるとします。そのforループを抽出し、コードを読みやすくする方法はありますか?

例えば:

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

ただし、このアプローチでは、誰がいつ何をしているのかよくわからないため、コードが読みにくくなることがあります。特に、渡された関数が別のクラスからのものである場合。これを行うためのより良い方法はありますか?

このソリューションが機能しない可能性があるもう1つの理由は、コールバック関数にさまざまなパラメーターを渡す必要がある場合です。例えば。

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

他の人が指摘しているように、、などの高階関数は、この種の機能を提供します。もちろん、正確な実装は言語によって異なります。mapfoldfilter

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ありfoldますfilter

于 2013-03-13T14:39:32.483 に答える