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 du score pour un jeu qui montre comment le préfixe souligné garde les détails d’implémentation internes cachés tout en exposant une interface publique claire.
Tu organiseras ton code dans deux fichiers :
score_tracker.dart: crée une classeScoreTrackerqui gère le score d’un joueur avec un 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— il s’agit d’un mécanisme interne du jeu - Un constructeur qui prend le nom du joueur
- Un getter public
scorequi renvoie le_scoreprivé - Une méthode privée
_applyBonus(int points)qui renvoiepoints * _bonusMultiplier - Une méthode publique
addPoints(int points)qui utilise_applyBonusen interne pour calculer les points réellement ajoutés, met à jour_scoreet afficheAdded [calculated] points! - Une méthode publique
activateDoubleBonus()qui définit_bonusMultiplierà2et afficheDouble bonus activated! - Une méthode publique
displayStats()qui affiche l’état actuel du joueur
- Un
main.dart: importe ton suivi du score et simule une session de jeu :- Crée un
ScoreTrackerpour le joueur'Alex' - Appelle
displayStats() - Ajoute
10points - Ajoute
25points - Active le bonus double
- Ajoute
15points (ceux-ci doivent être doublés) - Appelle
displayStats() - Affiche
Final score: [score]à l’aide du getter public
- Crée un
La méthode displayStats() doit afficher le format suivant :
=== Player Stats ===
Player: [playerName]
Current Score: [_score]Remarque 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 du préfixe souligné.
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: 65Essayez 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
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