Aller au contenu principal

Immutabilité vs Mutabilité

La question

Devons-nous toujours utiliser des opérations mutables ou immuables ?

La réponse : Immuable par défaut

// ❌ Mutable (style Lodash) - À ÉVITER
const array = [1, 2, 3];
_.reverse(array); // Modifie l'original !
console.log(array); // [3, 2, 1] 😱

// ✅ Immuable (style Pithos) - À PRÉFÉRER
const array = [1, 2, 3];
const reversed = reverse(array); // Nouvelle instance
console.log(array); // [1, 2, 3] ✓
console.log(reversed); // [3, 2, 1] ✓

Règles Pithos

PrincipeImplémentation
Immuable par défautToutes les fonctions retournent de nouvelles instances
Pas d'effets de bordLes fonctions ne modifient jamais leurs arguments
Comportement prévisibleMême entrée = même sortie (transparence référentielle)
Variantes mutables (optionnel)Suffixe Mut pour les rares cas critiques en performance

Les rares exceptions

Pour les cas critiques en performance où la mutation est nécessaire :

// Version immuable (par défaut)
export const shuffle = <T>(array: T[]): T[] => {
const result = [...array];
// ... Fisher-Yates sur result
return result;
};

// Version mutable (optionnelle, pour la performance)
export const shuffleMut = <T>(array: T[]): T[] => {
// ... Fisher-Yates en place
return array; // Retourne le même tableau modifié
};

Pourquoi immuable ?

  • Prévisibilité : Plus facile à raisonner et débugger
  • React/Vue/Solid : Les frameworks modernes attendent l'immutabilité
  • Sécurité concurrente : Pas de conditions de course avec des données partagées
  • Time-travel debugging : Redux DevTools, etc.
  • Fonctions pures : Meilleures pour les tests et la composition
astuce

Performance : Avec les moteurs JS modernes (V8), le coût de la copie est souvent négligeable.

Optimisez uniquement après avoir mesuré un vrai goulot d'étranglement.


Related