Aller au contenu

Semaine 5a : JOUR 3 – VAVR, GESTION FONCTIONNELLE DES ERREURS & SONARQUBE

Formation Java / Spring Boot – Robustesse & qualité industrielle


Objectifs

À l’issue de cette journée, vous serez capable de :


PARTIE 1 – POURQUOI CHANGER LA GESTION DES ERREURS ?

Lien vers un cours complet sur VAVR


1) Problème des exceptions classiques

Exemple classique :

public Compte trouver(String numero) {
    Compte c = repository.findByNumero(numero)
        .orElseThrow(() -> new IllegalArgumentException("Introuvable"));
    return c;
}

Problèmes :

Les exceptions sont puissantes mais parfois trop brutales !


PARTIE 2 – INTRODUCTION À VAVR


2) Qu’est-ce que Vavr ?

Vavr est une bibliothèque qui apporte…

Dépendance :

<dependency>
  <groupId>io.vavr</groupId>
  <artifactId>vavr</artifactId>
  <version>0.10.4</version>
</dependency>

PARTIE 3 – OPTION


3) Option vs Optional

Option est plus riche que Optional.

Exemple :

Option<Compte> compte = Option.ofOptional(
    repository.findByNumero(numero)
);

Traitement :

compte
  .map(Compte::getSolde)
  .getOrElse(BigDecimal.ZERO);

But :


PARTIE 4 – EITHER (LE PLUS IMPORTANT)


4) Either : succès OU erreur explicite

Structure :

Either<Erreur, Resultat>

Exemple :

public Either<String, Compte> trouverCompte(String numero) {

    return repository.findByNumero(numero)
        .map(Either::<String, Compte>right)
        .orElse(Either.left("Compte introuvable !"));
}

5) Pourquoi Either est puissant ?

Avec les Exceptions, on utilise throw et on interrompt le processus.

Avec Either, on retourne une valeur, on compose et on garde le contrôle.


6) Composition fluide

trouverCompte("FR001")
  .flatMap(compte -> verifierSolde(compte))
  .map(compte -> effectuerDebit(compte));

Pas de try/catch, Pas de throw et le flux est plus lisible !


PARTIE 5 – TRY


7) Try : encapsuler une exception

Try.of(() -> service.virer(...))
   .onFailure(e -> log.error("Erreur", e))
   .onSuccess(r -> log.info("Succès"));

But :


PARTIE 6 – APPLICATION CONCRÈTE DANS VOTRE PROJET


8) Refactoriser VirementService

Avant :

public void virer(...) {
    if (compteSrc == null) throw ...
}

Après :

public Either<String, Void> virer(...) {

    return trouverCompte(src)
        .flatMap(c -> verifierMontant(c, montant))
        .map(c -> {
            c.debiter(montant);
            return null;
        });
}

9) Adapter le contrôleur REST

Either<String, Void> result = service.virer(...);

if (result.isLeft()) {
    return ResponseEntity.badRequest().body(result.getLeft());
}
return ResponseEntity.ok().build();

La gestion est explicite et il n’y a pas d’exception technique.


PARTIE 7 – INTRODUCTION À SONARQUBE


10) Pourquoi SonarQube ?

Sonar analyse :

Il donne une mesure objective de qualité.


PARTIE 8 – INSTALLATION SONARQUBE

Pour l’installation avec Docker, nous verrons en fonction des besoin et de l’utilisation par CA-Titres. Finalement, vous n’utilisez pas docker, donc, on trouvera une autre solution.

Docker

docker run -d -p 9000:9000 sonarqube:lts

Accès :

http://localhost:9000

Login :


PARTIE 9 – CONFIGURATION MAVEN


Ajouter plugin :

<plugin>
  <groupId>org.sonarsource.scanner.maven</groupId>
  <artifactId>sonar-maven-plugin</artifactId>
  <version>3.9.1.2184</version>
</plugin>

Exécution :

mvn sonar:sonar \
  -Dsonar.projectKey=banklite \
  -Dsonar.host.url=http://localhost:9000 \
  -Dsonar.login=token

PARTIE 10 – ANALYSE DES RÉSULTATS


Sonar fournit :


Exemple d’amélioration concrète

Sonar détecte :

Action :


PARTIE 11 – INTÉGRATION GITLAB


Dans .gitlab-ci.yml :

sonar:
  stage: test
  script:
    - mvn verify sonar:sonar

But :


PARTIE 12 – TRAVAUX PRATIQUES


TP 1 – Refactorisation avec Vavr


TP 2 – Analyse avec Sonar


TP 3 – Comparaison Exception et Either


ERREURS FRÉQUENTES

  1. Utiliser Vavr partout inutilement
  2. Complexifier le code
  3. Ignorer Sonar
  4. Corriger juste pour faire du vert
  5. Ignorer duplication
  6. Laisser des méthodes géantes
  7. Mélanger paradigme fonctionnel et impératif sans cohérence

Synthèse

Vous savez désormais :


Prêt.e pour un projet complet

APPLICATION COMPLÈTE INTÉGRATIVE AVEC :