2012-06-14 10 views
9

Mam model użytkownika, który ma metody głosowania. Chcę pisać metody proxy do głosowania.Co to jest Rails Way? (czytelność vs suszenie)

Jest to czytelny sposób:

def vote_up item 
    return false unless can? :vote, item 
    vote item, :up 
end 

def vote_down item 
    return false unless can? :vote, item 
    vote item, :down 
end 

I to jest suchy sposób:

%w(up down).each do |vtype| 
    define_method "vote_#{vtype}" do |item| 
    return false unless can? :vote, item 
    vote item, vtype.to_sym 
    end 
end 

Który z nich jest lepszy i dlaczego?

+4

Osobiście, biorąc pod uwagę, że masz tutaj tylko dwie metody i jest mało prawdopodobne, że kiedykolwiek dodasz więcej (vote_sideways? Vote_diagonally?) Po prostu pójdę w czytelny sposób. Jeśli mógłbyś mieć wiele, wiele więcej, chciałbym pójść w sposób DRY (ponieważ staje się łatwo rozszerzalny) z czytelnym komentarzem do wyjaśnienia innym programistom (lub sobie później!). – MrDanA

+0

Zgadzam się z @MrDanA --- innym pytaniem: czy chcesz użyć tego w więcej klasach niż tylko ten "przedmiot"? –

+0

atm Odpowiedź MrDanA jest lepsza. ty! – enRai

Odpowiedz

3

wyłącznie dlatego OP wydawała się podoba mój komentarz, włożę go jako odpowiedź:

Osobiście rozważa masz 2 sposoby tylko tutaj, i to jest mało prawdopodobne, że kiedykolwiek dodać więcej (vote_sideways vote_diagonally?) Po prostu pójdę w czytelny sposób. Jeśli mógłbyś mieć wiele, wiele więcej, chciałbym pójść w sposób DRY (ponieważ staje się łatwo rozszerzalny) z czytelnym komentarzem do wyjaśnienia innym programistom (lub sobie później!).

2

Ani (przepraszam).

def vote_count(item,vtype) 
    return false unless can? :vote, item 
    vote item, vtype 
end 

Powodzenia

+0

Ludzie często zapominają, że można przekazać więcej niż jeden parametr do metody. – MurifoX

+0

w moim przypadku dostaję tutaj rekurencję – enRai

1

IMHO, w tym przypadku, czytelność przebija suche. Szybko skanuje i łatwo go zgadnąć. Powiedziawszy to, jeśli zaczniesz dodawać rodzaje głosów, drugie podejście może być bardziej elastyczne. YMMV.

0

Obie.

Jestem z Anilem; po prostu przekazujmy typ - meta-programowanie to jako pierwsza instancja jest paskudna.

To powiedziawszy, I am fanem wygodnych metod - ale powinny one wywoływać rodzajową metodę z typem.

Dzięki temu generowana metoda jest zwięzła - prawdziwa praca jest wykonywana w sposób ogólny, ale użytkownik interfejsu API wciąż otrzymuje te same metody wygody.