Evite comprobar si hay cero al acceder al subelemento

Este es quizás un problema más cosmético, pero lo encuentro realmente molesto ya que siempre termino con un código feo. Y la legibilidad siempre es importante, ¿verdad?

Quiero verificar si existe un valor en un hash dentro de un hash. Entonces lo que hago es esto.

already_exists_data[:data][:user_id]

Pero eso puede generarme una excepción de puntero nulo si: los datos son nulos y verificar: los datos podrían darme un puntero nulo si los datos ya existentes son nulos. Así que lo que termino es esto:

if already_exists_data && already_exists_data[:data] && already_exists_data[:data][:user_id]
    # Do stuff
end

Ahora que es un código de aspecto desagradable. Quizás debería modificar el hash para que sea un objeto. Pero sigo tropezando con este problema a veces y me preguntaba cómo lo enfrentan ustedes.

Actualmente estoy codificando en Ruby, pero he tenido este problema con muchos otros idiomas.

preguntado el 04 de julio de 12 a las 10:07

3 Respuestas

Si le pido a mi mayordomo que recoja la caja de bombones de la mesa del comedor de la calle Victoria 34, le pido precisamente eso. no quiero decir: Ve a buscar la calle Victoria y, si la encuentras, busca el número 34, y si la encuentras...

Puedo hacerlo porque él se da cuenta de sus propios errores: si no encuentra la calle, simplemente regresará con las manos vacías.

Así que deberías usar un try con un controlador de excepciones vacío. En pseudocódigo:

probar {chocolates = calles("Victoria"))(34)("comedor")("mesa")}

En idiomas (como ruby, con algo de andar por casa azúcar sintáctica) donde los bloques son expresiones que podrías escribir:

si prueba {already_exists_data(data)(user_id)}

hacer cosas

El lenguaje mismo también puede ayudar: en perl, $streets{Victoria}[34]{dining_room}{table} es indefinido cuando por ejemplo $streets es. Por supuesto, su mayordomo puede volver a casa con las manos vacías durante años antes de que descubra que la dirección es incorrecta. los try solución de bloque - y su if .. && .... - tienen el mismo inconveniente: úsalos solo cuando realmente no te importe si la calle Victoria tiene el número 34 o no.

contestado el 23 de mayo de 17 a las 11:05

Solución independiente del idioma: no utilice valores nulos. Siempre. Aplique esta regla en todos sus proyectos. Si es absolutamente necesario, envolverlos en Either/Optional que añade claridad. Algunos lenguajes, como Scala, tienen la noción de Optional ya incorporado.

Solución específica de Java: si tiene que usar nulos, anote los argumentos del método y devuelva los valores con @Nullable y @Nonnull. Los IDE decentes (como IntelliJ) son capaces de analizar su código y resaltar posibles null desreferencias, si se adquiere un valor de tal método.

Respondido 06 Jul 12, 15:07

Otra posibilidad es envolver el acceso hash con una llamada de función y hacer el trabajo "sucio" dentro de la función. Entonces su código será algo así como (sintaxis de pseudo-código):

accessHash(already_exists_data, data, userid)

Nota:: puede volverse elegante al acceder a hashes anidados en función de la cantidad de parámetros pasados ​​​​a la función contenedora, por lo que funciona en múltiples situaciones.

Respondido 09 Jul 12, 15:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.