Menu
Coddy logo textTech

Visibilità a livello di libreria

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

In Dart, la privacy viene applicata a livello di libreria, non a livello di classe. Questa è una distinzione fondamentale rispetto a linguaggi come Java o C++. Una libreria in Dart è in genere un singolo file o più file collegati tramite direttive part.

I membri privati (quelli che iniziano con _) sono accessibili ovunque all'interno della stessa libreria, anche da altre classi:

// Entrambe le classi nello stesso file (stessa libreria)
class Engine {
  int _horsepower = 200;  // Privato per questa libreria
}

class Car {
  void showPower(Engine engine) {
    print(engine._horsepower);  // Accessibile! Stessa libreria
  }
}

Tuttavia, quando importi una classe da un file diverso, i suoi membri privati diventano davvero nascosti:

// file: engine.dart
class Engine {
  int _horsepower = 200;
  int get power => _horsepower;
}

// file: main.dart
import 'engine.dart';

void main() {
  var engine = Engine();
  // print(engine._horsepower);  // Errore! Non accessibile
  print(engine.power);           // Funziona - usa un getter pubblico
}

Questa privacy a livello di libreria consente alle classi nello stesso file di collaborare strettamente, nascondendo al contempo i dettagli di implementazione al codice esterno. È una scelta progettuale intenzionale che incoraggia a organizzare le classi correlate nella stessa libreria.

challenge icon

Sfida

Facile

Creiamo un sistema di collaborazione tra team che dimostri come funziona la privacy a livello di libreria in Dart. Vedrai come le classi nello stesso file possono accedere ai membri privati delle altre, mentre il codice in file separati non può farlo.

Organizzerai il codice in due file:

  • team.dart: questo file conterrà due classi che collaborano strettamente nella stessa libreria:
    • Una classe Member con un String name pubblico e un int _performanceScore privato inizializzato a 50. Includi un costruttore che accetta il nome e un getter pubblico performanceScore che restituisce il punteggio privato.
    • Una classe TeamLead nello stesso file, che può accedere direttamente al campo privato di Member (perché si trovano nella stessa libreria). Questa classe dovrebbe avere un String name pubblico, un costruttore che accetta il nome e un metodo evaluateMember(Member member) che accede direttamente a member._performanceScore, vi aggiunge 10 e stampa [leadName] boosted [memberName]'s score to [newScore].
  • main.dart: importa il file del team e mostra la differenza nell'accesso:
    • Crea un Member chiamato 'Alice'
    • Crea un TeamLead chiamato 'Bob'
    • Stampa Initial score: [score] usando il getter pubblico di Alice
    • Fai valutare Alice a Bob usando evaluateMember
    • Stampa Updated score: [score] usando il getter pubblico
    • Stampa Direct access from main: Not allowed (questo ci ricorda che main.dart non può accedere direttamente a _performanceScore perché si trova in una libreria diversa)

L'intuizione chiave è che TeamLead può leggere e modificare direttamente il campo privato _performanceScore di Member perché entrambe le classi si trovano nello stesso file (la stessa libreria). Tuttavia, il codice in main.dart deve usare il getter pubblico perché si trova in una libreria diversa.

Output previsto:

Initial score: 50
Bob boosted Alice's score to 60
Updated score: 60
Direct access from main: Not allowed

Provalo tu

import 'team.dart';

void main() {
  // TODO: Crea un Member chiamato 'Alice'

  // TODO: Crea un TeamLead chiamato 'Bob'

  // TODO: Stampa "Initial score: [score]" usando il getter pubblico di Alice

  // TODO: Fai valutare Alice a Bob usando evaluateMember

  // TODO: Stampa "Updated score: [score]" usando il getter pubblico

  // TODO: Stampa "Direct access from main: Not allowed"
  // Nota: Non possiamo accedere a alice._performanceScore qui perché
  // main.dart si trova in una libreria diversa da team.dart
}
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