Funciones “maybe”
Naturaleza de las funciones “maybe”
- Muchos lectores reconocieron que suelen escribir funciones “maybe” que a veces no hacen nada o devuelven null, y encontraron útil la crítica.
- Otros argumentan que el artículo confunde dos cosas:
- Funciones cuyo comportamiento está oculto / es inconsistente con su tipo (por ejemplo, no actuar en silencio cuando no se ha iniciado sesión).
- Funciones que deben fallar a veces (por ejemplo, al analizar, usuario sin sesión iniciada) y, por tanto, no pueden devolver siempre un valor.
- Varios comentaristas creen que el verdadero problema son las firmas de función que mienten y las comprobaciones ocultas de estado global, no la opcionalidad en sí.
Alternativas: excepciones, nulos y opciones explícitas
- Algunos defienden las excepciones para obtener información del tipo “por qué no” en lugar de null, pero otros critican las excepciones porque no son visibles en las firmas de tipo y son fáciles de pasar por alto en los llamadores.
- Hay debate sobre qué es “excepcional”: ¿“el usuario no ha iniciado sesión” es un flujo normal o un error? Las opiniones difieren según el contrato de la función.
- Muchos prefieren tipos de retorno opcionales/nullable explícitos (
T | null,Option<T>, estiloTryParse) para obligar a los llamadores a manejar la ausencia. - Para colecciones, devolver listas vacías en lugar de null está ampliamente favorecido. El patrón Null Object se considera a veces útil, pero peligroso cuando oculta fallos reales.
Sistemas de tipos, mónadas y soporte del lenguaje
- Varios comentarios conectan el tema con “Maybe vs null”, “parse, don’t validate” y la programación orientada a pipeline/railway: modelar el fallo como tipos de primera clase y empujar su manejo hacia arriba en la pila.
- Varias personas señalan que el “Maybe” del artículo es solo un functor (map) y no una mónada completa (le falta flatMap/bind).
- Hay discusión sobre cómo las mónadas/Options se vuelven “contagiosas”: una vez introducidas, muchas funciones deben manejarlas. Los lenguajes con azúcar sintáctico (
?en Rust, do-notation en Haskell, optional chaining) lo hacen agradable; en JS/Java/Go puede ser torpe.
Patrones de diseño y estructuración del estado
- Hay una fuerte tendencia a mover las comprobaciones de login/validez a los bordes:
- Usar parámetros explícitos de sesión/LoggedInUser en lugar de estado global.
- Asegurar que las funciones que asumen precondiciones reciban argumentos que las codifiquen, evitando el comportamiento “maybe” dentro.
- Algunos ven la proliferación de funciones maybe como una señal de mal diseño del grafo de llamadas y de estado global disperso.
Desacuerdos y pragmatismo
- Algunos rechazan una prohibición absolutista de las funciones maybe, citando patrones como
maybeShowReminderDialogcomo prácticos y DRY. - Otros enfatizan fallar rápido (crashear o rechazo en tiempo de compilación) para errores del programador en lugar de un manejo defensivo excesivo de maybe.