2012-12-11 33 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 
}