UNPKG

ruch

Version:

Revolutionary React TypeScript CLI with hexagonal architecture & AI-powered development assistance. Create maintainable, scalable applications with domain-driven design and integrated AI tooling.

151 lines (105 loc) 4.86 kB
# Refactoring DomainGraph : Séparation de la Logique Métier ## 🎯 Objectif Déplacer la logique métier du composant `DomainGraph.tsx` vers le dossier `domains/` conformément aux principes de l'architecture hexagonale simplifiée. ## 🔍 Problème Identifié Le composant `DomainGraph.tsx` contenait **~200 lignes de logique métier** : ### Code métier dans le composant (❌ Avant) - **Algorithme de positionnement hiérarchique** des nœuds - **Calcul des niveaux de dépendances** (éviter les cycles) - **Tri par type et priorité** (core, shared, feature) - **Transformation des données** GraphData → ReactFlow - **Logique de style et de couleurs** métier ### Code de présentation approprié (✅) - Rendu JSX des composants ReactFlow - Gestion des événements UI (onConnect, onNodesChange) - Styles CSS et layout visuel ## 🔧 Solution Appliquée ### 1. Création du `GraphLayoutService` **Fichier :** `src/domains/graph/services/GraphLayoutService.ts` ```typescript export class GraphLayoutService { // ✅ Algorithme de positionnement hiérarchique calculateHierarchicalLayout(nodes, edges): Map<string, { x; y }>; // ✅ Extraction des données de label getNodeLabelData(node): NodeLabelData; // ✅ Calcul des styles de nœuds getNodeStyle(node, getDomainColor): CSSProperties; // ✅ Préparation des données d'edges getEdgeData(edge, allEdges): EdgeData; // ✅ Configuration du layout updateConfig(config): void; } ``` ### 2. Injection dans ServiceContext **Fichier :** `src/context/ServiceContext.tsx` ```typescript interface Services { graphService: GraphService; graphLayoutService: GraphLayoutService; // ✅ Nouveau service } ``` ### 3. Refactoring du Composant **Fichier :** `src/components/DomainGraph.tsx` #### Avant (❌ 270 lignes avec logique métier) ```typescript // Algorithme complexe de positionnement dans le composant const positionNodes = (nodes) => { // 80+ lignes de logique métier... }; ``` #### Après (✅ 170 lignes de présentation pure) ```typescript const { graphLayoutService } = useServices(); // Délégation claire vers le service const positions = graphLayoutService.calculateHierarchicalLayout( graphData.nodes, graphData.edges ); ``` ## 📊 Métriques d'Amélioration | Aspect | Avant | Après | Amélioration | | ---------------------------- | ------------ | ----------- | -------------------------- | | **Lignes dans composant** | 270 | 170 | **-37%** | | **Logique métier dans UI** | ~200 lignes | 0 lignes | **-100%** | | **Responsabilités séparées** | ❌ Mélangées | ✅ Séparées | **Architecture claire** | | **Testabilité** | Complexe | Simple | **Tests unitaires isolés** | ## 🧪 Tests Créés ### Tests du Service (`GraphLayoutService.test.ts`) - **10 tests** couvrant toute la logique métier - Tests d'algorithme de positionnement hiérarchique - Tests de gestion des dépendances circulaires - Tests de styles et de configuration ### Tests d'Intégration - App Component continue de fonctionner (15 tests) - Aucune régression détectée ## 🏗️ Architecture Respectée ### ✅ Principe de Séparation ``` 📁 src/ ├── components/ # 🎨 PRÉSENTATION UNIQUEMENT │ └── DomainGraph.tsx # Rendu ReactFlow, gestion UI ├── domains/ # 🧠 LOGIQUE MÉTIER UNIQUEMENT │ └── graph/ │ └── services/ │ └── GraphLayoutService.ts # Algorithmes, calculs └── context/ # 🔌 INJECTION DE DÉPENDANCES └── ServiceContext.tsx # Services disponibles ``` ### ✅ Avantages Obtenus 1. **Maintenabilité** : Logique métier isolée et testable 2. **Réutilisabilité** : Service peut servir pour d'autres vues 3. **Évolutivité** : Facile d'ajouter de nouveaux algorithmes de layout 4. **Testabilité** : Tests unitaires purs sans mocking ReactFlow 5. **Conformité** : Respect total de l'architecture hexagonale ## 🎯 Résultat Final **Statut des tests :****91/91 tests passent** (100% success) - **GraphLayoutService** : 10 tests unitaires ✅ - **App Component** : 15 tests d'intégration ✅ - **Autres composants** : 66 tests ✅ ## 🚀 Prochaines Étapes Recommandées 1. **Appliquer le même pattern** aux autres composants avec logique métier 2. **Créer des services** pour les algorithmes de détection des dépendances circulaires 3. **Extraire la logique de couleurs** vers un service dédié 4. **Considérer des hooks personnalisés** pour simplifier l'usage des services dans les composants --- ✅ **Mission accomplie** : La logique métier est maintenant correctement séparée et placée dans le dossier `domains/`