Même les meilleurs développeurs FP font cette erreur simple à corriger

Vous n’avez pas les bases en qualité de code si vous utilisez flatMap et map de cette façon !

Start-up Dev [fr]
2 min readMar 17, 2023
Ne faites plus cette erreur basique que font les même les meilleurs dev (Image créée l’auteur)

Les fonctions map and flatMap sont les pierres angulaires de la programmation fonctionnelle (FP). C’est la base. J’ai pourtant vu des développeurs FP expérimentés et talentueux faire n’importe quoi avec !

Soyez meilleur et ne faites jamais cette erreur.
C’est simple !

Map et FlatMap

Pour bien comprendre, voici un rappel succinct concernant les méthodes map et flatMap (telles que définies pour Option en scala) :

def map[B](f: A => B): Option[B] = if (isEmpty) None else Some(f(this.get))
def flatMap[B](f: A => Option[B]): Option[B] = if (isEmpty) None else f(this.get)
  • S’il n’y avait aucune valeur définie, rien ne change
  • Si une valeur était définie, elle est transformée via la fonction f

La différence entre les deux méthodes se trouve dans le fait que flatMap simplifie ou “aplatit” le résultat (“flattenen anglais).
-> Some(Some(“hello”)) devient Some(“hello”)

Ce qu’il ne faut jamais faire

Comme vous le savez, map et flatMap servent à transformer une valeur dans le cas où elle est définie.

Considérons donc le cas d’un code métier (business logic) qui:

  • Sauvegarde le résultat d’un traitement ;
  • Notifie un tiers du résultat, dans certains cas spécifiques.

Model de données

J’ai simplifié le model de données pour se concentrer sur la mauvaise pratique que je vais vous montrer ci-dessous.

Retenez juste qu’un certain traitement génère une valeur (value: Int) et potentiellement un statut (maybeStatus: Option[Status]).

Services

Pour les plus curieux, voici la définition des services :

Logique métier : NE FAITES JAMAIS CA SVP !

Le comportement attendu consiste à envoyer une notification uniquement dans les cas où maybeStatus a une valeur définie et que cette valeur correspond à certains cas attendus de Event.fromStatus :

La grave erreur dans ce code, c’est d’utiliser map !

C’est bien sûr tout à fait valide d’un point de vue programmation FP, mais ça exprime très mal l’intention du code. Dans un vrai code en production, il peut devenir très compliqué de comprendre ce que le programme est censé faire si on utilise map et flatMap n’importe comment.

Comme vous le constatez, ce code est louche.

Pourquoi maybeStatus est transformé en Event mais n’est jamais utilisé ?

Comment savoir s’il n’y a pas eu une coquille (ou un mauvais copier-coller)?

A la place, je vous encourage à définir et bien nommer une valeur qui représente les cas pour lesquels l’opération doit être exécutée.

Dans cet exemple, j’utilise Option.when pour envoyer la notification uniquement dans les cas attendus :

C’est plus simple à lire.
Et on ne se demande pas pourquoi la valeur transformée par flatMap n’est jamais utilisée.

Soyez meilleur et ne faites jamais cette erreur.

--

--