Incapsulamento dei dati

L'incapsulamento dei dati è il concetto più importante da comprendere durante la programmazione con oggetti. Nella programmazione orientata agli oggetti l'incapsulamento dei dati riguarda:

  • Combinazione di dati e come vengono manipolati in un unico posto. Ciò si ottiene attraverso lo stato (i campi privati) e i comportamenti (i metodi pubblici) di un oggetto.
  • Consentire l'accesso e la modifica dello stato di un oggetto solo attraverso comportamenti. I valori contenuti nello stato di un oggetto possono quindi essere rigorosamente controllati.
  • Nascondere i dettagli di come funziona l'oggetto. L'unica parte dell'oggetto accessibile al mondo esterno sono i suoi comportamenti. Ciò che accade all'interno di questi comportamenti e come viene memorizzato lo stato è nascosto alla vista.

Applicazione dell'incapsulamento dei dati

Innanzitutto, dobbiamo progettare i nostri oggetti in modo che abbiano stato e comportamenti. Creiamo campi privati ​​che contengono lo stato e metodi pubblici che sono i comportamenti.

Ad esempio, se progettiamo un oggetto persona, possiamo creare campi privati ​​per memorizzare il nome, il cognome e l'indirizzo di una persona. I valori di questi tre campi si combinano per rendere lo stato dell'oggetto. Potremmo anche creare un metodo chiamato displayPersonDetails per visualizzare sullo schermo i valori di nome, cognome e indirizzo.

Successivamente, dobbiamo creare comportamenti che accedano e modifichino lo stato dell'oggetto. Questo può essere realizzato in tre modi:

  • Metodi di costruzione. Una nuova istanza di un oggetto viene creata chiamando un metodo di costruzione. I valori possono essere passati a un metodo di costruzione per impostare lo stato iniziale di un oggetto. Ci sono due cose interessanti da notare. Innanzitutto, Java non insiste sul fatto che ogni oggetto abbia un metodo di costruzione. Se non esiste alcun metodo, lo stato dell'oggetto utilizza i valori predefiniti dei campi privati. In secondo luogo, può esistere più di un metodo di costruzione. I metodi differiranno in termini di valori che sono passati a loro e come impostare lo stato iniziale dell'oggetto.
  • Metodi di accesso. Per ogni campo privato possiamo creare un metodo pubblico che restituirà il suo valore.
  • Metodi mutatori. Per ogni campo privato possiamo creare un metodo pubblico che imposterà il suo valore. Se si desidera solo leggere un campo privato, non creare un metodo mutatore per esso.

Ad esempio, possiamo progettare l'oggetto persona in modo che abbia due metodi di costruzione. Il primo non accetta alcun valore e imposta semplicemente l'oggetto in modo che abbia uno stato predefinito (ovvero, il nome, il cognome e l'indirizzo sarebbero stringhe vuote). Il secondo imposta i valori iniziali per il nome e il cognome dai valori passati ad esso. Possiamo anche creare tre metodi di accesso chiamati getFirstName, getLastName e getAddress che restituiscono semplicemente i valori dei campi privati ​​corrispondenti. Crea un campo mutatore chiamato setAddress che imposterà il valore del campo privato dell'indirizzo.

Infine, nascondiamo i dettagli di implementazione del nostro oggetto. Finché ci atteniamo a mantenere privati ​​i campi statali e i comportamenti pubblici, non c'è modo per il mondo esterno di sapere come funziona l'oggetto internamente.

Ragioni per l'incapsulamento dei dati

I motivi principali per l'utilizzo dell'incapsulamento dei dati sono:

  • Mantenere legale lo stato di un oggetto. Forzando la modifica di un campo privato di un oggetto utilizzando un metodo pubblico, possiamo aggiungere codice nei metodi mutatore o costruttore per assicurarci che il valore sia legale. Ad esempio, immagina che l'oggetto persona memorizzi anche un nome utente come parte del suo stato. Il nome utente viene utilizzato per accedere all'applicazione Java che stiamo creando, ma è limitato a una lunghezza di dieci caratteri. Quello che possiamo fare è aggiungere il codice nel metodo mutatore del nome utente che assicuri che il nome utente non sia impostato su un valore più lungo di dieci caratteri.
  • Possiamo cambiare l'implementazione di un oggetto. Finché manteniamo gli stessi metodi pubblici, possiamo cambiare il modo in cui l'oggetto funziona senza rompere il codice che lo utilizza. L'oggetto è essenzialmente una "scatola nera" per il codice che lo chiama.
  • Riutilizzo di oggetti. Possiamo usare gli stessi oggetti in diverse applicazioni perché abbiamo combinato i dati e il modo in cui vengono manipolati in un unico posto.
  • L'indipendenza di ogni oggetto. Se un oggetto è codificato in modo errato e causa errori, è facile testarlo e correggerlo perché il codice si trova in una posizione. In effetti, l'oggetto può essere testato indipendentemente dal resto dell'applicazione. Lo stesso principio può essere utilizzato in grandi progetti in cui a diversi programmatori può essere assegnata la creazione di oggetti diversi.