La convention du préfixe _
Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy — leçon 31 sur 110.
Le préfixe underscore _ est la manière dont Dart marque les membres comme privés. Contrairement aux langages qui utilisent des mots-clés comme private, Dart s'appuie sur cette convention de nommage pour contrôler la visibilité.
Vous pouvez appliquer l'underscore à la fois aux champs et aux méthodes :
class Counter {
int _count = 0; // Champ privé
void _increment() { // Méthode privée
_count++;
}
void increase() { // Méthode publique
_increment();
print('Count: $_count');
}
}Le tiret bas (underscore) fonctionne pour n'importe quel identifiant - variables, méthodes, getters, setters et même les noms de classes. Une classe nommée _Helper serait privée pour sa bibliothèque.
class Person {
String _name; // Privé
int _age; // Privé
Person(this._name, this._age);
String get name => _name; // Getter public
void _validateAge(int age) { } // Méthode privée
}À l'intérieur de la même classe, vous accédez normalement aux membres privés. La restriction ne s'applique qu'au code situé en dehors de la bibliothèque. Cette convention permet de savoir immédiatement, à la lecture du code, quels membres sont destinés à un usage interne uniquement : tout ce qui commence par _ est un détail d'implémentation.
Défi
FacileConstruisons un suivi de score pour un jeu qui démontre comment le préfixe underscore garde les détails d'implémentation internes cachés tout en exposant une interface publique propre.
Vous organiserez votre code en deux fichiers :
score_tracker.dart: Créez une classeScoreTrackerqui gère le score d'un joueur avec une encapsulation appropriée. La classe doit avoir :- Un
String playerNamepublic - tout le monde peut voir qui joue - Un
int _scoreprivé initialisé à0- le score brut doit être protégé - Un
int _bonusMultiplierprivé initialisé à1- c'est une mécanique de jeu interne - Un constructeur qui prend le nom du joueur
- Un getter public
scorequi retourne le_scoreprivé - Une méthode privée
_applyBonus(int points)qui retournepoints * _bonusMultiplier - Une méthode publique
addPoints(int points)qui utilise_applyBonusen interne pour calculer les points réels ajoutés, met à jour_score, et afficheAdded [calculated] points! - Une méthode publique
activateDoubleBonus()qui définit_bonusMultiplierà2et afficheDouble bonus activated! - Une méthode publique
displayStats()qui affiche le statut actuel du joueur
- Un
main.dart: Importez votre suivi de score et simulez une session de jeu :- Créez un
ScoreTrackerpour le joueur'Alex' - Appelez
displayStats() - Ajoutez
10points - Ajoutez
25points - Activez le double bonus
- Ajoutez
15points (ceux-ci devraient être doublés) - Appelez
displayStats() - Affichez
Final score: [score]en utilisant le getter public
- Créez un
La méthode displayStats() doit afficher dans ce format :
=== Player Stats ===
Player: [playerName]
Current Score: [_score]Remarquez comment la méthode privée _applyBonus et le champ _bonusMultiplier gèrent le calcul du bonus en interne. Le code externe ne voit que les méthodes publiques et n'a aucune idée du système de multiplicateur - c'est un détail d'implémentation caché derrière la convention de l'underscore.
Sortie attendue :
=== Player Stats ===
Player: Alex
Current Score: 0
Added 10 points!
Added 25 points!
Double bonus activated!
Added 30 points!
=== Player Stats ===
Player: Alex
Current Score: 65
Final score: 65Aide-mémoire
Le préfixe souligné _ marque les membres comme privés en Dart. Cette convention de nommage contrôle la visibilité sans utiliser de mots-clés comme private.
Appliquez le souligné aux champs et aux méthodes :
class Counter {
int _count = 0; // Champ privé
void _increment() { // Méthode privée
_count++;
}
void increase() { // Méthode publique
_increment();
print('Count: $_count');
}
}Le souligné fonctionne pour n'importe quel identifiant - variables, méthodes, getters, setters et noms de classes :
class Person {
String _name; // Privé
int _age; // Privé
Person(this._name, this._age);
String get name => _name; // Getter public
void _validateAge(int age) { } // Méthode privée
}Les membres privés sont accessibles au sein de la même classe mais restreints au code en dehors de la bibliothèque. Tout ce qui commence par _ est un détail d'implémentation.
Essayez vous-même
import 'score_tracker.dart';
void main() {
// TODO: Créer un ScoreTracker pour le joueur 'Alex'
// TODO: Appeler displayStats()
// TODO: Ajouter 10 points
// TODO: Ajouter 25 points
// TODO: Activer le bonus double
// TODO: Ajouter 15 points (cela devrait être doublé)
// TODO: Appeler displayStats()
// TODO: Afficher 'Final score: [score]' en utilisant le getter public
}
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
1Les bases de la POO
Fichiers externesBibliothèques et importsIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesVariables d'instanceBases des constructeursRécapitulatif - Calculatrice simple4Null Safety
Introduction à la Null SafetyNullable vs Non-NullableLes opérateurs ? et !Le mot-clé late et la Null SafetyLes opérateurs Null-AwareLa Null Safety dans les classesRécapitulatif - Système de profil utilisateur7Classes abstraites et Interfaces
Classes abstraitesMéthodes abstraitesInterfaces en DartInterfaces implicitesImplémentation vs ExtensionInterfaces multiplesRécapitulatif - Calculateur de formes10Collections et Génériques
Aperçu des List, Set et MapCollections Type-SafeClasses génériquesMéthodes génériquesContraintes de généricitéIterable & IteratorRécapitulatif - Stockage générique2Les constructeurs en Dart
Constructeur par défautConstructeurs nommésListes d'initialisationConstructeurs constantsConstructeurs factoryConstructeurs de redirectionRécapitulatif - Shape Builder5Encapsulation
Membres publics vs privésLa convention du préfixe _Visibilité au niveau de la bibliothèqueApprofondissement des Getters & SettersMasquage d'informationsRécapitulatif - Dossiers d'étudiants8Mixins
Introduction aux MixinsCréation de MixinsUtilisation de plusieurs MixinsLe mot-clé on dans les MixinsMixin vs HéritageMixin vs InterfaceRécapitulatif - Système Animal11Méthodes spéciales
Redéfinition de toString()Redéfinition de hashCode & ==Interface ComparableMéthode call()Redéfinition de noSuchMethodRécapitulatif - Collection personnalisée14Patrons de conception Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron ObservateurPatron Stratégie3Propriétés de classe
Membres d'instance vs statiquesChamps Final & ConstVariables LateMéthodes et champs statiquesGetters et SettersRécapitulatif - Gestionnaire de compte bancaire6Héritage
Bases de l'héritageLe mot-clé superRedéfinition de méthodeL'annotation @overrideLe mot-clé final pour les classesConstructeurs et héritageRécapitulatif - Hiérarchie des employés9Polymorphisme
Bases du polymorphismePolymorphisme via les interfacesVérification de type à l'exécutionLes opérateurs is & asMot-clé covariantRécapitulatif - Processeur de paiement12POO Asynchrone
Futures & async/awaitBases des StreamsStream ControllersConstructeurs asynchronesL'asynchrone dans les méthodes de classeRécapitulatif - Data Fetcher15Patrons de conception Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode ModèlePatron ÉtatPatron CompositePatron Repository