Convenzione del prefisso _
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 31 di 110.
Il prefisso di sottolineatura _ è il modo in cui Dart contrassegna i membri come privati. A differenza dei linguaggi che usano parole chiave come private, Dart si affida a questa convenzione di denominazione per controllare la visibilità.
Puoi applicare il trattino basso sia ai campi sia ai metodi:
class Counter {
int _count = 0; // Campo privato
void _increment() { // Metodo privato
_count++;
}
void increase() { // Metodo pubblico
_increment();
print('Count: $_count');
}
}Il carattere di sottolineatura funziona per qualsiasi identificatore: variabili, metodi, getter, setter e persino nomi di classi. Una classe denominata _Helper sarebbe privata all'interno della sua libreria.
class Person {
String _name; // Privato
int _age; // Privato
Person(this._name, this._age);
String get name => _name; // Getter pubblico
void _validateAge(int age) { } // Metodo privato
}All'interno della stessa classe, accedi normalmente ai membri privati. La restrizione si applica solo al codice esterno alla libreria. Questa convenzione rende subito chiaro, leggendo il codice, quali membri sono destinati solo all'uso interno: tutto ciò che inizia con _ è un dettaglio di implementazione.
Sfida
FacileCostruiamo un sistema di tracciamento del punteggio per un gioco che mostra come il prefisso underscore mantenga nascosti i dettagli interni dell'implementazione, esponendo al contempo un'interfaccia pubblica pulita.
Organizzerai il codice in due file:
score_tracker.dart: crea una classeScoreTrackerche gestisca il punteggio di un giocatore con un adeguato incapsulamento. La classe dovrebbe avere:- Un
String playerNamepubblico: tutti possono vedere chi sta giocando - Un
int _scoreprivato inizializzato a0: il punteggio grezzo dovrebbe essere protetto - Un
int _bonusMultiplierprivato inizializzato a1: è una meccanica interna del gioco - Un costruttore che accetta il nome del giocatore
- Un getter pubblico
scoreche restituisce il valore privato_score - Un metodo privato
_applyBonus(int points)che restituiscepoints * _bonusMultiplier - Un metodo pubblico
addPoints(int points)che usa internamente_applyBonusper calcolare i punti effettivamente aggiunti, aggiorna_scoree stampaAdded [calculated] points! - Un metodo pubblico
activateDoubleBonus()che imposta_bonusMultipliersu2e stampaDouble bonus activated! - Un metodo pubblico
displayStats()che mostra lo stato attuale del giocatore
- Un
main.dart: importa il sistema di tracciamento del punteggio e simula una sessione di gioco:- Crea un
ScoreTrackerper il giocatore'Alex' - Chiama
displayStats() - Aggiungi
10punti - Aggiungi
25punti - Attiva il bonus doppio
- Aggiungi
15punti (dovrebbero essere raddoppiati) - Chiama
displayStats() - Stampa
Final score: [score]usando il getter pubblico
- Crea un
Il metodo displayStats() dovrebbe stampare in questo formato:
=== Player Stats ===
Player: [playerName]
Current Score: [_score]Nota come il metodo privato _applyBonus e il campo _bonusMultiplier gestiscano internamente il calcolo del bonus. Il codice esterno vede solo i metodi pubblici e non sa nulla del sistema del moltiplicatore: è un dettaglio di implementazione nascosto dalla convenzione dell'underscore.
Output previsto:
=== 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: 65Provalo tu
import 'score_tracker.dart';
void main() {
// TODO: Crea uno ScoreTracker per il giocatore 'Alex'
// TODO: Chiama displayStats()
// TODO: Aggiungi 10 punti
// TODO: Aggiungi 25 punti
// TODO: Attiva il bonus doppio
// TODO: Aggiungi 15 punti (dovrebbero essere raddoppiati)
// TODO: Chiama displayStats()
// TODO: Stampa 'Final score: [score]' usando il getter pubblico
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniLibrerie e importazioniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave thisMetodiVariabili di istanzaFondamenti dei costruttoriRiepilogo - Calcolatrice semplice4Sicurezza dei valori null
Introduzione alla sicurezza dei valori nullNullable e non nullableGli operatori ? e !La keyword late e la sicurezza dei valori nullOperatori null-awareSicurezza dei valori null nelle classiRiepilogo - Sistema di profili utente7Classi astratte e interfacce
Classi astratteMetodi astrattiInterfacce in DartInterfacce impliciteImplementare vs estendereInterfacce multipleRiepilogo - Calcolatore di forme10Collezioni e generici
Panoramica di List, Set e MapCollezioni sicure rispetto ai tipiClassi genericheMetodi genericiVincoli sui genericiIterable e IteratorRiepilogo - Archiviazione generica13Concetti avanzati di OOP
Composizione vs ereditarietàMetodi di estensioneClassi chiamabiliClassi sealed (Dart 3)Record (Dart 3)Pattern e matching (3.0)Enum con metodi16Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente2I costruttori in Dart
Costruttore predefinitoCostruttori con nomeListe di inizializzazioneCostruttori costantiCostruttori factoryCostruttori di reindirizzamentoRiepilogo - Crea forme5Incapsulamento
Membri pubblici e privatiConvenzione del prefisso _Visibilità a livello di libreriaApprofondimento su getter e setterNascondimento delle informazioniRiepilogo - Registri degli studenti8Mixin
Introduzione ai MixinCreare MixinUsare più MixinParola chiave on nei MixinMixin vs ereditarietàMixin vs interfacciaRiepilogo - Sistema animale11Metodi speciali
Sovrascrittura di toString()Sovrascrittura di hashCode e ==Interfaccia ComparableMetodo call()Sovrascrittura di noSuchMethodRiepilogo - Collezione personalizzata14Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneSingletonFactoryObserverStrategy3Proprietà delle classi
Membri di istanza e staticiCampi final e constVariabili lateMetodi e campi staticiGetter e setterRiepilogo - Gestore di conti bancari6Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiL’annotazione @overrideLa parola chiave final per le classiCostruttori ed ereditarietàRiepilogo - Gerarchia dei dipendenti9Polimorfismo
Fondamenti di polimorfismoPolimorfismo tramite interfacceControllo del tipo a runtimeGli operatori is e asParola chiave covariantRiepilogo - Elaboratore di pagamenti12OOP asincrona
Future e async/awaitNozioni di base sugli streamController degli streamCostruttori asincroniAsync nei metodi di classeRiepilogo - Recupero dei dati15Pattern di progettazione Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern RepositoryEsercitati da solo: Compilatore Dart online