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 greifst du ganz normal auf private Member zu. Die Einschränkung gilt nur für Code außerhalb der Bibliothek. Diese Konvention macht beim Lesen des Codes sofort deutlich, welche Member nur für den internen Gebrauch bestimmt sind – alles, was mit _ beginnt, ist ein Implementierungsdetail.
Aufgabe
EinfachErstellen wir einen Punktestand-Tracker für ein Spiel, der zeigt, wie das Präfix mit Unterstrich interne Implementierungsdetails verbirgt und gleichzeitig eine übersichtliche öffentliche Schnittstelle bereitstellt.
Du organisierst deinen Code in zwei Dateien:
score_tracker.dart: Erstelle eineScoreTracker-Klasse, die den Punktestand eines Spielers mit geeigneter Kapselung verwaltet. Die Klasse sollte Folgendes enthalten:- Ein öffentliches
String playerName– jeder kann sehen, wer spielt - Ein privates
int _score, initialisiert mit0– der Rohpunktestand sollte geschützt sein - Einen privaten
int _bonusMultiplier, initialisiert mit1– dies ist eine interne Spielmechanik - Einen Konstruktor, der den Spielernamen entgegennimmt
- Einen öffentlichen Getter
score, der den privaten_scorezurückgibt - Eine private Methode
_applyBonus(int points), diepoints * _bonusMultiplierzurückgibt - Eine öffentliche Methode
addPoints(int points), die intern_applyBonusverwendet, um die tatsächlich hinzugefügten Punkte zu berechnen,_scoreaktualisiert undAdded [calculated] points!ausgibt - Eine öffentliche Methode
activateDoubleBonus(), die_bonusMultiplierauf2setzt undDouble bonus activated!ausgibt - Eine öffentliche Methode
displayStats(), die den aktuellen Status des Spielers anzeigt
- Ein öffentliches
main.dart: Importiere deinen Punktestand-Tracker und simuliere eine Spielsitzung:- Erstelle einen
ScoreTrackerfür den Spieler'Alex' - Rufe
displayStats()auf - Füge
10Punkte hinzu - Füge
25Punkte hinzu - Aktiviere den doppelten Bonus
- Füge
15Punkte hinzu (diese sollten verdoppelt werden) - Rufe
displayStats()auf - Gib
Final score: [score]mithilfe des öffentlichen Getters aus
- Erstelle einen
Die Methode displayStats() sollte in diesem Format ausgeben:
=== Player Stats ===
Player: [playerName]
Current Score: [_score]Beachte, wie die private Methode _applyBonus und das Feld _bonusMultiplier die Bonusberechnung intern übernehmen. Externer Code sieht nur die öffentlichen Methoden und weiß nichts über das Multiplikatorsystem – es handelt sich um ein Implementierungsdetail, das hinter der Konvention mit dem Unterstrich 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: 65Probier 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
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienBibliotheken & ImportsEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort thisMethodenInstanzvariablenGrundlagen von KonstruktorenRückblick – Einfacher Taschenrechner4Null-Sicherheit
Einführung in die Null-SicherheitNullable vs. Non-NullableDie Operatoren ? und !Late-Schlüsselwort und Null-SicherheitNull-bewusste OperatorenNull-Sicherheit in KlassenRückblick – Benutzers профilsystem7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrere InterfacesZusammenfassung – Formrechner10Collections & Generics
Übersicht über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische EinschränkungenIterable & IteratorRückblick – Generischer Speicher13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungErweiterungsmethodenAufrufbare KlassenVersiegelte Klassen (Dart 3)Records (Dart 3)Muster & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
StandardkonstruktorBenannte KonstruktorenInitialisierungslistenKonstantenkonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenRückblick – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _-Präfix-KonventionBibliotheksweite SichtbarkeitTiefergehende Getter & SetterInformationsverbergungRückblick – Studierendendaten8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas Schlüsselwort „on“ in MixinsMixin vs. VererbungMixin vs. SchnittstelleRückblick – Tiersystem11Spezielle Methoden
toString()-ÜberschreibunghashCode- & ==-ÜberschreibungComparable-Schnittstellecall()-MethodenoSuchMethod-ÜberschreibungWiederholung – Benutzerdefinierte Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFabrikmusterBeobachtermusterStrategiemuster17Abschließende Herausforderungen
E-Learning-PlattformBankingsystemSpielcharaktersystemFahrzeugvermietung3Klassen-Eigenschaften
Instanz- vs. statische MemberFinal- und Const-FelderLate-VariablenStatische Methoden und FelderGetter und SetterRückblick – Bankkontoverwaltung6Vererbung
Grundlegende VererbungDas Schlüsselwort superMethodenüberschreibungDie Annotation @overrideDas Schlüsselwort final für KlassenKonstruktoren und VererbungZusammenfassung – Mitarbeiterhierarchie9Polymorphismus
Grundlagen des PolymorphismusPolymorphismus über InterfacesLaufzeit-TypüberprüfungDie Operatoren is & asCovariant-SchlüsselwortZusammenfassung – ZahlungsprozessorÜbe selbstständig: Online-Dart-Compiler