用于替换“if else”语句的模式

时间:2013-11-01 18:38:53

标签: javascript design-patterns

我写了以下代码:

var json = {};
var test = {
    run: function(json)
    {
        var choice = (function(){

            if (json.a != '' && json.b == '' && json.c == ''){ return 'a'} else
            if (json.a == '' && json.b != '' && json.c == ''){ return 'b'} else
            if (json.a == '' && json.b == '' && json.c != ''){ return 'c'} else
            if (json.a != '' && json.b != '' && json.c == ''){ return 'd'} else
            if (json.a != '' && json.b == '' && json.c != ''){ return 'e'} else
            if (json.a == '' && json.b != '' && json.c != ''){ return 'f'} else
                return 'g';
        })();

        switch (choice)
        {
            case 'a': console.log('a');
                break;

            case 'b': console.log('b');
                break;

            case 'c': console.log('c');
                break;

            case 'd': console.log('d');
                break;

            case 'e': console.log('e');
                break;

            case 'f': console.log('f');
                break;

            case 'g': console.log('no arguments');
        }
    }
};

json.a = 'xxx';
json.b = '';
json.c = 'yyy';

test.run(json);

这会返回“e”,但json每次都会有所不同。

当每个“if”语句都有很多代码行时,这个代码结构更清晰易读。

想象一下:

if(statement){

//100 lines of code

}else
    if(statement){

    //100 lines of code
    }else ........
    //and so on.

我想知道有什么样的设计模式比这个解决方案更好吗? 我很感激你的帮助。

4 个答案:

答案 0 :(得分:1)

方式更容易。循环遍历json循环中的for in,如果有任何输入,请将该密钥设置为output。如果之后有另一个输入,则返回“Bad arguments”。如果测试完成,请返回output

var json = {};

var test = {

    run: function(json)
    {
        var output = null;
        for (var s in json) {
            if (json[s]) {
                if (output) {
                    return "Bad arguments.";
                } else {
                    output = s;   
                }
            }
        }
        return output;
    }
} 

json.a='xxx';   
json.b='';
json.c='';

console.log(test.run(json));

http://jsfiddle.net/r7Vyq/1/

答案 1 :(得分:0)

那么,您将如何捕获用户的输入?如果这些属性彼此独占,那么您很可能使用单选按钮作为捕获输入的方式。您一次只能选择一个单选按钮。然后就不需要检查所有三个属性了。只需检查一下,无论哪个有价值,都要退货。

var choice = (function(){
  if (json.a != '') { return 'a'; }
  if (json.b != '') { return 'b'; }
  if (json.c != '') { return 'c'; }
  return 'd';
}

答案 2 :(得分:0)

您可以使用多种数组和对象方法

例如

var res= [json.a,json.b,json.c,json.d].filter(function(str){
     return str.length;
});

var output= res.length==1 ? res[0] : "Bad args";

查看您正在使用的JSON将有助于更多

DEMO

答案 3 :(得分:0)

我找到了解决方案:

var json = {};

var test = {

run: function(json)
{

    var output='';
    var func =[];
    for (var s in json) {
        if (json[s]) {
            output +=s;
        }
    }


    func['a'] = function()
    {
        return console.log('a');
    }

    func['b'] = function()
    {
        return console.log('b');
    }

    func['c'] = function()
    {
        return console.log('c');
    }

    func['ab'] = function()
    {
        return console.log('ab')
    }

    func['ac'] = function()
    {
        return console.log('ac')
    }       

    func['bc'] = function()
    {
        return console.log('bc')
    }

    func[''] = function()
    {
        return console.log('bad arguments')
    }

    func[output]();


}
}

json.a='xxx';
json.b='';
json.c='yyy';

test.run(json);