Nous avons vue dans le précédent post un pseudo-container qui nous permet d’emballer nos valeurs. Nous allons muscler un peu notre container mais partons d’un exemple.
Je souhaite récupérer le mail du client “bob” ou afficher “pas de mail”
1 2 3 4 5 6 7 |
|
Facile non ?
Si getAdress()
renvoie null, Outch …
1
|
|
L’utilisateur n’existe pas forcement et puis l’adresse est peut-être vide.. Une implémentation naïve
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Ce code vous le connaissez, vous l’avez probablement déjà écris, il y a moyen d’optimiser de faire plus propre.
Deux containers pour le prix d’un.
Le Maybe à la rescousse..
Voici le Maybe en dessin.
J’ai un container Some
et un Container Nothing
.
Le container Nothing
est un container qui n’a aucune valeurs. La méthode map
renvoie toujours un container Nothing
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Le container Some
le résultats de map
est un nouveau container Some
s’il y a un résultat non-null sinon c’est un container Nothing
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
Enfin j’ai besoin d’un helper
1 2 3 4 5 |
|
Notons que j’ai une méthode qui me permet de sortir avec une valeurs par défaut
Quelques exemples:
1 2 3 4 5 6 7 8 |
|
Nous pouvons simplifier notre problème
En le refactorisant ainsi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Quelques dessins Le cas ou tout marche
Le cas ou getUser()
renvoie null
Sympa la refactorisation. On peux supprimer ainsi une partie de la logique (la plupart des if, les nulls ont tous disparus).
Une librairie toute faite
Je vais parler de php-option. Si vous faite du symfony2 vous l’avez déja dans votre /vendor
et vous ne le saviez pas.
La syntaxe est un peu près le même
Mais il y a plein de fonctionnalités
1 2 3 |
|
Il y a aussi des possibilité de chainer les réponses si pas de résultats
1 2 |
|
Nous n’utilisons que l’instruction map
pour le moment. Donc nous n’utilisons pas le container en tant que monade mais plutôt en tant que functor. Nous verrons cela dans le troisième post.
Conclusion
Je suis désolé si certain termes sont inexacts comme le container. Je ne suis pas un expert, mais j’admets bien volontiers mon erreur.
Si vous avez un code ou vous vérifiez tout le temps si les valeurs sont nulles. Il y a probablement moyen que cette structure vous aide.
Dans le prochain Post nous utiliserons le Maybe avec l’instruction bind
.
- Partie 1 : Monade/Functor
- Partie 2 : Le functor Maybe
- Partie 3 : Le functor Maybe avec le Bind
- Partie 4 : Les listes
- Interlude : Les évaluations partielles
- Partie 5 : Les applicatives
- Partie 6 : Les applicatives et les listes