1

我有下面的代码。它看起来又长又复杂,现在我必须添加更多条件。有什么办法可以简化这段代码。我所能想到的就是将 City 和 Menu 开关结合起来,但是如果我这样做了,我必须以一种方式获取 City 的 pk 值,而另一种方式获取 Menu 的 pk 值。javascript 是否提供任何其他方式来做与开关相同的事情?很抱歉列出了长代码,但我认为我应该包括所有内容。

function getParams(entity) {

 var store = window.localStorage;
 var table = "Content";

 switch (entity) {
    case "City":
        if (store.getItem('AccountID')) {
            pk = store.getItem('AccountID') + "04" + "000";
            return {
                pk: pk,
                param: '?pk=' + pk,
                table: table,
                rc: true
            }
        } else {
            paramOnFailure("Please reselect Account");
            return { rc: false }
        }
        break;
    case "Menu":
        if (store.getItem('AccountID')) {
            pk = store.getItem('AccountID') + "00" + "000";
            return { 
                pk: pk,
                param: '?pk=' + pk,
                table: table,
                rc: true
            }
        } else {
            paramOnFailure("Please reselect Account");
            return { rc: false }
        }
        break;
    case "Page":
        if (store.getItem('AccountID') && store.getItem('PageID')) {
            pk = store.getItem('AccountID') + store.getItem('PageID') + "000";
            return {
                pk: pk,
                param: '?pk=' + pk,
                table: table,
                rc: true
            }
        } else {
            paramOnFailure("Please reselect Account and Page Type");
            return { rc: false }
        }
        break;
    case "Question":
        if (store.getItem('AccountID') &&
            store.getItem('CityID') && 
            store.getItem('TopicID') ) {
            pk = store.getItem('AccountID') + store.getItem('CityID');
            return {
                pk: pk,
                param: '?pk=' + pk + '&rk=' + store.getItem('TopicID'),
                table: "Question",
                rc: true
            }
        } else {
            paramOnFailure("Please reselect Account, City and Topic");
            return { rc: false }
        }
        break;
    case "Reference":
        if (store.getItem('ReferenceID')) {
            pk = store.getItem('ReferenceID');
            return { 
                pk: pk,
                param: '?pk=' + pk,
                table: "Reference",
                rc: true
            }
        } else {
            paramOnFailure("Please reselect Reference");
            return { rc: false }
        }
        break;
    case "Topic":
        if (store.getItem('AccountID') && store.getItem('CityID')) {
            pk = store.getItem('AccountID') + "05" + store.getItem('CityID');
            return { 
                pk: pk,
                param: parameters = '?pk=' + pk,
                table: table,
                rc: true
            }
        } else {
            paramOnFailure("Please reselect Account and City");
            return { rc: false }
        }
        break;
    default:
        ;
}
4

4 回答 4

3

如果是我,我会将代码从每个案例条件移动到它们自己的函数中。这应该使事情更清晰。

于 2012-07-04T14:39:19.177 回答
3

将这部分代码放入函数中并使用适当的参数调用它

  if (store.getItem('AccountID')) {
             pk = store.getItem('AccountID') + "00" + "000";
             return {
                  pk: pk,
                 param: '?pk=' + pk,
                 table: table,
                 rc: true
             }
         } else {
             paramOnFailure("Please reselect Account");
             return { rc: false }
         } 

所以你的代码将是这样的,并从每个 Switch Case 调用这个函数

function CommonforCase(store,value)
{
   if (store.getItem('AccountID')) {
                 pk = store.getItem('AccountID') + value;
                 return {
                      pk: pk,
                     param: '?pk=' + pk,
                     table: table,
                     rc: true
                 }
             } else {
                 paramOnFailure("Please reselect Account");
                 return { rc: false }
             } 

}
于 2012-07-04T14:40:06.137 回答
0

像这样的东西:

function getTheItem(itemName, value, table){
         if (store.getItem(itemName)) {
            pk = store.getItem(itemName) + value;
            return {
                pk: pk,
                param: '?pk=' + pk,
                table: table,
                rc: true
            }
        } else {
            paramOnFailure("Please reselect"+ itemName);
            return { rc: false }
        }
}
于 2012-07-04T14:43:22.323 回答
0

我一开始没有滚动完成,所以我错过了很多 switch 语句(在其他一些答案中也可能是这种情况)。前两种情况可以直接分解为函数。在您的其余代码中,您有更多差异,因此您需要在该函数中使用更多参数,这很容易让人感到困惑。

因此,您可以使用配置对象来命名选项并使用默认值(对于合并默认值和给定值,请参阅.extend()动态合并对象)。您还可以根据所有必需值动态构建错误消息。它应该以这种方式变得更短且更具可读性。

一些伪代码:

// Pseudo-Code
function getParams(entity) {
 var store = window.localStorage;
 var defaults = {
    "mandatoryValues":[],
    "pk":null,
    "table":"Content",
    "errorMessage":"Please reselect Account",
    "param":""
 };
 var foo = function(cfgObj) {
    // Add default values from defaults variable for missing properties in cfgObj
    // Set other missing values based on cfgObj (e.g. `param` from `pk`)
    // Return your object using the now 'complete' cfgObj
 }

 switch (entity) {
    case "City":
        var pk = store.getItem('AccountID') + "04" + "000";
        return foo(
            "mandatoryValues":[store.getItem('AccountID')],
            "pk":pk);
    // Menu, Page
    case "Question":
        var pk = store.getItem('AccountID') + store.getItem('CityID');
        return foo(
            "mandatoryValues":[
                store.getItem('AccountID'),
                store.getItem('CityID'),
                store.getItem('TopicID')],
            "pk":pk,
            "param":'?pk=' + pk + '&rk=' + store.getItem('TopicID'),
            "table":"Question");
    // Reference, Topic, default
}
于 2012-07-04T15:09:57.780 回答