2012-05-02 18 views
0

這裏是我的代碼:如何在Javascript中提取包含return語句的通用邏輯?

function function1() { 
    var ids = GetIds(); // predefined function 
    if (ids.length === 0) { 
     alert("Please select at least one item to procees."); 
     return; 
    } 

    ... 
} 

function function2() { 
    var ids = GetIds(); // predefined function 
    if (ids.length === 0) { 
     alert("Please select at least one item to procees."); 
     return; 
    } 

    ... 
} 

function function3() { 
    var ids = GetIds(); // predefined function 
    if (ids.length === 0) { 
     alert("Please select at least one item to procees."); 
     return; 
    } 

    ... 
} 

如何提取公共部分呢?如何重新分解代碼?回報聲明很難處理。是否有任何與重新編碼此代碼有關的模式?

在此先感謝!

if (ids.length === 0) { 
     alert("Please select at least one item to procees."); 
     return; 
    } 
+0

創建一個包含公共部分的函數,並調用該函數代替公共部分。你不能提取「return」語句,因爲將它移到其他地方就意味着它不能在它所在的位置執行它的工作。 –

+1

通用部分?但是,所有三個功能都具有完全相同的功能體。爲什麼你有三個功能相同的身體? ....稍後:點啊,我看到......':)' –

回答

0

你不能。您唯一能做的就是將alert()轉換爲GetIds()。但是,在這種情況下,函數名稱會有點混亂。

var ids = GetIds(); 
if(!ids) return; 

或者你可以改變這樣的:

GetIds(function(ids) { 

}); 

然後你GetIds函數看起來如像這樣:

function GetIds(callback) { 
    var ids = ....; 
    if(!ids) alert('...'); 
    else callback(ids); 
} 
+0

但回調函數中的return語句仍將工作流返回到主函數。 – zsong

+0

是的,在該版本中,您應該將所有代碼放在回調函數中原始的'return'之後。在調用函數中,如果沒有'if(whatever)return''調用函數從另一個函數返回是不可能的。 – ThiefMaster

0

你可以嘗試:

function checkId(ids) { 
    if (ids.length === 0) { 
     alert("Please select at least one item to procees."); 
     return false; 
    } 
    return true; 
} 

function function1() { 
    var ids = GetIds(); 
    if (!checkId(ids)) return; 

    // More code here 
} 
+0

爲什麼不將GetIds移入checkIds? – Bergi

2

這是一個非常適合的decorator pattern

function decorateGetId(f) { 
    return function() { 
    var ids = GetIds(); 
    if (ids.length === 0) { 
     alert("Please select at least one item to process."); 
     return; 
    } else { 
     return f(ids); 
    } 
    }; 
} 

然後要麼

function function1(ids) { 
    // ... 
} 
function1 = decorateGetId(function1); 

或我的偏好,因爲函數語句做奇怪的事情與提升。

var function2 = decorateGetId(function (ids) { 
    // function 2 body ... 
});