Rails组织代码

时间:2011-01-28 03:14:58

标签: ruby-on-rails

在编写一些大的东西时,我恰好有点挑剔。我试图找到最好的方法,它的速度和复杂性。自从我在过去3个月里学习Rails以来,我一直在寻找最好的技术。我想问你如何编写这样的代码:

@defender = User.find_by_id(user_id)
@attacker = current_user.clone
@attacker_starting_attribs = current_user
@defender_starting_attribs = @defender.clone
@defenderWeapon = @defender.getEquippedWeapon
@attackerWeapon = @attacker.getEquippedWeapon
@combat = Combatant.fight(@attacker, @defender)

此代码是关于浏览器游戏中两个人之间的战斗结果。代码运行良好,但我在良好的编码方面存在一些问题。事实上,我知道我的代码在这里很糟糕,这就是为什么我问你一个更好的版本会是什么。让我解释一下这段代码中会发生什么。

@defender由user_id给出,所以我猜这个部分是必需的。现在,在@attacker我正在克隆current_user。原因是Rails在对象上工作,而current_user将在Combatant.fight中更改。我需要新的hp和旧的hp,这就是我克隆对象的原因。起源attribs的防御者和攻击者说明了这个概念。现在,我在实例变量中获取武器,以便我可以在最终视图中获取其信息。

然而,在战斗功能中需要武器,我在fight()内再次执行相同的getEquippedWeapon。我对战斗之类的东西不太满意(@attacker,@ defender,@跆拳道武器,@ defender_weapon),但我也不喜欢重复的想法。所以,我想就此发表意见。

@combat是一个包含战斗结果的哈希。战斗发生了,我在视图中得到了哈希。

我对我在该舞台上的编码感到不满意,我想要你的意见。你会怎么做?可能有一种设计模式吗?请告诉我你的意见。

Thanx:)

1 个答案:

答案 0 :(得分:0)

我发现很难完全理解你要做的事情。我得到了它的要点(2人战斗)。我还无法提供答案,但希望这会让人感到震惊:

根据您提供的代码,@attacker_starting_attribs@defender_starting_attribs未被使用。

就“好技术”而言,我尽量保持OO。代替 Combatant.fight(@attacker, @defender),我会做@attacker.fight(@defender)

作为ruby约定,方法名称被强调。在您的情况下,.get_equipped_weapon代替.getEquippedWeapon,甚至更好.equipped_weapon

无论如何,我敢打赌,如果你提供更多代码,你会得到更多答案。