1. Introduzione

Vogliamo dedicare la lezione di oggi all'incapsulamento . Sai già di cosa si tratta in termini generali.

Incapsulamento

Quali sono i vantaggi dell'incapsulamento? Ce ne sono parecchi, ma posso individuarne quattro che, a mio avviso, sono i principali:


2. Stato interno valido

Nei programmi, si verificano spesso situazioni in cui un oggetto interagisce con diverse altre classi. Queste interazioni con l'oggetto possono danneggiare i dati all'interno dell'oggetto, rendendo impossibile all'oggetto continuare a funzionare come previsto.

Di conseguenza, l'oggetto deve tenere traccia di eventuali modifiche ai propri dati interni o, meglio ancora, apportare le modifiche stesse.

Se non vogliamo che una variabile venga modificata da altre classi, allora la dichiariamo privata. Una volta fatto ciò, solo i metodi della propria classe possono accedervi. Se vogliamo che le variabili siano di sola lettura, dobbiamo aggiungere a public getterper le variabili rilevanti.

Ad esempio, supponiamo di volere che tutti siano in grado di conoscere il numero di elementi nella nostra raccolta, ma non vogliamo che possano modificare la raccolta senza il nostro permesso. Quindi dichiariamo una private int countvariabile e un public getCount()metodo.

L'uso corretto dell'incapsulamento garantisce che nessuna classe possa accedere direttamente ai dati interni della nostra classe, il che impedisce quindi qualsiasi modifica al di fuori del nostro controllo. Queste modifiche sono possibili solo chiamando i metodi della stessa classe delle variabili che vengono modificate.

È meglio presumere che gli altri programmatori useranno sempre le tue classi nel modo più conveniente per loro, non nel modo più sicuro per te (per la tua classe). Questo comportamento è la fonte sia dei bug che dei tentativi di prevenirli.


3. Validazione degli argomenti del metodo

A volte abbiamo bisogno di convalidare gli argomenti passati ai nostri metodi. Ad esempio, supponiamo di avere una classe che rappresenta una persona e ti consente di impostare una data di nascita. Dobbiamo controllare tutti i dati di input per assicurarci che abbiano senso con la logica del programma e la logica della nostra classe. Ad esempio, per non consentire una data di nascita in un 13° mese o il 30 febbraio e così via.

Perché qualcuno dovrebbe indicare il 30 febbraio come data di nascita? Innanzitutto, questo potrebbe essere un errore dell'utente durante l'inserimento dei dati. In secondo luogo, un programma potrebbe contenere molti errori prima che inizi a funzionare come un orologio. Ad esempio, è possibile la seguente situazione.

Un programmatore scrive un programma che identifica le persone il cui compleanno è dopodomani. Ad esempio, diciamo che oggi è il 3 marzo. Il programma aggiunge il numero 2 al giorno corrente del mese e cerca tutti coloro che sono nati il ​​5 marzo. Sembra che sia tutto corretto.

Ma quando arriva il 30 marzo, il programma non troverà nessuno, perché il calendario non ha il 32 marzo. Un programma ha molti meno errori se controlliamo i dati passati ai metodi.

Ricordi quando abbiamo studiato ArrayListe analizzato il suo codice? Abbiamo visto che i metodi gete setcontrollano se indexè maggiore o uguale a zero e minore della lunghezza dell'array. Inoltre, questi metodi generano un'eccezione se l'indice non rientra nei limiti dell'array. Questo è un classico esempio di convalida dell'input.


4. Riduzione al minimo degli errori durante la modifica del codice

Supponiamo di aver scritto una lezione super utile quando eravamo coinvolti in un grande progetto. A tutti è piaciuto così tanto che altri programmatori hanno iniziato a usarlo in centinaia di punti del loro codice.

Il corso è stato così utile che hai deciso di migliorarlo. Ma se rimuovi qualsiasi metodo dalla classe, il codice di dozzine di persone smetterà di essere compilato. Dovranno riscrivere tutto. E più modifiche apporti, più errori creerai. Romperai molte assemblee e sarai odiato.

Ma quando cambiamo i metodi dichiarati come privati, sappiamo che non c'è un'altra classe da nessuna parte che potrebbe chiamare questi metodi. Possiamo riscriverli, modificare il numero di parametri e i loro tipi e qualsiasi codice esterno dipendente continuerà a funzionare. Beh, almeno verrà compilato.


5. Decidiamo come il nostro oggetto interagisce con gli oggetti esterni

Possiamo limitare alcune delle azioni che possono essere eseguite con il nostro oggetto. Ad esempio, supponiamo di voler istanziare un oggetto solo una volta. Anche se può essere creato in più punti del progetto. E possiamo farlo grazie all'incapsulamento.

Incapsulamento 2

L'incapsulamento ci consente di aggiungere ulteriori restrizioni , che possono essere trasformate in ulteriori vantaggi . Ad esempio, la Stringclasse è implementata come oggetto immutabile . Un oggetto della Stringclasse è immutabile dal momento della sua creazione fino al momento della sua morte. Tutti i metodi della Stringclasse ( remove, substring, ...), restituiscono una nuova stringa senza apportare alcuna modifica all'oggetto su cui sono chiamati.

L'incapsulamento è una cosa molto interessante.