Skip to content

classe mort #22

@Ghaith-kh

Description

@Ghaith-kh

Mission : Détection et nettoyage du code mort dans le microservice

Tu es un agent d'analyse de code Java/Spring Boot. Ta mission est d'identifier
les classes, méthodes et champs qui sont soit :
(A) utilisés UNIQUEMENT dans des classes de test (src/test/**)
(B) jamais utilisés nulle part (dead code total)

Périmètre

  • Analyser uniquement le code sous src/main/java/**
  • Les classes de test se trouvent sous src/test/java/**
  • Ignorer les classes annotées avec : @Configuration, @Component,
    @Service, @Repository, @RestController, @Controller,
    @ControllerAdvice, @RestControllerAdvice, @Entity, @SpringBootApplication,
    @ConfigurationProperties, @Aspect, @EventListener
    → elles peuvent être instanciées par réflexion/Spring.
  • Ignorer aussi les classes implémentant des interfaces Spring
    (Filter, HandlerInterceptor, WebMvcConfigurer, etc.)
  • Ignorer les DTO/records utilisés dans la sérialisation JSON des contrôleurs
    (vérifier les signatures des méthodes @RequestMapping, @PostMapping, etc.)

Méthodologie (étape par étape)

Étape 1 : Inventaire

Liste toutes les classes publiques de src/main/java/** avec leur FQN.

Étape 2 : Analyse des références

Pour CHAQUE classe de src/main, compte les références dans :

  • src/main/java/** (références "prod")
  • src/test/java/** (références "test")

Une référence = import, instanciation, héritage, paramètre, type de retour,
annotation, ou utilisation dans du code.

Étape 3 : Classification

Classe chaque élément dans l'une de ces catégories :

[DEAD] → 0 référence prod ET 0 référence test
[TEST_ONLY] → 0 référence prod ET >=1 référence test
[PROD_USED] → >=1 référence prod (à ignorer du rapport)

Applique la même logique au niveau :

  • Classes
  • Méthodes publiques/package-private (ignorer les privées ici)
  • Champs publics/package-private

Étape 4 : Vérifications de sécurité AVANT de proposer une suppression

Pour chaque candidat à la suppression, vérifie :
☐ Aucune utilisation par réflexion (chercher Class.forName,
getMethod, getDeclaredField avec le nom concerné)
☐ Non référencé dans application.yml, application.properties,
bootstrap.yml (pour les @ConfigurationProperties)
☐ Non référencé dans les fichiers XML sous src/main/resources/**
☐ Non exposé dans une API publique (OpenAPI/Swagger)
☐ Pas une classe de type *Exception, *Event, *Dto utilisée dans un
contrat d'API (à signaler même si TEST_ONLY, mais avec un warning)
☐ Pour les mocks spécifiquement : vérifier que ce n'est pas un stub
volontaire (ex : FakeXxxClient, InMemoryXxxRepository) — dans ce
cas, signaler mais ne PAS proposer la suppression sans validation

Étape 5 : Rapport

Produis un fichier dead-code-report.md structuré ainsi :

1. Code mort total [DEAD]

Pour chaque élément :

  • FQN complet
  • Type (classe / méthode / champ)
  • Fichier + ligne
  • Raison (ex : "Classe publique jamais importée")
  • ⚠️ Risques résiduels (réflexion possible, etc.)
  • ✅ Action recommandée : supprimer

2. Utilisé uniquement dans les tests [TEST_ONLY]

Pour chaque élément :

  • FQN complet
  • Fichiers de test qui l'utilisent
  • Analyse :
    → Si c'est un utilitaire de test → déplacer vers src/test/java/**
    → Si c'est du code prod testé "pour tester" → supprimer code prod + tests
    → Si c'est un builder/fixture → déplacer vers un package *.testsupport
    dans src/test

3. Zone grise (à faire valider par un humain)

  • Classes exposées via API (DTOs, Exceptions) mais non utilisées en prod
  • Éléments potentiellement chargés par Spring/réflexion
  • Stratégie proposée pour chaque

4. Statistiques

  • Nombre total de classes analysées
  • Nombre [DEAD] / [TEST_ONLY] / [PROD_USED]
  • Lignes de code potentiellement supprimables

Contraintes

  • Ne supprime RIEN automatiquement. Produis uniquement le rapport.
  • Sois conservateur : en cas de doute, classe en "Zone grise".
  • Justifie chaque conclusion avec des chemins de fichiers précis.
  • Si tu utilises des outils (grep, ast-grep, IntelliJ inspection,
    mvn dependency:analyze), mentionne-les.

Commandes utiles à exécuter

# Références d'une classe (hors elle-même)
grep -rn "NomClasse" src/ --include="*.java" | grep -v "NomClasse.java"

# Références séparées prod vs test
grep -rn "NomClasse" src/main --include="*.java"
grep -rn "NomClasse" src/test --include="*.java"

# Imports inutilisés (via Maven)
mvn compile -Dmaven.compiler.showWarnings=true

# Analyse statique
mvn org.pitest:pitest-maven:mutationCoverage  # optionnel

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions