"Ciao, Amigo! Oggi ti aprirò un mondo nuovo e interessante. Sto parlando della programmazione orientata agli oggetti (OOP) . Hai già imparato a conoscere classi e oggetti. Oggi andrai per saperne di più su di loro, molto di più."

Inizieremo con i quattro pilastri dell'OOP. Sono astrazione, incapsulamento, ereditarietà e polimorfismo. (C'erano tre, ma l'astrazione è stata aggiunta in seguito)

1) Astrazione.

Un buon esempio di astrazione nella vita reale sono le descrizioni del lavoro in un'azienda. Un titolo di lavoro è una cosa, ma i suoi doveri sono una questione completamente diversa.

Immagina di creare l'organigramma per la tua futura azienda. Potresti dividere i compiti di una segretaria, distribuendoli su molte altre posizioni. Potresti suddividere il lavoro dell'amministratore delegato in diverse posizioni separate: chief financial officer, chief technology officer, chief marketing officer, chief human resources officer. Oppure potresti combinare le posizioni di responsabile dell'ufficio e reclutatore in una sola.

Supponiamo che ti vengano in mente i nomi per le posizioni nella tua azienda, e poi "distribuisci" le responsabilità per queste posizioni. Questa è l'astrazione : dividere qualcosa di grande e monolitico in diverse piccole parti.

OOP: principi di base - 1

Dal punto di vista di un programmatore, l'astrazione divide correttamente un programma in oggetti.

Di solito un programma di grandi dimensioni può essere rappresentato come oggetti interagenti in una dozzina di modi diversi. L'astrazione ti consente di individuare le caratteristiche principali di un oggetto e omettere qualsiasi cosa meno importante.

L'astrazione è come una strategia militare. Se scegli la strategia sbagliata, nessuna tattica ingegnosa salverà la situazione.

2) Incapsulamento.

L'incapsulamento ha lo scopo di migliorare l'interazione tra gli oggetti semplificandoli.

OOP: principi di base - 2

Il modo migliore per semplificare qualcosa è nascondere qualcosa di complicato a chi non ha bisogno di saperlo. Ad esempio, se ti sedessi dietro i comandi del pilota di un jet Boeing, ci vorrebbe molto tempo per capire come funzionano:

OOP: principi di base - 3

Invece ai passeggeri dell'aereo sembra tutto più semplice: comprano un biglietto e salgono sull'aereo, che poi decolla e atterra. Puoi facilmente volare da un continente all'altro, sapendo solo come «comprare un biglietto» e «salire su un aereo». Non vediamo nessuna delle complessità legate alla preparazione dell'aereo per il volo, il decollo, l'atterraggio e varie potenziali situazioni di emergenza. E non abbiamo fatto menzione di navigazione satellitare, pilota automatico e centri di controllo del traffico aereo. Questo semplifica la nostra vita.

In termini di programmazione, l'incapsulamento è «nascondere l'implementazione». Mi piace questa definizione. La nostra classe può contenere centinaia di metodi e implementare comportamenti molto complessi in varie situazioni. Ma possiamo nascondere tutti i suoi metodi da occhi indiscreti (marcandoli « privati »), lasciando solo due o tre metodi per l'interazione con altre classi (marcandoli « pubblici »). Quindi tutte le altre classi nel nostro programma vedranno e chiameranno solo questi pochi metodi su this class . Tutta la complessità della classe sarà nascosta all'interno, proprio come la cabina di pilotaggio è nascosta alla vista dei passeggeri felici.

3) Ereditarietà.

L'ereditarietà è un concetto nella programmazione e nella vita reale. Nella programmazione, l'ereditarietà è una relazione speciale tra due classi. Ma l'eredità nella vita reale è molto più interessante.

Se dobbiamo creare qualcosa nella vita reale, abbiamo due opzioni:

1) creare ciò di cui abbiamo bisogno da zero e impiegare molto tempo e sforzi per farlo.

2) fare ciò di cui abbiamo bisogno usando cose che già esistono.

La migliore strategia è questa: prendiamo una buona soluzione esistente, la rielaboriamo e la modifichiamo per soddisfare le nostre esigenze, quindi la usiamo.

Considera l'evoluzione umana. Se facciamo risalire il loro inizio all'inizio della vita sul pianeta, vediamo che sono passati miliardi di anni. Ma se pensiamo agli esseri umani come a partire dalle scimmie, allora sono passati solo un paio di milioni di anni. Creare qualcosa da zero richiede più tempo. Molto più a lungo.

Allo stesso modo, nella programmazione possiamo creare una classe basata su un'altra. La nuova classe diventa un discendente (erede) di una classe esistente. Questo è molto utile quando hai già una classe che contiene l'80-90% dei dati e dei metodi necessari. Dichiariamo semplicemente una classe adatta come genitore della nostra nuova classe. Tutti i dati e i metodi della classe genitore diventano automaticamente parte della nuova classe. Comodo, vero?

4) Polimorfismo.

Il polimorfismo è un concetto di programmazione che descrive la situazione in cui diverse implementazioni sono nascoste dietro la stessa interfaccia. Per trovare un analogo nella vita reale, possiamo guardare al processo di guida di un'auto.

Se una persona può guidare un camion, allora potrebbe anche essere messa al volante di un'ambulanza o di un'auto sportiva. Una persona può guidare un'auto indipendentemente dal tipo di auto, perché hanno tutti la stessa interfaccia di controllo: volante, pedali e cambio. Le auto sono organizzate in modo diverso all'interno, ma condividono tutte la stessa interfaccia di controllo.

Tornando alla programmazione, il polimorfismo ci permette di interagire allo stesso modo con oggetti di classi diverse (di solito con un antenato comune). Il significato di questo non può essere sottovalutato. Diventa più importante man mano che un programma si ingrandisce.

OOP è principi. Leggi di programmazione. Ognuno di loro ci limita in qualche modo, ma in cambio offre enormi vantaggi man mano che i programmi crescono. I quattro principi dell'OOP sono come le quattro gambe di una sedia. Se ne togli anche solo uno, l'intero sistema diventa instabile.