Menu
Coddy logo textTech

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.

challenge icon

Sfida

Facile

Costruiamo 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 classe ScoreTracker che gestisca il punteggio di un giocatore con un adeguato incapsulamento. La classe dovrebbe avere:
    • Un String playerName pubblico: tutti possono vedere chi sta giocando
    • Un int _score privato inizializzato a 0: il punteggio grezzo dovrebbe essere protetto
    • Un int _bonusMultiplier privato inizializzato a 1: è una meccanica interna del gioco
    • Un costruttore che accetta il nome del giocatore
    • Un getter pubblico score che restituisce il valore privato _score
    • Un metodo privato _applyBonus(int points) che restituisce points * _bonusMultiplier
    • Un metodo pubblico addPoints(int points) che usa internamente _applyBonus per calcolare i punti effettivamente aggiunti, aggiorna _score e stampa Added [calculated] points!
    • Un metodo pubblico activateDoubleBonus() che imposta _bonusMultiplier su 2 e stampa Double bonus activated!
    • Un metodo pubblico displayStats() che mostra lo stato attuale del giocatore
  • main.dart: importa il sistema di tracciamento del punteggio e simula una sessione di gioco:
    • Crea un ScoreTracker per il giocatore 'Alex'
    • Chiama displayStats()
    • Aggiungi 10 punti
    • Aggiungi 25 punti
    • Attiva il bonus doppio
    • Aggiungi 15 punti (dovrebbero essere raddoppiati)
    • Chiama displayStats()
    • Stampa Final score: [score] usando il getter pubblico

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

Provalo 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
}
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore Dart online