Menu
Coddy logo textTech

Visibilité 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 démontre le fonctionnement de la confidentialité au niveau de la bibliothèque en Dart. Vous verrez comment des classes situées dans le même fichier peuvent accéder aux membres privés les unes des autres, alors que le code situé dans des fichiers séparés ne le peut pas.

Vous organiserez votre code en deux fichiers :

  • team.dart : Ce fichier contiendra deux classes qui travaillent en étroite collaboration dans la même bibliothèque :
    • Une classe Member avec un String name public et un int _performanceScore privé initialisé à 50. Incluez un constructeur qui prend le nom, et un getter public performanceScore qui retourne le score privé.
    • Une classe TeamLead dans le même fichier qui peut accéder directement au champ privé de Member (car ils sont dans la même bibliothèque). Cette classe doit avoir un String name public, un constructeur qui prend le nom, et 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 : Importez votre fichier d'équipe et démontrez la différence d'accès :
    • Créez un Member nommé 'Alice'
    • Créez un TeamLead nommé 'Bob'
    • Affichez Initial score: [score] en utilisant le getter public sur Alice
    • Faites en sorte que Bob évalue Alice en utilisant evaluateMember
    • Affichez Updated score: [score] en utilisant le getter public
    • Affichez 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 clé ici est que TeamLead peut directement lire et modifier le _performanceScore privé de Member car les deux classes résident dans le même fichier (même bibliothèque). Cependant, le code dans main.dart doit utiliser le getter public car 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

Aide-mémoire

En Dart, la confidentialité est appliquée au niveau de la bibliothèque, et non au niveau de la classe. Une bibliothèque est généralement un fichier unique, ou plusieurs fichiers connectés avec des directives part.

Les membres privés commencent par un trait de soulignement (_) et 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
  }
}

Lorsque vous importez une classe depuis un fichier différent, ses membres privés deviennent masqué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 un getter public
}

Cette conception encourage l'organisation de classes liées ensemble dans la même bibliothèque, leur permettant de collaborer étroitement tout en masquant les détails d'implémentation du code externe.

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