Algunos lenguajes de programación como, por ejemplo, Scala tienen el concepto de Option
tipos (también llamados Maybe
), que pueden contener un valor o no.
Por lo que he leído sobre ellos, se los considera ampliamente como una forma superior de abordar este problema null
, ya que obligan explícitamente al programador a considerar los casos en los que podría no haber un valor en lugar de explotar durante el tiempo de ejecución.
Las excepciones marcadas en Java, por otro lado, parecen considerarse una mala idea, y Java parece ser el único lenguaje ampliamente utilizado que las implementa. Pero la idea detrás de ellos parece ser algo similar al Option
tipo, para obligar explícitamente al programador a lidiar con el hecho de que se puede lanzar una excepción.
¿Hay algunos problemas adicionales con las excepciones marcadas que los Option
tipos no tienen? ¿O estas ideas no son tan similares como creo, y hay buenas razones para forzar el manejo explícito de las Opciones y no de las Excepciones?
fuente
Either e a
tipo de datos.Respuestas:
Porque
Option
s son componibles. Hay un montón de métodos útiles enOption
que le permiten escribir código concisa, al tiempo que permite un control preciso sobre el desarrollo:map
,flatMap
,toList
,flatten
y mucho más. Esto se debe al hecho de queOption
es un tipo particular de mónada, algunos objetos que sabemos muy bien cómo componer. Si no tuviera estos métodos y tuviera que hacer coincidir los patrones siempreOption
, o llamar conisDefined
frecuencia, no serían tan útiles.En cambio, si bien las excepciones marcadas agregan algo de seguridad, no hay mucho que pueda hacer con ellas aparte de atraparlas o dejar que se acumulen en la pila (con la placa adicional en la declaración de tipo).
fuente
try {/* bunch of complex code involving calls to 50 different methods that may throw SomeCheckedException */} catch(SomeCheckedException e) {/* operation failed, do something */}
yfromMaybe someDefaultValue (something >>= otherThing >>= ...50 other functions that may return Nothing...)
¿qué es exactamente? Aparte del hecho de que el primero te da más detalles de lo que salió mal.Si bien están relacionadas, las excepciones y los objetos Quizás no abordan el mismo tipo de problemas.
Excepciones
Las excepciones realmente brillan cuando tienes que lidiar de manera no local con una situación excepcional (que en algunos casos es un error). Por ejemplo, está analizando un csv y desea protegerse contra líneas con un formato incorrecto. El lugar donde encuentra que algo está mal puede ser algunas llamadas de función alejadas de la iteración de línea. Si lanza una excepción en el nivel más profundo (donde se entera del problema de formato), puede atraparla en el bucle, registrar el error y pasar a la siguiente línea. No tiene que modificar nada en el resto del código.
La excepción marcada agrega mucho dolor porque todas las funciones intermedias tienen que declarar el tipo arrojable. La característica derrota el propósito original, por lo que no son populares hoy en día.
Quizás objetos
Tal vez los objetos deberían ser elegidos cuando pueda lidiar localmente con un "fallo". En ese sentido, son un reemplazo para un código de retorno + paso por api de referencia o un tipo anulable.
La ventaja del objeto Maybe es que declaras explícitamente que algo puede estar mal. En haskell, un objeto que no sea tal vez debe tener un valor, de lo contrario, el programa no se compilará.
El problema con los tipos anulables es que debe verificar nulo todo el tiempo para estar absolutamente seguro. El estado "algo podría estar mal" es el predeterminado.
El problema con los códigos de retorno + apis de referencia es que son menos legibles para la mayoría de las personas.
fuente
porque con
Maybe
usted puede retrasar el manejo del error hasta que realmente necesite el valor (que puede estar a unas pocas llamadas de método)mientras que la excepción marcada debe manejarse en la ubicación de la llamada
El único aspecto positivo de las excepciones es que se puede transmitir más información sobre por qué falló (a menos que alguien desarrolle un
MaybeError
campo arrojable cuando se trata de un error)fuente
Maybe
tipos con los errores de manejo. Se usa una excepción para informar un error, se usa un tipo de opción para representar el resultado de una función parcial. El retorno parcial de una funciónNothing
no es un error.