2011-06-24 18 views
36

Me pregunto si hay un principio de programación específico (¿Demeter?) Que respalde la idea de que los ayudantes de Rails nunca deberían usar variables de instancia de controlador, sino que deberían recibir variables tales como parámetros de función. Por ejemplo, supongamos que mi acción ChickensController#squawk crea una variable de instancia llamada @egg. Por otra parte, supongamos que la vista squawk contiene una llamada a un ayudante llamado cockadoodledoo, implementado de esta manera:¿Los ayudantes de Rails suponen que existe una variable de instancia o deberían recibirlos como parámetros?

def cockadoodledoo 
    @egg.to_s 
end 

¿Sería mejor o innecesariamente prolijo para pasar @egg como un parámetro, de modo que la vista llama cockadoodledoo(@egg) y para el ayudante a parecerse a:

def cockadoodledoo(egg) 
    egg.to_s 
end 

espero que uno de los piratas informáticos felices es lo suficientemente aburrido viernes por la tarde para hacer valer una respuesta. Cockadoodledoo!

This question here is similar, but was never accurately answered.

+0

Oooh tantas respuestas bonitas y una sola marca de verificación para dar ... Gracias a todos. – ybakos

Respuesta

29

los reciben como parámetro. De lo contrario, a medida que crece la aplicación, es muy difícil rastrear dónde se configuran los valores de instancia cuando se refactoriza, soluciona problemas, etc.

Además, creo que hay una mejor práctica general para usar solo variables de instancia en vistas dentro de la inicial plantilla ... y a partir de ahí debe pasar la var en ayudantes y otros parciales.

+0

¿Alguien sabe dónde se menciona esta mejor práctica o cómo se llama? – ybakos

+2

Publicar y nombrar las mejores prácticas es tan '90s ... –

+5

Fabio, no estoy de acuerdo.Ciertamente, no queremos imponer reglas draconianas en el Arte de la Programación, pero es muy valioso nombrar cosas. Por ejemplo, el "principio DRY". – ybakos

16

diría que siempre debe pasar las variables explícitamente a su ayudante por 2 razones:

  • controlar exactamente lo que haces

  • por encima de todo, usted puede probar su ayudante

+3

No pensé en la capacidad de prueba. ¿Me atraparon con los pantalones bajados? (Sí, debería escribir más pruebas). – ybakos

+0

Mejorar la capacidad de probar el helper aquí es la clave. Gracias por llamar esto de manera explícita. – kries

7

Como los mensajes de ayuda se mezclan en todos los controladores, por lo tanto están disponibles para todas las vistas (incluidos parciales y diseños), siempre es aconsejable establecer un contrato claro - Los parametros.

La única excepción que pude pensar es cuando una variable de instancia también está disponible para todas las vistas y controladores, como un menú o algo similar.

+0

¿Por qué la excepción? – ybakos

+2

No hay razón, solo estaba tratando de encontrar uno (ya sabes, cada regla tiene una excepción), pero creo que podría haber insistido demasiado. –

11

No sé si hay algún principio que gobierne este tipo de cosas, pero me gustaría pasar un argumento. El argumento no solo hará que su ayudante sea más fácil de probar y que el flujo de datos de su aplicación sea más fácil de seguir, sino que también le permitirá usar un solo ayudante para una sola instancia, además de una lista; si se pasa un argumento entonces ambos:

<%= cockadoodledoo @egg %> 

y:

<% @eggs.each do |egg| %> 
    <%= cockadoodledoo egg %> 
<% end %> 

funcionará como se espera, sin introducir un especial cockadoodledoo que maneja una lista de @eggs en lugar de una sola @egg.

+2

Esa es una buena ilustración de alguna versatilidad libre, gracias. – ybakos

Cuestiones relacionadas