Algumas linguagens de programação como, por exemplo, Scala, têm o conceito de Option
tipos (também chamados Maybe
), que podem conter um valor ou não.
Pelo que li sobre eles, eles são considerados amplamente uma maneira superior de lidar com esse problema null
, porque forçam explicitamente o programador a considerar os casos em que pode não haver um valor em vez de apenas explodir durante o tempo de execução.
Exceções verificadas em Java, por outro lado, parecem ser uma péssima idéia, e Java parece ser a única linguagem amplamente usada que as implementa. Mas a idéia por trás deles parece ser um pouco semelhante ao Option
tipo, forçar explicitamente o programador a lidar com o fato de que uma exceção pode ser lançada.
Existem alguns problemas adicionais com exceções verificadas que os Option
tipos não possuem? Ou essas idéias não são tão parecidas quanto eu penso, e há boas razões para forçar o tratamento explícito de Opções e não de Exceções?
fonte
Either e a
tipo de dados.Respostas:
Porque
Option
s são composíveis. Há uma série de métodos úteis emOption
que permitem que você escrever código conciso, permitindo ainda um controle preciso sobre o fluxo:map
,flatMap
,toList
,flatten
e muito mais. Isso se deve ao fato deOption
ser um tipo particular de mônada, alguns objetos que sabemos muito bem como compor. Se você não tivesse esses métodos e tivesse que padronizar a correspondência sempreOption
ou ligar comisDefined
frequência, eles não seriam tão úteis.Em vez disso, embora as exceções verificadas adicionem alguma segurança, não há muito o que fazer com elas além de capturá-las ou deixá-las borbulhar na pilha (com o clichê adicionado na declaração de tipo).
fonte
try {/* bunch of complex code involving calls to 50 different methods that may throw SomeCheckedException */} catch(SomeCheckedException e) {/* operation failed, do something */}
efromMaybe someDefaultValue (something >>= otherThing >>= ...50 other functions that may return Nothing...)
é o que exatamente? Além do fato de o primeiro fornecer mais detalhes sobre o que deu errado.Embora relacionados, as exceções e os objetos Talvez não lidam com o mesmo tipo de problemas.
Exceções
As exceções realmente brilham quando você precisa lidar não localmente com uma situação excepcional (que em alguns casos é um erro). Por exemplo, você está analisando um csv e deseja se proteger contra linhas com formatação incorreta. O local em que você descobre que algo está errado pode ser que algumas chamadas de função sejam afastadas da iteração da linha. Se você lançar uma exceção no nível mais profundo (onde você descobrirá sobre o problema de formatação), poderá capturá-la no loop, registrar o erro e prosseguir para a próxima linha. Você não precisa modificar nada no restante do código.
A exceção marcada adiciona muita dor, porque todas as funções intermediárias precisam declarar o tipo jogável. O recurso derrota o objetivo original, razão pela qual eles não são populares atualmente.
Talvez objetos
Talvez os objetos devam ser escolhidos quando você puder lidar localmente com uma "falha". Nesse sentido, eles substituem um código de retorno + passagem por API de referência ou um tipo anulável.
A vantagem do objeto Maybe é que você declara explicitamente que algo pode estar errado. No haskell, um objeto que não seja talvez tenha que ter um valor, caso contrário o programa não será compilado.
O problema com os tipos anuláveis é que você precisa verificar se há nulo o tempo todo para ser absolutamente seguro. O estado "algo pode estar errado" é o padrão.
O problema com os códigos de retorno + pass by ref apis é que eles são menos legíveis para a maioria das pessoas.
fonte
porque
Maybe
você pode atrasar a manipulação do erro até que você realmente precise do valor (que pode ser a falta de alguns métodos)Considerando que a exceção verificada precisa ser tratada no local da chamada
a única vantagem das exceções é que mais informações podem ser transmitidas sobre o motivo da falha (a menos que alguém desenvolva um
MaybeError
com um campo jogável quando houver um erro)fonte
Maybe
tipos com erros de manipulação. Uma exceção é usada para relatar um erro, um tipo de opção é usado para representar o resultado de uma função parcial. Uma função parcial retornadaNothing
não é um erro.