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.
Défi
FacileConstruisons 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
Memberavec unString namepublic et unint _performanceScoreprivé initialisé à50. Inclus un constructeur qui prend le nom, ainsi qu’un accesseur publicperformanceScorequi renvoie le score privé. - Une classe
TeamLeaddans le même fichier, qui peut accéder directement au champ privé deMember(car ils se trouvent dans la même bibliothèque). Cette classe doit avoir unString namepublic, un constructeur qui prend le nom, ainsi qu’une méthodeevaluateMember(Member member)qui accède directement àmember._performanceScore, lui ajoute10et affiche[leadName] boosted [memberName]'s score to [newScore].
- Une classe
main.dart: importe ton fichier d’équipe et montre la différence d’accès :- Crée un
Membernommé'Alice' - Crée un
TeamLeadnommé'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 quemain.dartne peut pas accéder directement à_performanceScore, puisqu’il se trouve dans une bibliothèque différente)
- Crée un
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 allowedEssayez 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
}
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
1Fondamentaux de la POO
Fichiers externesBibliothèques et importsIntroduction à la POOClasses vs objetsLe mot-clé thisMéthodesVariables d’instanceBases des constructeursRécapitulatif - Calculatrice simple4Sécurité face aux valeurs nulles
Introduction à la sécurité face aux valeurs nullesNullable vs Non-NullableLes opérateurs ? et !Mot-clé Late et sécurité face aux valeurs nullesOpérateurs sensibles à nullSécurité face aux valeurs nulles dans les classesRécapitulatif – Système de profil utilisateur7Classes abstraites et interfaces
Classes abstraitesMéthodes abstraitesInterfaces en DartInterfaces implicitesImplémenter ou étendreInterfaces multiplesRécapitulatif - Calculateur de formes10Collections et génériques
Vue d’ensemble des List, Set et MapCollections à typage sûrClasses génériquesMéthodes génériquesContraintes génériquesIterable et IteratorRécapitulatif – stockage générique2Constructeurs en Dart
Constructeur par défautConstructeurs nommésListes d'initialisationConstructeurs constantsConstructeurs factoryConstructeurs redirigésRécapitulatif - Constructeur de formes5Encapsulation
Membres publics vs privésLa convention du préfixe _Confidentialité au niveau de la bibliothèqueApprofondissement des getters et settersMasquage de l’informationRécapitulatif - Fiches des étudiants8Mixins
Introduction aux MixinsCréer des MixinsUtiliser plusieurs MixinsMot-clé on dans les MixinsMixin ou héritageMixin ou interfaceRécapitulatif - Système animal11Méthodes spéciales
Redéfinition de toString()Redéfinition de hashCode et ==Interface ComparableMéthode call()Redéfinition de noSuchMethodRécapitulatif - Collection personnalisée14Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron Strategy3Propriétés des classes
Membres d’instance et statiquesChamps Final et ConstVariables différéesMéthodes et champs statiquesAccesseurs et mutateursRécapitulatif - Gestionnaire de compte bancaire6Héritage
Héritage de baseLe mot-clé superRedéfinition de méthodeL’annotation @overrideLe mot-clé de classe finalConstructeurs et héritageRécapitulatif – Hiérarchie des employés9Polymorphisme
Bases du polymorphismePolymorphisme via les interfacesVérification des types à l’exécutionLes opérateurs is et asMot-clé covariantRécapitulatif - Processeur de paiements12POO asynchrone
Futures et async/awaitNotions de base des StreamsContrôleurs de StreamsConstructeurs asynchronesAsynchrone dans les méthodes de classeRécapitulatif - récupérateur de données15Patrons de conception – Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron CompositePatron DépôtEntraînez-vous par vous-même : Compilateur Dart en ligne