3

我有一大堆掩码和代码

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,但任何语言的设计模式对我来说都可以。

4

3 回答 3

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]();
}
于 2013-10-09T20:04:53.610 回答
0

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

array[code] = "function_name"

然后应用掩码并调用函数:

call(array[number & codes.foo.mask])
于 2013-10-09T20:04:22.417 回答
0

很简单,我会使用策略模式。像你这样的人长期以来一直使用工厂和多态来处理这个确切的问题,这是战略的基础。

于 2013-10-09T20:05:32.640 回答