首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算/重构投票系统的if/else

计算/重构投票系统的if/else
EN

Stack Overflow用户
提问于 2012-05-11 02:23:03
回答 2查看 83关注 0票数 1

在没有庞大的if/else结构的情况下,我很难概念化如何以最好的方式做到这一点。我知道我可以这样做,但我试图将它抽象成方法,但我迷失了方向。

代码语言:javascript
复制
upvote = 1
no vote = 0
downvote = -1

基本上,一个人可以点击上票或下票按钮。

如果他们点击了向上投票,而他们当前的投票是向上投票,它就会取消对帖子的投票,并将其设置为零

如果他们点击了下投票,而他们当前的投票是上投票,则会将其切换为下投票

如果他们的投票是零,并且他们点击了向上投票,它会将投票设置为1

对于下一次投票,情况正好相反

这是我到目前为止所拥有的,但它不能说明在你点击了upvote之后点击了upvote。它不是将其设置为0,而是将其设置为-1。

我明白问题所在,我只是很难弄清楚如何编写它。

代码语言:javascript
复制
  def update_vote(upvote_or_downvote)
    self.active_vote? ? self.value = 0 : self.alternate_vote
  end

  def active_vote?
    self.value != 0
  end

  def alternate_vote
    self.value *= -1
  end
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-11 02:33:18

有很多方法可以做到这一点。这里有一个。我假设up_or_down会以+1的支持率和-1的反对票通过。不要把事情搞得过于复杂。

代码语言:javascript
复制
def update_vote(up_or_down)
  self.value = self.value == up_or_down ? 0 : up_or_down
end

如果你这样思考逻辑,这很简单:如果用户点击相同的东西,重置为零。否则,将其设置为单击的值。

票数 5
EN

Stack Overflow用户

发布于 2012-05-11 03:23:28

玩弄状态机(这比我想象的要容易):

代码语言:javascript
复制
require 'statemachine' #it's a gem

vote_state = Statemachine.build do
 #trans old_state, event, new_state
  trans :zero, :upvote, :up
  trans :zero, :downvote, :down
  trans :down, :upvote, :up
  trans :down, :downvote, :zero
  trans :up, :upvote, :zero
  trans :up, :downvote, :down
end

vote_state.upvote
p vote_state.state #=> :up
vote_state.upvote
p vote_state.state #=> :zero
vote_state.upvote
p vote_state.state #=> :up
vote_state.downvote
p vote_state.state #=> :down
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10540016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档