1

if/elseの巨大な構造を持たずに可能な限り最良の方法でこれを行う方法を概念化するのが難しいです。私はそうすることができることを知っていますが、私はそれを抽象化しようとしていて、私は迷っています。投票システムのために/ if/elseを考案/リファクタリングする

upvote = 1 
no vote = 0 
downvote = -1 

基本的に、人はupvoteまたはdownvoteボタンを押すことができます。彼らはupvoteとその現在の投票が、それはunvotes "ポストupvoteであり、彼らはdownvoteをクリックして、それらの現在の投票がupvoteである場合には、ゼロ

に設定しますクリックすると

は、それがdownvoteするためにそれを切り替え

彼らの投票はゼロであり、彼らはupvoteをクリックした場合、それは1

に投票を設定し、逆にdownvote

のために真であるこれは私がこれまで持っているものですが、あなたはすでにupvoteをクリックした後にそれがupvoteクリックのアカウントをdoesntの.. inst 0に設定すると、-1に設定されます。

は、私が問題、イムはちょうどそれが

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 
+0

「彼らはupvoteとその現在の投票が、それはunvotes "ポストupvoteでクリックして、それをゼロに設定した場合、」 - このdoesnのを私は直感的に思える。私はdownvoteをクリックすると0になるので、downvoteをdownvoteに設定するには2回クリックしなければならないと思います。 – ghoppe

+0

私は同意しないことに同意します。私はちょうどredditと他の多くの投票サイトがしているものに従っています。 – Tallboy

+0

アップヴォートをクリックして投票をキャンセルするとは思いません。私は投票をクリックします。あなたのUIロジックをカプセル化しようとするあなたの苦労は、本当に意味をなさないからです。 –

答えて

5

それを行うための方法がたくさんあります作成する方法を考え出す苦労し得ます。ここに1つあります。私はup_or_downがupvoteの場合+1、downvoteの場合-1と推測します。物事を過度に複雑化しないでください。あなたがロジックのこの方法を考える場合

def update_vote(up_or_down) 
    self.value = self.value == up_or_down ? 0 : up_or_down 
end 

それは簡単です:ユーザーが同じことをクリックすると、ゼロにリセット 。それ以外の場合は、クリックした値に設定します。ステートマシンをいじる

+0

はい後見では、論理の説明は非常に簡単にそれを書くことができます。なぜそんなに難しいのか知らない:S – Tallboy

1

(それは私が思ったよりも簡単です):

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 
関連する問題