2012-12-11 85 views
1

我正在用Html5-js-jquery開發win8(metro style)應用程序。 我有這段代碼;如何重構If-else代碼段?

GetBoutiqueDetail: function (boutiqueId, options) { 
     if (IsUserLogin()) { 
      //different job A 
     } else { 
      ShowLoginPanel(undefined); 
     } 
    }, 
    GetProductDetail: function (boutiqueId, productId, options) { 
     if (IsUserLogin()) { 
      //different job B 
     } else { 
      ShowLoginPanel(undefined); 
     } 
    }, 
    AddBasket: function (productId, productVariantId, quantity, options) { 
     if (IsUserLogin()) { 
      //different job C 
     } else { 
      ShowLoginPanel(undefined); 
     } 
    },.... 

。並且〜20個函數應該檢查用戶是否登錄。 我應該叫像類似的功能爲「Library.GetBoutiqueDetail();

所以我的問題很簡單,我怎麼能重構代碼,以消除這些的if-else部分?

+0

瓦時y是那些大寫的函數?他們似乎不是構造函數。 –

回答

1

您可以在公共代碼總是包裝到更高範圍的功能,並將其從庫函數調用 - 如:

//Higher scope: 
function CheckForLogin(executionFunction) 
{ 
    if(IsLogin) { 
     executionFunction(); 
    } else { 
     ShowLoginPanel(undefined); 
    } 
}; 


GetBoutiqueDetail: function (boutiqueId, options) { 
    CheckForLogin(//different job A) 
} 

傳遞different job 'N'作爲匿名功能CheckForLogin

2

怎麼樣在這個對象映射:

var objMap = { 
    "GetBoutiqueDetail":fnJobA, 
    "GetProductDetail":fnJobB, 
    "AddBasket":fnJobC} 
    .... 
} 

if (loggedIn) { 
    objMap[task](); 
} 
else { 
    doLogin(); 
} 
+0

不要忘記參數;) – EricG

+0

顯示的示例沒有任何參數。因此解決方案。否則,也可以使用閉包。 – closure

+0

例如,問題的作者確實在函數GetBoutiqueDetail中有參數。我不明白'工作:fnJobA'嗎? (雖然我喜歡地圖解決方案,但只是尋求改進,不用擔心:D) – EricG

-2

使用三元運算

(IsLogin) ? jobA() : ShowLoginPanel(undefined) 
+1

這並沒有統一過程(不避免代碼冗餘)。 – EricG

+1

這個問題不是「代碼統一」...... OP想要擺脫if/else - > ternary在很多情況下都很有用。 – k1dbl4ck

+0

擺脫'if-else'的目的不是爲了避免看到這些字母,而是爲了避免所有20個函數中的重複代碼。因此,他可能會對檢查這個問題的標準方式感到滿意。你怎麼看? – EricG

1

在Javascript中你可以從一個函數來結束它回報,所以f.ex:

GetProductDetail: function (boutiqueId, productId, options) { 
    if (!IsLogin) return ShowLoginPanel(); 
    // different job... 
} 

雖然你仍然會有一些重複的代碼。另一個選擇是定義更高級別的功能。喜歡的東西:

var loginOrAction = function() { 
    if (!IsLogin) return ShowLoginPanel(); 
    var args = [].slice.call(arguments); 
    Library[args.shift()].apply(Library, args); 
} 

loginOrAction('GetBoutiqueDetail', boutiqueId, options); 
+0

你只是跳過'else'。但是沒問題。 – EricG

2

嘗試是這樣的:

checkLogin: function(action, actionArgs) { 

    if(IsLogin) { 

     return action.apply(this, actionArgs); 
    } 

    ShowLoginPanel(); 
}, 

GetBoutiqueDetail: function (boutiqueId, options) { 

    //different job A 
}, 
GetProductDetail: function (boutiqueId, productId, options) { 

    //different job B 
}, 
AddBasket: function (productId, productVariantId, quantity, options) { 

    //different job C 
}