In Rust, i modificatori di visibilità (pub, pub(crate), pub(super)) sono stati introdotti come meccanismo per l'incapsulamento e il controllo preciso dell'accesso ai dati e alle funzioni, cosa che mancava in C. L'idea è quella di limitare l'ambito di visibilità degli elementi del modulo e fornire agli utenti della libreria solo ciò di cui hanno realmente bisogno.
La difficoltà principale è che anche se la struttura stessa è dichiarata pubblica (pub), i suoi campi rimangono privati per impostazione predefinita. Spesso sorge la domanda su come organizzare correttamente l'accesso a strutture e moduli annidati, senza compromettere l'incapsulamento e senza rendere l'API "perforata" o, al contrario, troppo chiusa.
Per le strutture, è necessario specificare separatamente i modificatori di accesso per i campi. Quando si progettano strutture autogenerate o tipi memorizzati, è fondamentale riflettere attentamente su quali parti debbano essere aperte all'esterno e quali nascoste. Questa è una parte importante dell'API e dell'architettura del codice.
Esempio di codice:
mod outer { pub struct Exposed { pub field: i32, hidden: bool, } } // L'uso del campo "field" è accessibile, // hidden non lo è. let e = outer::Exposed { field: 42, hidden: true }; println!("{}", e.field); // e.hidden // errore di compilazione
Caratteristiche chiave:
Può una struttura dichiarata come pub essere completamente inaccessibile al di fuori del modulo corrente?
Sì, se tutti i campi della struttura rimangono privati, è pubblica solo di nome — non è possibile creare o inizializzare un'istanza della struttura al di fuori del modulo.
Un campo privato di una struttura può diventare accessibile tramite eredità o in altro modo, eludendo il sistema di modificatori?
No, in Rust non esiste un'ereditarietà classica come nei linguaggi OOP. L'accesso ai campi privati è controllato dal modulo ed è sostanzialmente limitato.
Cosa succede se si crea una struttura con campi pubblici, ma si dichiara il modulo come privato?
La struttura e i suoi campi non saranno visibili al di fuori del modulo genitore — i modificatori non superano i confini dell'ambito di visibilità del modulo genitore.
** Caso negativo
L'utente ha dichiarato una struttura pub, ma tutti i suoi campi sono rimasti privati. Di conseguenza, il codice esterno non può utilizzarla correttamente, né creare un'istanza né ottenere valori.
Pro:
Contro:
** Caso positivo
L'utente ha aperto solo i campi necessari tramite pub, mantenendo dettagli sensibili privati. Per l'accesso vengono utilizzati getter/setter.
Pro:
Contro: