我有一大堆面具和代码
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
部分添加到foo,bar,bla对象中,然后循环遍历数组,即
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]();
}
答案 1 :(得分:0)
可以在每种情况下创建一个带有函数名称的数组,其中代码是索引并命名该值。
array[code] = "function_name"
然后应用蒙版并调用函数:
call(array[number & codes.foo.mask])
答案 2 :(得分:0)
很简单,我会使用Strategy模式。在你的情况下,人们长期处理这个问题的工厂和多态,这是战略的基础。