Certains langages de programmation comme par exemple Scala ont le concept de Option
types (également appelés Maybe
), qui peuvent contenir ou non une valeur.
D'après ce que j'ai lu à leur sujet, ils sont largement considérés comme un moyen supérieur de traiter ce problème null
, car ils forcent explicitement le programmeur à considérer les cas où il pourrait ne pas y avoir de valeur au lieu de simplement exploser pendant l'exécution.
Les exceptions vérifiées en Java semblent en revanche être considérées comme une mauvaise idée, et Java semble être le seul langage largement utilisé qui les implémente. Mais l'idée derrière eux semble être quelque peu similaire au Option
type, pour forcer explicitement le programmeur à faire face au fait qu'une exception pourrait être levée.
Existe-t-il des problèmes supplémentaires avec les exceptions cochées que les Option
types n'ont pas? Ou ces idées ne sont-elles pas aussi similaires que je le pense, et il y a de bonnes raisons de forcer une gestion explicite des options et non des exceptions?
la source
Either e a
type de données.Réponses:
Parce que les
Option
s sont composables. Il y a beaucoup de méthodes utiles surOption
qui vous permettent d'écrire du code concis, tout en permettant un contrôle précis du débit:map
,flatMap
,toList
,flatten
et plus encore. Cela est dû au fait qu'ilOption
s'agit d'un type particulier de monade, certains objets que nous savons très bien composer. Si vous n'aviez pas ces méthodes et que vous deviez toujours mettre en correspondance les modèlesOption
ou appelerisDefined
souvent, elles ne seraient pas aussi utiles.Au lieu de cela, bien que les exceptions vérifiées ajoutent une certaine sécurité, vous ne pouvez pas faire grand-chose d'autre que les attraper ou les laisser bouillonner dans la pile (avec le passe-partout ajouté dans la déclaration de type).
la source
try {/* bunch of complex code involving calls to 50 different methods that may throw SomeCheckedException */} catch(SomeCheckedException e) {/* operation failed, do something */}
etfromMaybe someDefaultValue (something >>= otherThing >>= ...50 other functions that may return Nothing...)
c'est quoi exactement? Autre que le fait que le premier vous donne plus de détails sur ce qui a mal tourné.Bien que liés, les exceptions et les objets Maybe ne traitent pas le même type de problèmes.
Exceptions
Les exceptions brillent vraiment lorsque vous devez gérer de manière non locale une situation exceptionnelle (qui dans certains cas se trouve être une erreur). Par exemple, vous analysez un fichier csv et vous souhaitez vous protéger contre les lignes dont le formatage est incorrect. L'endroit où vous trouvez que quelque chose ne va pas peut être des appels de fonction loin de l'itération de ligne. Si vous lancez une exception au niveau le plus profond (où vous découvrez le problème de formatage), vous pouvez l'attraper dans la boucle, consigner l'erreur et passer à la ligne suivante. Vous n'avez rien à modifier dans le reste du code.
L'exception cochée ajoute beaucoup de peine car toutes les fonctions intermédiaires doivent déclarer le type jetable. La fonctionnalité va à l'encontre de l'objectif initial, c'est pourquoi elles ne sont pas populaires de nos jours.
Peut-être des objets
Peut-être que les objets doivent être choisis lorsque vous êtes capable de gérer localement un "échec". En ce sens, ils remplacent un code retour + une API par référence ou un type nullable.
L'avantage de l'objet Maybe est que vous déclarez explicitement que quelque chose ne va pas. Dans haskell, un objet non peut-être doit avoir une valeur, sinon le programme ne compilera pas.
Le problème avec les types nullables est que vous devez vérifier la valeur null tout le temps pour être absolument sûr. L'état "quelque chose pourrait ne pas fonctionner" est celui par défaut.
Le problème avec les codes retour + passer par les ref ref est qu'ils sont moins lisibles pour la plupart des gens.
la source
car avec
Maybe
vous, vous pouvez retarder la gestion de l'erreur jusqu'à ce que vous ayez réellement besoin de la valeur (qui peut être à quelques appels de méthode)alors que l'exception vérifiée doit être gérée sur le lieu de l'appel
le seul avantage des exceptions est que plus d'informations peuvent être transmises sur les raisons de l'échec (sauf si quelqu'un développe un
MaybeError
avec un champ jetable quand c'est une erreur)la source
Maybe
types avec les erreurs de gestion. Une exception est utilisée pour signaler une erreur, un type d'option est utilisé pour représenter le résultat d'une fonction partielle. Une fonction partielle renvoyantNothing
n'est pas une erreur.