2010-08-05 20 views
5

Me pregunto si se debe validar que los argumentos pasados ​​a un método son de cierta clase.¿Validar argumentos en Ruby?

por ejemplo.

def type(hash = {}, array = []) 
    # validate before 
    raise "first argument needs to be a hash" unless hash.class == Hash 
    raise "second argument needs to be an array" unless array.class == Array 

    # actual code 
end 

¿Es inteligente para hacer esto o es sólo engorroso y pérdida de tiempo para validar todos pasaron de argumentos?

¿Hay circunstancias en las que le gustaría tener esta seguridad adicional y circunstancias en las que no se molestará?

¡Comparta su experiencia!

Respuesta

9

No recomendaría este enfoque específico, ya que no puede acomodar las clases que proporcionan semántica de matrices o hash pero no son de esa clase. Si necesita este tipo de validación, es mejor que use respond_to? con un nombre de método. Las matrices implementan el método: [], por lo que vale.

OpenStruct tiene semántica de hash y semántica de método de acceso de atributo, pero no devolverá verdadero para la condición hash.class==Hash. Sin embargo, funcionará como un hash en la práctica.

Para ponerlo en perspectiva, incluso en un lenguaje no dinámico no le gustaría hacerlo de esta manera; preferiría verificar que un objeto implemente IDictionary<T>. Ruby preferiría idiomáticamente que, cuando sea necesario, verifiques que el método exista, porque si lo hace, es probable que el desarrollador tenga la intención de que su objeto actúe de la misma manera. Puede proporcionar cordura adicional con pruebas unitarias alrededor del código del cliente como una alternativa para forzar que las cosas no sean dinámicas.

4

Creo que es innecesario. Una vez leí en un blog algo así como "Si necesitas proteger tu código de personas estúpidas, el rubí no es el idioma para ti".

+1

eso es verdad. por qué validar a tus programadores =) –

1

Si desea contratos de código ejecutados por compilador/tiempo de ejecución, entonces Ruby no es para usted. Si quieres un lenguaje maleable y fácil de probar, entonces Ruby sí lo es.

5

Por lo general, no es necesario validar que los argumentos son de una cierta clase. En Ruby, le recomendamos usar Duck Typing.

1

He descubierto que validar que los parámetros de entrada cumplen con sus precondiciones es una práctica muy valiosa. La persona estúpida de la que te salva es tu. Esto es especialmente cierto para Ruby, ya que no tiene comprobaciones de tiempo de compilación. Si hay algunas características de la entrada de su método que usted sabe que deben ser ciertas, hace que los senes los comprueben en tiempo de ejecución y provoquen errores con mensajes de error significativos. De lo contrario, el código comienza a producir basura para la basura y se obtiene una respuesta incorrecta o una excepción más adelante.

Cuestiones relacionadas