Una parte de mi programa obtiene datos de muchas tablas y columnas de mi base de datos para su procesamiento. Algunas de las columnas pueden ser null
, pero en el contexto de procesamiento actual es un error.
Esto "teóricamente" no debería suceder, por lo que si lo hace, apunta a datos incorrectos o un error en el código. Los errores tienen diferentes severidades, dependiendo de qué campo es null
; es decir, para algunos campos, el procesamiento debe detenerse y alguien debe ser notificado; para otros, se debe permitir que el procesamiento continúe y simplemente notificar a alguien.
¿Hay alguna buena arquitectura o principios de diseño para manejar las null
entradas raras pero posibles ?
Las soluciones deberían ser posibles de implementar con Java, pero no utilicé la etiqueta porque creo que el problema es algo agnóstico al lenguaje.
Algunos pensamientos que tuve yo mismo:
Usando NOT NULL
Lo más fácil sería usar una restricción NOT NULL en la base de datos.
Pero, ¿qué sucede si la inserción original de los datos es más importante que este paso de procesamiento posterior? Por lo tanto, en caso de que el inserto pusiera un elemento null
en la tabla (ya sea por errores o incluso por alguna razón válida), no quisiera que el inserto falle. Digamos que muchas más partes del programa dependen de los datos insertados, pero no de esta columna en particular. Por lo tanto, prefiero arriesgarme al error en el paso de procesamiento actual en lugar del paso de inserción. Es por eso que no quiero usar una restricción NOT NULL.
Ingenuamente dependiendo de NullPointerException
Podría usar los datos como si esperara que siempre estuvieran allí (y ese debería ser realmente el caso), y capturar los NPE resultantes en un nivel apropiado (por ejemplo, para que el procesamiento de la entrada actual se detenga pero no todo el progreso del procesamiento) ) Este es el principio de "falla rápida" y a menudo lo prefiero. Si es un error, al menos obtengo un NPE registrado.
Pero luego pierdo la capacidad de diferenciar entre varios tipos de datos faltantes. Por ejemplo, para algunos datos faltantes, podría omitirlos, pero para otros, el procesamiento debería detenerse y notificar a un administrador.
Comprobando null
antes de cada acceso y lanzando excepciones personalizadas
Las excepciones personalizadas me permitirían decidir la acción correcta en función de la excepción, por lo que este parece ser el camino a seguir.
Pero, ¿qué pasa si me olvido de revisarlo en alguna parte? Además, abarroto mi código con verificaciones nulas que nunca o raramente se esperan (y definitivamente no forman parte del flujo de lógica de negocios).
Si elijo seguir este camino, ¿qué patrones son los más adecuados para el enfoque?
Cualquier pensamiento y comentario sobre mis enfoques son bienvenidos. También mejores soluciones de cualquier tipo (patrones, principios, mejor arquitectura de mi código o modelos, etc.).
Editar:
Hay otra restricción, ya que estoy usando un ORM para hacer el mapeo de DB a objeto de persistencia, por lo que hacer comprobaciones nulas en ese nivel no funcionaría (ya que los mismos objetos se usan en partes donde el nulo no hace ningún daño) . Agregué esto porque las respuestas proporcionadas hasta ahora mencionaron esta opción.