在Javascript

时间:2016-04-05 23:04:41

标签: javascript design-patterns model

我作为业余爱好/拓展我的技能组合在桌面RPG角色建设者身上工作。挑战的一部分是表现角色的统计数据,专长,攻击等所需的复杂模型,其中大部分都可能相互影响。

例如,考虑到下面的简化字符,可以很容易地计算出"攻击"价值应该是。

character = {
   strength: 14,
   dexterity: 16,
   base_attack_bonus: 3,
   attack: function() { return this.strength + this.base_attack_bonus; }
}

然而,要完成,角色建设者必须考虑诸如" Weapon Finesse,"使角色的攻击使用灵巧而不是力量来计算攻击值。

当Object.observe()未来仍在使用Javascript时,我开始了这个项目,所以为了获得最大的灵活性,我选择了一个事件驱动的依赖关系网(预防措施来防止循环)。我创建了一个"数据"对象,它可以depend()在另一个对象的属性上的属性。

这样的事情:

character = new Data({
   strength: 14,
   dexterity: 16,
   attack_modifier: 0,
   base_attack_bonus: 3,
   attack: function() { return this.attack_modifier + this.base_attack_bonus; }
});
character.depend("attack_modifier", character, "strength")
// Weapon Finesse feat rules:
character.undepend("attack_modifier", character, "strength")
character.depend("attack_modifier", character, "dexterity")

如果力量或灵巧分数在稍后的某个时刻发生变化,那么依赖于它们的attack_modifier属性也会立即更新(感谢Object.observe()),沿着链条涓涓细流。如果属性在多个属性上depend(),则默认情况下,它会更新为所有依赖项的总和 - 但update()函数是可自定义的,因此您可以返回其所有依赖项的列表,或者最大的等等。

这让我可以创建复杂的无序依赖链,然后允许在事后创建专长和能力,几乎可以改变角色的任何方面而不改变模型的代码。从理论上讲,当事情发生变化时,它还应该提高性能,而不是重新计算模型的每个部分。

我现在正在权衡我的选项,因为Object.observe()Array.observe()已经过时了。我可以使用垫片继续前进。但是,无论如何,如果我重新审视这种情况,我想我会四处寻找,看看这种工作是否有更好的设计模式。

我想这里有两个问题:

  1. 使用Object.observe()Array.observe()垫片是否更好(对于上述情况);开发我自己的Observer实现;或者使用其他第三方选项?
  2. 上面描述的依赖关系网是一个合理的设计模式,对于像这样的复杂而灵活的模型,还是我为自己做的事情太难了?还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

你总是可以构建复杂的模型和重构,直到它像你想要的那样优雅。假设你想用角色对象之外的函数来计算伤害,你可以从这样的东西开始,让球滚动,并从那里使用迭代改进。

character = {
   strength: 14,
   dexterity: 16,
   base_attack_bonus: 3,
   inventory: [{ weaponId: 0,
                 description: 'fist',
                 punch: 5 },
               { weaponId: 1,
                 description: 'wooden sword',
                 stab: 7,
                 weight: 10 }],
   equipped: 1,
   skills: { punch: 15,
             stab: 17 },
   attack: function() { return attackModify(this.equipped, this.skills) +
                         this.base_attack_bonus; }
}

然后你就可以在角色对象之外实现武器技巧和其他专长。开始复杂比完全没有开始更好。一旦你有时间玩代码,你就会看到让它更简单的方法。然后,一旦你驯服了野兽,应用观察者模式或任何你认为合适的东西应该没问题。您可能会发现,如果强制代码从一开始就适合某种模式,那么使用其他一些GOF设计会更好。设计将通过重构最初的蛮力努力而出现。

最重要的是,您显然希望构建一个复杂的模型。如果它让你开心,我想你应该随意这样做。然后只需将您最初的努力集中在重构而不是模式上。您需要通过重构实现简单性,以便将来更轻松地将代码融入模式中。