Maybe Functions
Nature of funções “maybe”
- Muitos leitores reconheceram que frequentemente escrevem funções “maybe” que às vezes não fazem nada ou retornam null, e acharam a crítica útil.
- Outros argumentam que o artigo confunde duas coisas:
- Funções cujo comportamento está oculto / é inconsistente com seu tipo (por exemplo, não agir silenciosamente quando não está logado).
- Funções que precisam às vezes falhar (por exemplo, parsing, usuário deslogado) e, portanto, nem sempre podem retornar um valor.
- Vários comentaristas acham que o verdadeiro problema são assinaturas de funções que mentem e verificações ocultas de estado global, não a opcionalidade em si.
Alternativas: exceptions, nulls e opções explícitas
- Alguns defendem exceptions para informações de “por que não” em vez de null, mas outros criticam exceptions por serem invisíveis nas assinaturas de tipo e fáceis de passar despercebidas pelos chamadores.
- Há debate sobre o que é “excepcional”: “usuário não está logado” é fluxo normal ou erro? As opiniões diferem conforme o contrato da função.
- Muitos preferem tipos de retorno opcionais/nuláveis explícitos (
T | null,Option<T>, estiloTryParse) para que os chamadores sejam obrigados a tratar a ausência. - Para coleções, retornar listas vazias em vez de null é amplamente favorecido. O padrão Null Object é visto como ocasionalmente útil, mas perigoso quando esconde falhas reais.
Sistemas de tipos, monads e suporte da linguagem
- Vários comentários conectam o tema a “Maybe vs null”, “parse, don’t validate” e programação orientada a pipeline/railway: modelar falhas como tipos de primeira classe e empurrar o tratamento para cima na stack.
- Múltiplas pessoas observam que o “Maybe” do artigo é apenas um funtor (map) e não uma monad completa (faltando flatMap/bind).
- Há discussão sobre como monads/Options se tornam “infecciosos”: uma vez introduzidos, muitas funções precisam lidar com eles. Linguagens com açúcar sintático (
?em Rust, do-notation em Haskell, optional chaining) tornam isso agradável; em JS/Java/Go pode ser desajeitado.
Padrões de design e estruturação de estado
- Forte impulso para mover verificações de login/validade para as bordas:
- Usar parâmetros explícitos de sessão/LoggedInUser em vez de estado global.
- Garantir que funções que assumem pré-condições recebam argumentos que as codifiquem, evitando comportamento “maybe” interno.
- Alguns veem a proliferação de funções maybe como sinal de mau design do grafo de chamadas e de estado global espalhado.
Desacordos e pragmatismo
- Alguns rejeitam uma proibição absolutista de funções maybe, citando padrões como
maybeShowReminderDialogcomo práticos e DRY. - Outros enfatizam falhar rápido (crash ou rejeição em tempo de compilação) para erros do programador, em vez de um tratamento maybe excessivamente defensivo.