2013-10-09 21 views
3

我有面具和代码设计方案,以避免大量的if-else块

var codes = [ 
    foo: { mask: 0x1234, code: 0x0010 }, 
    bar: { mask: 0x1F00, code: 0x0310 }, 
    bla: { mask: 0x12F0, code: 0x2010 } 
    ... 
] 

的大名单,我希望做一些操作...

var doStuff = function(number) { 

    if ((number & codes.foo.mask) == codes.foo.code) { 
    // do some stuff 

    } else if ((number & codes.bar.mask) == codes.bar.code) { 
    // do other stuff 

    } else if ((number & codes.bla.mask) == codes.bla.code) { 
    // do other stuff 
    } 
    ... 

} 

你会如何设计你的程序要避免大的if-else块? 示例代码使用javascript,但任何语言的设计模式对我来说都可以。

+0

你能简要总结一下“做其他事情”中的内容吗? –

回答

4

您可以将//do some stuff部件添加到富,酒吧,血乳酸的对象,然后就循环阵列上即

var codes = { 
    foo: { mask: 0x1234, code: 0x0010, action: function(){/*do foo stuff*/} }, 
    bar: { mask: 0x1F00, code: 0x0310, action: function(){/*do bar stuff*/} }, 
    bla: { mask: 0x12F0, code: 0x2010, action: function(){/*do bla stuff*/} } 
    ... 
} 

for (var item in codes){ 
    if ((number & codes[item].mask) == codes[item].code) 
    codes[item].action(); 
} 

如果您不想将数据与代码混合(即,如果代码是从服务器获取的),您也可以为函数创建单独的关联数组。

var codes = { 
    foo: { mask: 0x1234, code: 0x0010}, 
    bar: { mask: 0x1F00, code: 0x0310}, 
    bla: { mask: 0x12F0, code: 0x2010} 
    ... 
} 

var funcs = { 
    foo : function {/* do foo stuff */ }, 
    bar : function {/* do bar stuff */ }, 
    bla : function {/* do bla stuff */ }, 
} 

for (var item in codes){ 
    if ((number & codes[item].mask) == codes[item].code) 
    funcs[item](); 
} 
+0

这是我的第一个方法,但我不想将'codes'表与函数混合使用。 –

+0

@PedroL - 编辑来解决这个问题。 – SWeko

0

可以在代码是索引并命名该值的每种情况下,使用函数的名称创建一个数组。

array[code] = "function_name" 

随后施加的面具,并调用该函数:

call(array[number & codes.foo.mask]) 
0

很简单,我会使用Strategy模式。在你的情况下,人们一直在处理这个与工厂和多态性相关的确切问题,这是策略的基础。