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 }
         } 

したがって、コードは次のようになり、各スイッチケースからこの関数を呼び出します

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

最初はスクロールしなかったので、そのスイッチステートメントの多くを見逃していました(これは、他の回答の一部にも当てはまる可能性があります)。最初の 2 つのケースは、簡単に関数に分解できます。コードの残りの部分にはさらに多くの違いがあるため、その関数にはさらに多くの引数が必要になり、混乱しやすくなります。

代わりに、構成オブジェクトを使用して名前付きオプションを持ち、デフォルト値を使用できます (デフォルト値と指定された値のマージについては、.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 に答える
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 に答える