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
Markdown
# 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/`