Builders Academy
SOLID — Les 5 Principes de la Conception OO
1 of 3

Chapitre 1 · Leçon 1

Single Responsibility

Une classe = une raison de changer

Section 1

Le principe et sa violation

Step 1

Une classe = une raison de changer

SRP : chaque classe doit avoir une seule raison de changer. Si une classe gère les données, les calculs ET l'affichage, elle a 3 raisons de changer — c'est une violation.

snippet.typescript

typescript
1// ❌ Violation SRP — UserManager fait tout
2class UserManager {
3  private db: Database;
4
5  constructor(db: Database) { this.db = db; }
6
7  // Raison 1 : logique métier
8  validateEmail(email: string): boolean {
9    return /^[^s@]+@[^s@]+.[^s@]+$/.test(email);
10  }
11
12  // Raison 2 : accès aux données
13  async saveUser(user: User): Promise<void> {
14    await this.db.query('INSERT INTO users...', [user]);
15  }
16
17  // Raison 3 : présentation
18  formatUserDisplay(user: User): string {
19    return `${user.firstName} ${user.lastName} <${user.email}>`;
20  }
21
22  // Raison 4 : envoi d'email
23  async sendWelcomeEmail(user: User): Promise<void> {
24    await emailService.send({ to: user.email, subject: 'Bienvenue!' });
25  }
26}

Step 2

Refactoring pour respecter SRP

On découpe UserManager en classes focalisées. Chaque classe a maintenant une seule responsabilité et donc une seule raison de changer.

snippet.typescript

typescript
1// ❌ Violation SRP — UserManager fait tout
2class UserManager {
3  private db: Database;
4
5  constructor(db: Database) { this.db = db; }
6
7  // Raison 1 : logique métier
8  validateEmail(email: string): boolean {
9    return /^[^s@]+@[^s@]+.[^s@]+$/.test(email);
10  }
11
12  // Raison 2 : accès aux données
13  async saveUser(user: User): Promise<void> {
14    await this.db.query('INSERT INTO users...', [user]);
15  }
16
17  // Raison 3 : présentation
18  formatUserDisplay(user: User): string {
19    return `${user.firstName} ${user.lastName} <${user.email}>`;
20  }
21
22  // Raison 4 : envoi d'email
23  async sendWelcomeEmail(user: User): Promise<void> {
24    await emailService.send({ to: user.email, subject: 'Bienvenue!' });
25  }
26}

Topics and skills covered

  • SOLID
  • SRP
  • Architecture
  • Clean Code