2

JavaScript の複数の関数の最初と最後に同じコード ブロックを追加する必要がある状況に直面しています。例えば

function funcA () {
    // code block 1
    ...

    // code unique to funcA
    ...

    // code block 2
    ...
}

function funcB () {
    // code block 1
    ...

    // code unique to funcB
    ...

    // code block 2
    ...
}

function funcC () {
    // code block 1
    ...

    // code unique to funcC
    ...

    // code block 2
    ...
}

重複を最小限に抑えるためにここで使用する正しいパターンは何だろうか。

4

6 に答える 6

6

これは、抽出メソッドのリファクタリングと呼ばれます。

function block1() 
{
  // code block 1
}

function block2() 
{
  // code block 2
}

function funcA () {
    block1();

    // code unique to funcA
    ....

    block2();
}
function funcB () {
    block1();

    //   code unique to funcB
    ....

    block2();
}
function funcC () {
    block1();

    //   code unique to funcC
    ....

    block2();
}
于 2012-11-15T18:19:57.457 に答える
4

別の関数を使用して関数を作成できます。

function makeFunc( specialProcessing ) {
  return function() {
    // block 1
    specialProcessing( x, y, z );
    // block 2
  };
}

var func1 = makeFunc( function( x, y, z ) {
  // stuff for func1
});

var func2 = makeFunc( function( x, y, z ) {
  // stuff for func2
});
于 2012-11-15T18:23:06.083 に答える
1

これらのブロックに、使用中の変数を変更するだけで各関数に普遍的に適用できるかなりの量のコードがある場合は、それらのコード ブロックを抽出してメソッドを分離する必要があります。これには、コードの再利用を促進し、コードの可読性を向上させ、特にテスト駆動開発の理想に従っているか、独自の機能テストを実行している場合でも、テストとデバッグがはるかに簡単になるという利点があります。実行しなければならない作業を減らし、コード内のバグの数を減らすために、多くの場所で役立つ小さなメソッドを作成することは、常に優れたソフトウェア エンジニアリングと設計の目標です。

于 2012-11-15T18:21:08.380 に答える
1

ブロックを関数に抽出し、apply メソッドを使用して呼び出すことができます。これにより、コンテキストが維持され、元の関数に渡された引数が転送されます。

function funcA() {
    block1.apply(this, arguments);

    // specific code to funcA

    block2.apply(this, arguments);
}

引数には、親関数に渡された引数が含まれます

于 2012-11-15T18:28:52.947 に答える
0

一意にしたい関数を渡すだけです。このような:

function reusableFunc(fn) {
    //reused code block here
    fn();
    //reused code block here
}

var myResuableFunc1 = function (args) {
    reusableFunc(function () { 
        //do your business here.    
    });
};


var myResuableFunc2 = function (args) {
    reusableFunc(function () { 
        //do your business here.    
    });
};

//Or another way
function myResuableFunc3(args) {
    reusableFunc(function () { 
        //do your business here
    });
}

次に、共有コードを使用して必要な数の関数を作成し、クロージャの力を介して、これらの新しく作成された関数を任意の方法で渡すことができます。

于 2012-11-15T19:21:57.017 に答える
0

常にそのように設定されることがわかっていて、実際の関数呼び出しをその中に入れたくない場合、または一部が異なる順序になる可能性がある場合は、関数呼び出しを絡み合わせる関数を設定するのが常に好きです自分。

jsFiddle デモ

// Set up dynamically to handle calling any number of functions
// in whatever order they are specified in the parameters
// ie: setupFunctionOrder(func1, func2, func3, func4);

function setupFunctionOrder () {
    for (i = 0; i < arguments.length; i++) {
        arguments[i]();
    }
}

function block1 () { log('\nblock1 - running'); }
function block2 () { log('block2 - running'); }
function funcA () { log('funcA - running'); }

// ** Useage:
// now we make the actual call to set up the ORDER of calling -funcA-
setupFunctionOrder(block1, funcA, block2);
于 2012-11-15T18:30:47.497 に答える