2010-09-17 12 views
9

Utilizo rescue para todo, no solo para "rescatar" excepciones. Quiero decir, me encanta la manera en que me ahorra la verificación y la verificación doble de los datos.¿Estoy abusando de "rescate" por chequeos nulos?

Por ejemplo, digamos que tengo un modelo Item que puede o no tener un User. Entonces, cuando quiero conseguir el nombre del propietario del elemento escribo:

item.user.name rescue "" 

en lugar de algo así como

item.user.nil? ? "" : item.user.name 

Se hace la misma reflexión, ya que nil.name gatillo de una excepción que rescato con "" , pero no estoy muy seguro de que esto sea una buena práctica. Hace lo que quiero, y lo hace con menos código, pero ... No sé, todas esas palabras rescue aquí y allá me hacen sentir inseguro.

¿Es una mala práctica o es abuso válido de la palabra clave rescue?

+1

Avdi Grimm argumenta que 'try' es un código olor http://devblog.avdi.org/2011/06/28/do-or-do-not-there-is-notry/ y http://devblog.avdi.org/2011/07/05/demeter-its-not-just-a-good-idea-its-the-law/, así que no es solo que la forma en que lo está haciendo es malo, sino que lo que estás tratando de hacer es malo. –

+1

@AndrewGrimm alguna relación? – ybakos

+1

@ybakos No lo sé, pero no somos [hermanos] (http://en.wikipedia.org/wiki/Brothers_Grimm). –

Respuesta

7

Creo que estás abusando del rescate un poco, aunque en Rails, hay un método específico para estos problemas: try. Documentation

En su caso, item.user.try(:name) podría ser un enfoque más agradable.

+1

En realidad, porque dijo que un 'elemento' puede o no tener un 'usuario', creo que necesitaría 'item.try (: user) .try (: name)':] –

+1

No lo creo . Si él no tiene ningún artículo, entonces sí, estás en lo correcto. Pero, si el elemento puede o no tener un usuario, ese es el punto completo de usar 'try', para atrapar esas situaciones donde' item.user' devuelve nil en lugar de 'User'. – theIV

1

Al igual que en la mayoría de los demás idiomas, realizar la comprobación usted mismo se ejecutará más rápido que con rescue.

3

Yo diría que esto no es realmente un buen hábito para entrar. Nunca utilicé esta función en Ruby porque parece que estoy ocultando casos de error. También vale la pena señalar que está rescatando todas y cada una de las excepciones sin especificar ningún tipo de error esperado. Siempre ha parecido algo que va a hacer que la depuración sea más difícil de lo que debería ser, aunque, como he dicho, nunca me he molestado en usarlo yo mismo.

1

Como una alternativa a su abuso rescue, compruebe la gema andand. Es similar al try publicado otro sugerido, pero más agradable. andand le permite decir:

item.user.andand.name 

la expresión se nil si item.user es nil.

Cuestiones relacionadas