2012-11-15 30 views
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 
    ... 
} 

我不知道什麼是用在這裏,以儘量減少重複正確的模式。

+1

爲什麼不使用函數代碼塊1和2? – adammenges

+1

@InBetween,我希望是否有類似於Python中的裝飾器的方式... – MLister

+0

我提供了一個模式,解決了這個問題。這就像一個飲食裝飾者。 – elucid8

回答

3

你可以使用其他功能來構建功能爲您提供:

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

這看起來好像比簡單地將重複的代碼抽取到一個單獨的函數中更不易讀和更難使用。 –

+2

+1函數工廠*(或裝飾器,或其他)*是一個很好的乾淨的方式,當有幾個這樣的功能。 –

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(); 
} 
+0

這是可讀的,但我不知道這是不是同一個問題。最後你要重複block1()和block2()調用。 – y2josei

1

如果在這些塊可以通過簡單地改變變量在使用時,那麼應該提取碼的那些塊,以單獨的方法普遍被應用到每個函數中,代碼相當大的塊。這有助於促進代碼重用,提高代碼的可讀性,並使測試和調試變得更加容易,特別是如果您遵循測試驅動的開發理念,甚至只是運行自己的功能測試。一直以來,良好的軟件工程和設計都是爲了創建在許多地方很有用的小型方法,以減少您必須完成的工作並減少代碼中的錯誤數量。

1

塊可以提取到的功能和使用方法,適用叫。這將保持上下文並轉發傳遞給原函數的任何參數。

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

    // specific code to funcA 

    block2.apply(this, arguments); 
} 

參數將包含傳遞給父函數

0

如果你知道我永遠不會設置像任何參數,你不希望有這裏面實際的函數調用,或者可能會有不同的命令,我總是喜歡設置一個函數來爲我調用函數調用。

jsFiddle DEMO

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

然後,您可以根據需要創建使用共享代碼儘可能多的功能,並通過關閉的權力,來傳遞你喜歡的任何方式將這些新創建的功能。

相關問題