以条件作为关键字的查找表/地图?

时间:2018-11-04 08:36:30

标签: javascript refactoring factory software-design open-closed-principle

我发现自己经常想根据一组条件查找某些东西(通常是函数或构造函数)。在JavaScript中是否有一种简洁的方法?即使有更简洁的方法,当我发现自己达到这种模式时,还有更好的方法吗?

当我们只需要与字符串或数字进行比较时,这很简单:

const getAnimal = type => {
  const lookup = {
    'cat': Cat,
    'dog': Dog,
  }
  return new lookup[type](); // e.g. type = 'cat'
}

...但是当我需要更复杂的逻辑时,查找键将需要是函数。例如:

const animalFactory = traits => {
  const lookup = [
    // format: [condition, Animal]
    // condition: returns true / false
    // Animal: constructor
    [likesWarmBeds, Cat],
    [isIndifferent, Dog],
  ];

  for (let [hasTraits, Animal] of lookup) {
    if (hasTraits(criteria)) {
      return Animal;
    }
  }
}

const getAnimal = (traits) => {
  const Animal = animalFactory(traits);
  return new Animal(traits);
}

与简单示例中的 lookup 相比, condition 值已基本上替换了字符串键,而 Animal 构造函数仍是值

我正在尝试遵循open-closed principle。在上面的示例中,getAnimal()可以通过向查询中添加另一个项目来支持新的动物,而这不需要对函数本身进行任何更改。

0 个答案:

没有答案