Menu
Coddy logo textTech

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.

challenge icon

Défi

Facile

Construisons 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 classe ScoreTracker qui gère le score d'un joueur avec une encapsulation appropriée. La classe doit avoir :
    • Un String playerName public - tout le monde peut voir qui joue
    • Un int _score privé initialisé à 0 - le score brut doit être protégé
    • Un int _bonusMultiplier privé initialisé à 1 - c'est une mécanique de jeu interne
    • Un constructeur qui prend le nom du joueur
    • Un getter public score qui retourne le _score privé
    • Une méthode privée _applyBonus(int points) qui retourne points * _bonusMultiplier
    • Une méthode publique addPoints(int points) qui utilise _applyBonus en interne pour calculer les points réels ajoutés, met à jour _score, et affiche Added [calculated] points!
    • Une méthode publique activateDoubleBonus() qui définit _bonusMultiplier à 2 et affiche Double bonus activated!
    • Une méthode publique displayStats() qui affiche le statut actuel du joueur
  • main.dart : Importez votre suivi de score et simulez une session de jeu :
    • Créez un ScoreTracker pour le joueur 'Alex'
    • Appelez displayStats()
    • Ajoutez 10 points
    • Ajoutez 25 points
    • Activez le double bonus
    • Ajoutez 15 points (ceux-ci devraient être doublés)
    • Appelez displayStats()
    • Affichez Final score: [score] en utilisant le getter public

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: 65

Aide-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
}
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