Menu
Coddy logo textTech

Die _ Präfix-Konvention

Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy — Lektion 31 von 110.

Der Unterstrich-Präfix _ ist Darts Methode, um Member als privat zu kennzeichnen. Im Gegensatz zu Sprachen, die Schlüsselwörter wie private verwenden, verlässt sich Dart auf diese Namenskonvention, um die Sichtbarkeit zu steuern.

Sie können den Unterstrich sowohl auf Felder als auch auf Methoden anwenden:

class Counter {
  int _count = 0;        // Privates Feld
  
  void _increment() {    // Private Methode
    _count++;
  }
  
  void increase() {      // Öffentliche Methode
    _increment();
    print('Count: $_count');
  }
}

Der Unterstrich funktioniert für jeden Bezeichner – Variablen, Methoden, Getter, Setter und sogar Klassennamen. Eine Klasse namens _Helper wäre privat für ihre Bibliothek.

class Person {
  String _name;          // Privat
  int _age;              // Privat
  
  Person(this._name, this._age);
  
  String get name => _name;           // Öffentlicher Getter
  void _validateAge(int age) { }      // Private Methode
}

Innerhalb derselben Klasse greifen Sie ganz normal auf private Member zu. Die Einschränkung gilt nur für Code außerhalb der Bibliothek. Diese Konvention macht beim Lesen von Code sofort deutlich, welche Member nur für den internen Gebrauch bestimmt sind – alles, was mit _ beginnt, ist ein Implementierungsdetail.

challenge icon

Aufgabe

Einfach

Lassen Sie uns einen Punktestand-Tracker für ein Spiel erstellen, der zeigt, wie das Unterstrich-Präfix interne Implementierungsdetails verbirgt, während eine saubere öffentliche Schnittstelle bereitgestellt wird.

Sie werden Ihren Code in zwei Dateien organisieren:

  • score_tracker.dart: Erstellen Sie eine ScoreTracker-Klasse, die den Punktestand eines Spielers mit ordnungsgemäßer Kapselung verwaltet. Die Klasse sollte Folgendes haben:
    • Ein öffentliches String playerName - jeder kann sehen, wer spielt
    • Ein privates int _score, initialisiert mit 0 - der rohe Punktestand sollte geschützt sein
    • Ein privates int _bonusMultiplier, initialisiert mit 1 - dies ist eine interne Spielmechanik
    • Einen Konstruktor, der den Spielernamen entgegennimmt
    • Einen öffentlichen Getter score, der das private _score zurückgibt
    • Eine private Methode _applyBonus(int points), die points * _bonusMultiplier zurückgibt
    • Eine öffentliche Methode addPoints(int points), die intern _applyBonus verwendet, um die tatsächlich hinzugefügten Punkte zu berechnen, _score aktualisiert und Added [calculated] points! ausgibt
    • Eine öffentliche Methode activateDoubleBonus(), die _bonusMultiplier auf 2 setzt und Double bonus activated! ausgibt
    • Eine öffentliche Methode displayStats(), die den aktuellen Status des Spielers anzeigt
  • main.dart: Importieren Sie Ihren Punktestand-Tracker und simulieren Sie eine Spielsitzung:
    • Erstellen Sie einen ScoreTracker für den Spieler 'Alex'
    • Rufen Sie displayStats() auf
    • Fügen Sie 10 Punkte hinzu
    • Fügen Sie 25 Punkte hinzu
    • Aktivieren Sie den Doppelbonus
    • Fügen Sie 15 Punkte hinzu (dies sollte verdoppelt werden)
    • Rufen Sie displayStats() auf
    • Geben Sie Final score: [score] unter Verwendung des öffentlichen Getters aus

Die Methode displayStats() sollte in diesem Format drucken:

=== Player Stats ===
Player: [playerName]
Current Score: [_score]

Beachten Sie, wie die private Methode _applyBonus und das Feld _bonusMultiplier die Bonusberechnung intern handhaben. Externer Code sieht nur die öffentlichen Methoden und hat keine Ahnung vom Multiplikatorsystem - das ist ein Implementierungsdetail, das hinter der Unterstrich-Konvention verborgen ist.

Erwartete Ausgabe:

=== 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

Spickzettel

Der Unterstrich-Präfix _ kennzeichnet Member in Dart als privat. Diese Namenskonvention steuert die Sichtbarkeit, ohne Schlüsselwörter wie private zu verwenden.

Wenden Sie den Unterstrich auf Felder und Methoden an:

class Counter {
  int _count = 0;        // Private field
  
  void _increment() {    // Private method
    _count++;
  }
  
  void increase() {      // Public method
    _increment();
    print('Count: $_count');
  }
}

Der Unterstrich funktioniert für jeden Bezeichner - Variablen, Methoden, Getter, Setter und Klassennamen:

class Person {
  String _name;          // Private
  int _age;              // Private
  
  Person(this._name, this._age);
  
  String get name => _name;           // Public getter
  void _validateAge(int age) { }      // Private method
}

Private Member sind innerhalb derselben Klasse zugänglich, aber für Code außerhalb der Library eingeschränkt. Alles, was mit _ beginnt, ist ein Implementierungsdetail.

Probier es selbst

import 'score_tracker.dart';

void main() {
  // TODO: Erstelle einen ScoreTracker für Spieler 'Alex'
  
  // TODO: Rufe displayStats() auf
  
  // TODO: Füge 10 Punkte hinzu
  
  // TODO: Füge 25 Punkte hinzu
  
  // TODO: Aktiviere den doppelten Bonus
  
  // TODO: Füge 15 Punkte hinzu (dies sollte verdoppelt werden)
  
  // TODO: Rufe displayStats() auf
  
  // TODO: Gib 'Final score: [score]' unter Verwendung des öffentlichen Getters aus
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung