2012-06-14 17 views
9

Tengo un modelo de usuario, que tiene métodos de votación. Quiero escribir métodos proxy para votar.¿Qué es Rails Way? (legibilidad frente a secado)

Ésta es la manera legible:

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 

Y esto es vía seca:

%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 

¿Cuál es mejor y por qué?

+4

Personalmente, teniendo en cuenta que solo tiene 2 métodos aquí, y es poco probable que agregue más (vote_sideways? Vote_diagonally?) Yo simplemente seguiría con la manera legible. Sin embargo, si pudiera tener muchas, muchas más, me decantaría por DRY (porque se puede extender fácilmente) con un comentario legible para explicar a otros desarrolladores (¡o a usted mismo más tarde!). – MrDanA

+0

Estoy de acuerdo con @MrDanA --- otra pregunta: ¿quieres usar esto en más clases que solo este "elemento"? –

+0

atm La respuesta de MrDanA es mejor. ty! – enRai

Respuesta

3

puramente debido OP parecía que le gustaba mi comentario, voy a poner como una respuesta:

En lo personal, teniendo en cuenta que sólo tiene 2 métodos aquí, y es poco probable que alguna vez había añade más (vote_sideways vote_diagonally??) Simplemente iría con la forma legible. Sin embargo, si pudiera tener muchas, muchas más, me decantaría por DRY (porque se puede extender fácilmente) con un comentario legible para explicar a otros desarrolladores (¡o a usted mismo más tarde!).

2

Ninguno (lo siento).

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

Buena suerte

+0

Las personas a menudo se olvidan de que puede pasar más de un parámetro a un método. – MurifoX

+0

en mi caso obtengo recursión aquí – enRai

1

en mi humilde opinión, en este caso, la legibilidad triunfa sobre seco. Escanea rápidamente y se asimila fácilmente. Habiendo dicho eso, si comienzas a agregar tipos de votos, el segundo enfoque puede ser más flexible. YMMV.

0

Ambos.

Estoy con Anil; solo pase en un tipo: meta-programación esto como un primer recurso es asqueroso.

Dicho esto, I am un abanico de métodos de conveniencia, pero deben llamar al método genérico con el tipo.

Esto mantiene el método generado conciso: el trabajo real se realiza en el método genérico, pero el usuario de API aún obtiene los mismos métodos de conveniencia.

Cuestiones relacionadas