L'encapsulation consiste à isoler les données et les méthodes d'un objet, rendant leur accès externe impossible sans contrôle. Ce pilier de la programmation orientée objet (POO) est essentiel pour gérer un code complexe et éviter les bugs imprévus.
Imaginez une application de zoo pour enfants comptant des centaines de milliers de lignes de code. Au cœur de cette application se trouve un objet central nommé animal. Si n'importe quelle partie du programme peut y accéder et le modifier librement, le chaos s'installe rapidement.
Par exemple, un porcelet modifie animal avec ses attributs (nom : "porcelet", pattes : 4, couleur : "rose", décoration : "museau"), puis une chèvre le surcharge (nom : "chèvre", décoration : "cornes"). Résultat : des chèvres roses et des porcelets cornus !
En JavaScript/TypeScript, cela ressemble à ceci :
let animal = { nom: "porcelet", pattes: 4, couleur: "rose", decoration: "museau" };
animal.nom = "chèvre";
animal.decoration = "cornes";
console.log(animal); // { nom: "chèvre", pattes: 4, couleur: "rose", decoration: "cornes" }Dans une base de code massive, traquer ces interférences peut prendre des centaines d'heures, et les correctifs génèrent souvent plus de code spaghetti. La solution : les classes.
Les classes permettent d'instancier des objets indépendants, chacun avec ses propres propriétés, évitant ainsi les interférences accidentelles.
Créons une classe Animal :
class Animal {
nom: string;
pattes: number;
couleur: string;
decoration: string;
constructor(nom: string, pattes: number, couleur: string, decoration: string) {
this.nom = nom;
this.pattes = pattes;
this.couleur = couleur;
this.decoration = decoration;
}
}
let caneton = new Animal("caneton", 2, "jaune", "bec");
let lapin = new Animal("lapin", 4, "gris", "oreilles tombantes");
Cela fonctionne, mais un développeur fatigué pourrait encore modifier directement :
lapin.couleur = "noir";
lapin.pattes = 8; // Lapin-araignée !Pour prévenir cela, rendez les propriétés privées (convention avec _ ou # en TS moderne) et utilisez getters et setters pour un contrôle granulaire.
Exemple avec contrôle sur les pattes :
class Animal {
private _nom: string;
private _pattes: number;
private _couleur: string;
private _decoration: string;
constructor(nom: string, pattes: number, couleur: string, decoration: string) {
this._nom = nom;
this._pattes = pattes;
this._couleur = couleur;
this._decoration = decoration;
}
get pattes(): number {
return this._pattes;
}
set pattes(pattes: number) {
if (pattes > 0 && pattes < 9) { // Limite réaliste
this._pattes = pattes;
}
}
}

Code final avec exos pour consolider :
<span> : lama.decoration comme un tableau pour plusieurs décorations.L'encapsulation rend votre code modulaire, maintenable et robuste. Fuie les variables globales ; pour le partage, préférez les propriétés statiques de classe (voir docs TypeScript).
Si vous débutez, explorez 10 projets inspirants comme ce zoo pour pratiquer !
[]