Konwencja prefiksu _
Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 31 z 110.
Prefiks podkreślenia _ to sposób, w jaki Dart oznacza składowe jako prywatne. W przeciwieństwie do języków używających słów kluczowych, takich jak private, Dart opiera się na tej konwencji nazewniczej, aby kontrolować widoczność.
Możesz stosować podkreślenie zarówno do pól, jak i metod:
class Counter {
int _count = 0; // Pole prywatne
void _increment() { // Metoda prywatna
_count++;
}
void increase() { // Metoda publiczna
_increment();
print('Count: $_count');
}
}Podkreślenie działa w przypadku każdego identyfikatora — zmiennych, metod, getterów, setterów, a nawet nazw klas. Klasa o nazwie _Helper byłaby prywatna w obrębie swojej biblioteki.
class Person {
String _name; // Prywatne
int _age; // Prywatne
Person(this._name, this._age);
String get name => _name; // Publiczny getter
void _validateAge(int age) { } // Metoda prywatna
}W obrębie tej samej klasy dostęp do prywatnych składowych uzyskujesz w zwykły sposób. Ograniczenie dotyczy tylko kodu spoza biblioteki. Ta konwencja sprawia, że podczas czytania kodu od razu widać, które składowe są przeznaczone wyłącznie do użytku wewnętrznego — wszystko, co zaczyna się od _, jest szczegółem implementacji.
Wyzwanie
ŁatwyZbudujmy narzędzie do śledzenia wyniku w grze, które pokaże, jak prefiks z podkreśleniem ukrywa wewnętrzne szczegóły implementacji, jednocześnie udostępniając przejrzysty interfejs publiczny.
Podzielisz swój kod na dwa pliki:
score_tracker.dart: Utwórz klasęScoreTracker, która zarządza wynikiem gracza z zastosowaniem odpowiedniej enkapsulacji. Klasa powinna mieć:- Publiczne pole
String playerName— każdy może zobaczyć, kto gra - Prywatne pole
int _scorezainicjalizowane wartością0— surowy wynik powinien być chroniony - Prywatne pole
int _bonusMultiplierzainicjalizowane wartością1— to wewnętrzna mechanika gry - Konstruktor, który przyjmuje imię gracza
- Publiczny getter
score, który zwraca prywatne pole_score - Prywatną metodę
_applyBonus(int points), która zwracapoints * _bonusMultiplier - Publiczną metodę
addPoints(int points), która wewnętrznie używa_applyBonus, aby obliczyć faktyczną liczbę dodanych punktów, aktualizuje_scorei wyświetlaAdded [calculated] points! - Publiczną metodę
activateDoubleBonus(), która ustawia_bonusMultiplierna2i wyświetlaDouble bonus activated! - Publiczną metodę
displayStats(), która wyświetla bieżący status gracza
- Publiczne pole
main.dart: Zaimportuj narzędzie do śledzenia wyniku i zasymuluj sesję gry:- Utwórz obiekt
ScoreTrackerdla gracza'Alex' - Wywołaj
displayStats() - Dodaj
10punktów - Dodaj
25punktów - Aktywuj podwójny bonus
- Dodaj
15punktów (ta liczba powinna zostać podwojona) - Wywołaj
displayStats() - Wyświetl
Final score: [score]za pomocą publicznego gettera
- Utwórz obiekt
Metoda displayStats() powinna wyświetlać tekst w następującym formacie:
=== Player Stats ===
Player: [playerName]
Current Score: [_score]Zwróć uwagę, jak prywatna metoda _applyBonus i pole _bonusMultiplier wewnętrznie obsługują obliczanie bonusu. Zewnętrzny kod widzi tylko metody publiczne i nie wie nic o systemie mnożników — to szczegół implementacji ukryty za konwencją z podkreśleniem.
Oczekiwany wynik:
=== 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: 65Spróbuj swoich sił
import 'score_tracker.dart';
void main() {
// TODO: Utwórz ScoreTracker dla gracza 'Alex'
// TODO: Wywołaj displayStats()
// TODO: Dodaj 10 punktów
// TODO: Dodaj 25 punktów
// TODO: Aktywuj premię podwajającą punkty
// TODO: Dodaj 15 punktów (powinny zostać podwojone)
// TODO: Wywołaj displayStats()
// TODO: Wypisz 'Final score: [score]', używając publicznego gettera
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP
Pliki zewnętrzneBiblioteki i importyWprowadzenie do OOPKlasy a obiektySłowo kluczowe thisMetodyZmienne instancjiPodstawy konstruktorówPowtórka – prosty kalkulator4Bezpieczeństwo wartości null
Wprowadzenie do bezpieczeństwa wartości nullTypy dopuszczające null i niedopuszczające nullOperatory ? i !Słowo kluczowe late a bezpieczeństwo wartości nullOperatory uwzględniające nullBezpieczeństwo wartości null w klasachPodsumowanie — system profili użytkowników7Klasy abstrakcyjne i interfejsy
Klasy abstrakcyjneMetody abstrakcyjneInterfejsy w DartInterfejsy niejawneImplementowanie a rozszerzanieWiele interfejsówPowtórka — kalkulator kształtów10Kolekcje i typy generyczne
Przegląd List, Set i MapKolekcje bezpieczne typowoKlasy generyczneMetody generyczneOgraniczenia typów generycznychIterable i IteratorPowtórka — generyczne przechowywanie danych13Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieMetody rozszerzająceKlasy wywoływalneKlasy zapieczętowane (Dart 3)Rekordy (Dart 3)Wzorce i dopasowywanie (3.0)Typy wyliczeniowe z metodami16Projekt: Zarządzanie biblioteką
Omówienie projektuKlasy książek i użytkowników2Konstruktory w Dart
Konstruktor domyślnyKonstruktory nazwaneListy inicjalizująceKonstruktory stałeKonstruktory fabryczneKonstruktory przekierowującePodsumowanie — budowanie kształtów5Hermetyzacja
Elementy publiczne a prywatneKonwencja prefiksu _Prywatność na poziomie bibliotekiGettery i settery — szczegółowoUkrywanie informacjiPodsumowanie — dane uczniów8Domieszki
Wprowadzenie do domieszekTworzenie domieszekKorzystanie z wielu domieszekSłowo kluczowe on w domieszkachDomieszka a dziedziczenieDomieszka a interfejsPodsumowanie – system zwierząt11Metody specjalne
Nadpisanie toString()Nadpisanie hashCode i ==Interfejs ComparableMetoda call()Nadpisanie noSuchMethodPodsumowanie — własna kolekcja14Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy3Właściwości klas
Elementy instancji a elementy statycznePola final i constZmienne inicjalizowane z opóźnieniemMetody i pola statyczneGettery i setteryPowtórzenie – menedżer kont bankowych6Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superPrzesłanianie metodAdnotacja @overrideSłowo kluczowe final dla klasKonstruktory i dziedziczeniePowtórzenie – hierarchia pracowników9Polimorfizm
Podstawy polimorfizmuPolimorfizm za pomocą interfejsówSprawdzanie typu w czasie działaniaOperatory is i asSłowo kluczowe covariantPodsumowanie — procesor płatnościPoćwicz samodzielnie: Kompilator Dart online