Menu
Coddy logo textTech

Membres publics vs privés

Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy. Leçon 30 sur 110.

L'encapsulation est l'un des principes fondamentaux de la programmation orientée objet. Il s'agit de contrôler l'accès aux données internes d'une classe, en décidant de ce qui doit être visible par le monde extérieur et de ce qui doit rester caché.

En Dart, les membres de classe (champs et méthodes) sont publics par défaut. Cela signifie que n'importe quel code peut y accéder directement :

class BankAccount {
  String owner;
  double balance;
  
  BankAccount(this.owner, this.balance);
}

var account = BankAccount('Alice', 1000);
account.balance = -500;  // N'importe qui peut modifier cela directement !

C'est problématique. Rien n'empêche de définir un solde invalide.

Pour protéger les données internes, Dart utilise des membres privés. Un membre devient privé lorsque son nom commence par un trait de soulignement _ :

class BankAccount {
  String owner;
  double _balance;  // Privé - commence par un trait de soulignement
  
  BankAccount(this.owner, this._balance);
  
  double get balance => _balance;  // Accès contrôlé
}

Désormais, _balance ne peut pas être accessible directement depuis l’extérieur de la bibliothèque où la classe est définie. Le code externe doit utiliser le getter public à la place. Cela vous permet de contrôler la manière dont les données sont lues et modifiées, en veillant à ce que vos objets restent toujours dans un état valide.

challenge icon

Défi

Facile

Construisons un gestionnaire de mots de passe simple qui démontre la différence entre les membres publics et privés. Tu verras comment le préfixe de soulignement empêche l’accès direct aux données sensibles depuis l’extérieur de la bibliothèque de la classe.

Tu vas créer deux fichiers pour organiser ton code :

  • credential.dart : définir une classe Credential qui stocke les informations de connexion d’un site web. La classe doit avoir :
    • Un String website public : il est normal que tout le monde puisse voir à quel site cela correspond
    • Un String username public : le nom d’utilisateur peut être visible
    • Un String _password privé : le véritable mot de passe doit être protégé
    • Un constructeur qui accepte les trois valeurs
    • Un accesseur public password qui renvoie le _password privé (accès contrôlé)
    • Une méthode getMaskedPassword() qui renvoie le mot de passe en remplaçant tous les caractères par des astérisques * (de même longueur que le mot de passe réel)
    • Une méthode displayCredential() qui affiche les informations d’identification de manière sécurisée (en montrant le mot de passe masqué, et non le vrai)
  • main.dart : importer ta classe d’identification et montrer comment l’encapsulation protège le mot de passe :
    • Créer une identification pour le site 'github.com', le nom d’utilisateur 'dev_user' et le mot de passe 'secret123'
    • Créer une autre identification pour le site 'email.com', le nom d’utilisateur 'john_doe' et le mot de passe 'myP@ss'
    • Pour chaque identification, appeler displayCredential(), puis afficher Actual password length: [length] en utilisant l’accesseur public pour accéder à la longueur du mot de passe

La méthode displayCredential() doit afficher dans ce format :

--- Credential ---
Website: [website]
Username: [username]
Password: [maskedPassword]

Résultat attendu :

--- Credential ---
Website: github.com
Username: dev_user
Password: *********
Actual password length: 9
--- Credential ---
Website: email.com
Username: john_doe
Password: ******
Actual password length: 6

Essayez vous-même

import 'credential.dart';

void main() {
  // TODO: Créer un identifiant pour github.com
  // website: 'github.com', username: 'dev_user', password: 'secret123'
  
  // TODO: Appeler displayCredential() sur le premier identifiant
  
  // TODO: Imprimer la longueur réelle du mot de passe en utilisant le getter public
  // Format: "Actual password length: [length]"
  
  // TODO: Créer un identifiant pour email.com
  // website: 'email.com', username: 'john_doe', password: 'myP@ss'
  
  // TODO: Appeler displayCredential() sur le deuxième identifiant
  
  // TODO: Imprimer la longueur réelle du mot de passe en utilisant le getter public
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur Dart en ligne