Menu
Coddy logo textTech

Membri pubblici e privati

Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 30 di 110.

L'incapsulamento è uno dei principi fondamentali della programmazione orientata agli oggetti. Riguarda il controllo dell'accesso ai dati interni di una classe, decidendo cosa deve essere visibile all'esterno e cosa deve rimanere nascosto.

In Dart, i membri di una classe (campi e metodi) sono pubblici per impostazione predefinita. Ciò significa che qualsiasi codice può accedervi direttamente:

class BankAccount {
  String owner;
  double balance;
  
  BankAccount(this.owner, this.balance);
}

var account = BankAccount('Alice', 1000);
account.balance = -500;  // Chiunque può modificarlo direttamente!

Questo è problematico. Nulla impedisce di impostare un saldo non valido.

Per proteggere i dati interni, Dart usa i membri privati. Un membro diventa privato quando il suo nome inizia con un trattino basso _:

class BankAccount {
  String owner;
  double _balance;  // Privato - inizia con un trattino basso
  
  BankAccount(this.owner, this._balance);
  
  double get balance => _balance;  // Accesso controllato
}

Ora _balance non può essere consultato direttamente dall'esterno della libreria in cui è definita la classe. Il codice esterno deve usare invece il getter pubblico. Questo ti permette di controllare come vengono letti e modificati i dati, assicurandoti che i tuoi oggetti rimangano sempre in uno stato valido.

challenge icon

Sfida

Facile

Costruiamo un semplice gestore di password che mostra la differenza tra membri pubblici e privati. Vedrai come il prefisso di sottolineatura protegge i dati sensibili dall'accesso diretto dall'esterno della libreria della classe.

Creerai due file per organizzare il codice:

  • credential.dart: definisci una classe Credential che memorizza le informazioni di accesso a un sito web. La classe dovrebbe avere:
    • Un String website pubblico: va bene che chiunque possa vedere a quale sito web si riferisce
    • Un String username pubblico: il nome utente può essere visibile
    • Un String _password privato: la password effettiva deve essere protetta
    • Un costruttore che accetta tutti e tre i valori
    • Un getter pubblico password che restituisce il _password privato (accesso controllato)
    • Un metodo getMaskedPassword() che restituisce la password sostituendo tutti i caratteri con asterischi * (della stessa lunghezza della password effettiva)
    • Un metodo displayCredential() che stampa in modo sicuro le informazioni della credenziale (mostrando la password mascherata, non quella reale)
  • main.dart: importa la classe della credenziale e mostra come l'incapsulamento protegge la password:
    • Crea una credenziale per il sito web 'github.com', con nome utente 'dev_user' e password 'secret123'
    • Crea un'altra credenziale per il sito web 'email.com', con nome utente 'john_doe' e password 'myP@ss'
    • Per ogni credenziale, chiama displayCredential(), quindi stampa Actual password length: [length] usando il getter pubblico per accedere alla lunghezza della password

Il metodo displayCredential() dovrebbe stampare in questo formato:

--- Credential ---
Website: [website]
Username: [username]
Password: [maskedPassword]

Risultato previsto:

--- Credential ---
Website: github.com
Username: dev_user
Password: *********
Actual password length: 9
--- Credential ---
Website: email.com
Username: john_doe
Password: ******
Actual password length: 6

Provalo tu

import 'credential.dart';

void main() {
  // TODO: Crea una credenziale per github.com
  // website: 'github.com', username: 'dev_user', password: 'secret123'
  
  // TODO: Chiama displayCredential() sulla prima credenziale
  
  // TODO: Stampa la lunghezza effettiva della password usando il getter pubblico
  // Formato: "Actual password length: [length]"
  
  // TODO: Crea una credenziale per email.com
  // website: 'email.com', username: 'john_doe', password: 'myP@ss'
  
  // TODO: Chiama displayCredential() sulla seconda credenziale
  
  // TODO: Stampa la lunghezza effettiva della password 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