17 Mai 2023
L'analyse de dépendances proposée dans l'épisode précédent de la série sur l'outillage d'analyse des structures logicielles ne concernait que les dépendances internes du composant. Cette approche est plus intéressante lorsqu'elle considère les dépendances externes. La nouvelle version de l'outil CodeMap intègre cette analyse des dépendances externes de chaque type du composant.
Cette fonction d'analyse des dépendances externes est particulièrement utile pour maitriser les adhérences technologiques de chaque module du composant. Si on reprend l'exemple du composant JAM déjà utilisé dans l'article précédent, on peut définir les dépendances légales entre les quatre modules "model", "view", "control", "core" et les technologies supports.
La mise en place des règles de dépendances technologiques pour l'analyse JAM aboutit à la configuration suivante :
# MVC dependencies fr\.arduino\.jam\.view\..*;fr\.arduino\.jam\.model\..* fr\.arduino\.jam\.view\..*;fr\.arduino\.jam\.control\..* fr\.arduino\.jam\.control\..*;fr\.arduino\.jam\.model\..* fr\.arduino\.jam\.model\..*;fr\.arduino\.jam\.core\..* # Java standard dependencies .*;java\.lang\..* .*;java\.text\..* .*;java\.util\..* fr\.arduino\.jam\.core\..*;java\.io\..* fr\.arduino\.jam\.core\..*;java\.net\..* # JavaFX dependencies fr\.arduino\.jam\.control\..*;javafx\..* fr\.arduino\.jam\.model\..*;javafx\.beans\.property\..* fr\.arduino\.jam\.view\..*;javafx\..* # Other technological dependencies fr\.arduino\.jam\.core\..*;gnu\.io\..* fr\.arduino\.jam\.model\..*;javax\.xml\..*
En menant l'analyse de dépendances avec ces règles on obtient le résultat suivant :
================================================= === Violations ================================================= List of illegal dependencies - From fr.arduino.jam.view.ChartView to fr.arduino.jam.core.ParameterListener - From fr.arduino.jam.model.ParameterOccurrenceDelegator to javafx.application.Platform - From fr.arduino.jam.view.ListView to fr.arduino.jam.core.ParameterOccurrence - From fr.arduino.jam.view.MimicView to fr.arduino.jam.core.ParameterOccurrence - From fr.arduino.jam.model.ParameterOccurrenceRelay to javafx.collections.ObservableList - From fr.arduino.jam.view.MimicView to fr.arduino.jam.core.ParameterListener - From fr.arduino.jam.view.Jam to fr.arduino.jam.core.ParameterOccurrence - From fr.arduino.jam.model.JamModel to java.io.File - From fr.arduino.jam.view.ChartView to fr.arduino.jam.core.ParameterOccurrence - From fr.arduino.jam.view.MimicView to java.io.File
La coloration des lignes du rapport ci-dessus permet de distinguer différents cas de figure :
Cet exemple illustre l'utilisation de l'outil CodeMap dans une démarche de gestion des couplages externes et des adhérences technologiques. Habituellement, on peut se contenter d'un contrôle du gestionnaire de dépendances (Maven dans notre cas, mais ce pourrait être de l'OSGi ou du NPM dans un contexte JavaScript). Mais cette approche classique pose un double problème :
Le système proposé par CodeMap se rapproche plutôt du concept de module introduit dans Java 9. Dans un projet exclusivement basé sur ce langage, on pourra d'ailleurs préférer ce mécanisme standard. Mais si le projet est antérieur à Java 9, qu'on souhaite avoir une centralisation des dépendances légales ou s'affranchir de la nécessité d'expliciter les export, l'utilisation de CodeMap peut être la solution.
Le contrôle des dépendances à la fois internes et externes que propose l'outil permet d'assurer le respect d'une architecture intentionnelle basée sur des règles de dépendances strictes. Par exemple, prenons l'architecture hexagonale suivante:
Avec cette architecture intentionnelle, il est possible d'utiliser CodeMap pour :
Il devient alors possible de vérifier régulièrement que l'architecture effective respecte bien l'architecture intentionnelle.