Menu
Coddy logo textTech

Confidentialité au niveau de la bibliothèque

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

En Dart, la confidentialité est appliquée au niveau de la bibliothèque, et non au niveau de la classe. C'est une distinction clé par rapport à des langages comme Java ou C++. Une bibliothèque en Dart est généralement un fichier unique, ou plusieurs fichiers connectés avec des directives part.

Les membres privés (ceux commençant par _) sont accessibles n'importe où dans la même bibliothèque, même depuis d'autres classes :

// Les deux classes sont dans le même fichier (même bibliothèque)
class Engine {
  int _horsepower = 200;  // Privé à cette bibliothèque
}

class Car {
  void showPower(Engine engine) {
    print(engine._horsepower);  // Accessible ! Même bibliothèque
  }
}

Cependant, lorsque vous importez une classe depuis un fichier différent, ses membres privés deviennent véritablement cachés :

// fichier : engine.dart
class Engine {
  int _horsepower = 200;
  int get power => _horsepower;
}

// fichier : main.dart
import 'engine.dart';

void main() {
  var engine = Engine();
  // print(engine._horsepower);  // Erreur ! Non accessible
  print(engine.power);           // Fonctionne - utilise le getter public
}

Cette confidentialité au niveau de la bibliothèque signifie que les classes d'un même fichier peuvent collaborer étroitement tout en masquant les détails d'implémentation au code externe. C'est un choix de conception délibéré qui encourage l'organisation de classes liées ensemble dans la même bibliothèque.

challenge icon

Défi

Facile

Construisons un système de collaboration d’équipe qui montre comment fonctionne la confidentialité au niveau de la bibliothèque dans Dart. Tu verras comment les classes d’un même fichier peuvent accéder aux membres privés les unes des autres, tandis que le code de fichiers distincts ne le peut pas.

Tu organiseras ton code en deux fichiers :

  • team.dart : ce fichier contiendra deux classes qui fonctionnent étroitement ensemble dans la même bibliothèque :
    • Une classe Member avec un String name public et un int _performanceScore privé initialisé à 50. Inclus un constructeur qui prend le nom, ainsi qu’un accesseur public performanceScore qui renvoie le score privé.
    • Une classe TeamLead dans le même fichier, qui peut accéder directement au champ privé de Member (car ils se trouvent dans la même bibliothèque). Cette classe doit avoir un String name public, un constructeur qui prend le nom, ainsi qu’une méthode evaluateMember(Member member) qui accède directement à member._performanceScore, lui ajoute 10 et affiche [leadName] boosted [memberName]'s score to [newScore].
  • main.dart : importe ton fichier d’équipe et montre la différence d’accès :
    • Crée un Member nommé 'Alice'
    • Crée un TeamLead nommé 'Bob'
    • Affiche Initial score: [score] en utilisant l’accesseur public sur Alice
    • Demande à Bob d’évaluer Alice en utilisant evaluateMember
    • Affiche Updated score: [score] en utilisant l’accesseur public
    • Affiche Direct access from main: Not allowed (cela nous rappelle que main.dart ne peut pas accéder directement à _performanceScore, puisqu’il se trouve dans une bibliothèque différente)

L’idée essentielle est que TeamLead peut lire et modifier directement le Member privé de _performanceScore, car les deux classes se trouvent dans le même fichier (la même bibliothèque). En revanche, le code de main.dart doit utiliser l’accesseur public, puisqu’il se trouve dans une bibliothèque différente.

Sortie attendue :

Initial score: 50
Bob boosted Alice's score to 60
Updated score: 60
Direct access from main: Not allowed

Essayez vous-même

import 'team.dart';

void main() {
  // TODO: Créer un Member nommé 'Alice'

  // TODO: Créer un TeamLead nommé 'Bob'

  // TODO: Afficher "Initial score: [score]" en utilisant le getter public sur Alice

  // TODO: Faire en sorte que Bob évalue Alice en utilisant evaluateMember

  // TODO: Afficher "Updated score: [score]" en utilisant le getter public

  // TODO: Afficher "Direct access from main: Not allowed"
  // Note: Nous ne pouvons pas accéder à alice._performanceScore ici car
  // main.dart est dans une bibliothèque différente de team.dart
}
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