1. Introduzione ai principi dell'OOP

Oggi scoprirai un mondo nuovo e interessante. Il mondo della programmazione orientata agli oggetti ( OOP ). Hai già imparato a conoscere le classi e gli oggetti. Oggi imparerai di più su di loro, molto di più.

OOP è emerso come risposta alla crescente complessità dei programmi. Quando variabili e metodi nei programmi iniziarono a contare le decine di migliaia, divenne chiaro che bisognava fare qualcosa. Una soluzione consisteva nel combinare dati e metodi associati in oggetti separati.

Ora i programmatori dovevano descrivere separatamente come gli oggetti interagiscono esternamente e come si comportano internamente. Ciò ha reso molto più facile capire e scrivere programmi. Tuttavia, rimaneva una domanda: quali metodi dovrebbero essere interni a un oggetto e quali dovrebbero essere disponibili per altri oggetti?

Sono stati tentati molti approcci. E sulla base delle migliori pratiche scoperte, sono emersi 4 principi di OOP . Sono astrazione, incapsulamento, ereditarietà e polimorfismo . In precedenza, ce n'erano solo tre, ma in seguito gli esperti hanno deciso di aggiungere anche l'astrazione.


2. Astrazione

Le persone su Internet discutono ancora sulla definizione di astrazione in OOP . Il problema non è che tutti hanno torto. È che tutti hanno ragione . Più piccolo è un programma, più l'astrazione è legata al linguaggio Java. Più grande è un programma, più l'astrazione è legata alla modellazione/semplificazione di oggetti del mondo reale.

Ma le menti migliori sembrano concordare sul fatto che:

L'astrazione è l'uso delle sole caratteristiche di un oggetto che lo rappresentano in modo sufficientemente accurato in un programma. L'idea principale è quella di rappresentare l'oggetto con il più piccolo insieme di campi e metodi che consentano simultaneamente di risolvere i compiti con sufficiente precisione .

In Java, l'astrazione si realizza attraverso classi e interfacce astratte.

Astrazione nella vita reale

Un buon esempio di astrazione nella vita reale sono le descrizioni delle mansioni presso un'azienda o un'organizzazione. Il titolo di una posizione è una cosa, ma le responsabilità specifiche assegnate a una posizione sono una questione completamente diversa.

Immagina di progettare la struttura organizzativa della tua futura azienda. Puoi dividere le responsabilità di segreteria, distribuendole in diverse posizioni. Puoi suddividere la posizione di CEO in diverse posizioni separate: CFO, CTO, CMO, Direttore delle Risorse Umane. Oppure, ad esempio, puoi combinare le posizioni di capo ufficio e reclutatore in una sola.

Pensi ai titoli di lavoro e poi dividi le responsabilità per queste posizioni. L'astrazione è staccarsi dall'oggetto nel suo insieme e selezionare le proprietà e i componenti essenziali di cui abbiamo bisogno.

Presentazione dei principi dell'OOP.  Astrazione

Dal punto di vista della programmazione, l'astrazione è la corretta divisione di un programma in oggetti . In genere, esistono dozzine di modi per rappresentare qualsiasi programma di grandi dimensioni come oggetti interagenti. L'astrazione ti consente di selezionare le caratteristiche essenziali e ignorare quelle non essenziali.


3. Incapsulamento

L'obiettivo dell'incapsulamento è migliorare le interazioni rendendo gli oggetti più semplici.

E il modo migliore per semplificare qualcosa è nascondere qualcosa di complicato da occhi indiscreti. Ad esempio, se vieni messo nella cabina di pilotaggio di un jumbo jet Boeing, non capirai immediatamente come farlo funzionare:

Ma per i passeggeri dell'aereo è tutto più semplice: si acquista un biglietto e si sale sull'aereo, che decolla e poi atterra. Puoi facilmente volare da un continente all'altro con la sola possibilità di "comprare un biglietto" e "salire su un aereo". Tutta la complessità della preparazione dell'aereo per il volo, il decollo, l'atterraggio e varie situazioni di emergenza ti è nascosta. Per non parlare del navigatore satellitare, dell'autopilota e dei centri di controllo del traffico aereo. E questo ci semplifica la vita.

Da un punto di vista della programmazione, l'incapsulamento "nasconde 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 (contrassegnandoli con il modificatore private) e lasciare solo due o tre metodi per interagire con altre classi (contrassegnandoli con il modificatore public). Quindi tutte le altre classi del nostro programma vedranno solo i tre metodi pubblici e li chiameranno ma non altri. E tutta la complessità sarà nascosta all'interno della classe, proprio come la cabina di pilotaggio è nascosta ai passeggeri felici.


4. Ereditarietà

Ci sono due facce dell'eredità . Ereditarietà nella programmazione ed ereditarietà 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. Crea la cosa di cui abbiamo bisogno da zero, spendendo molto tempo e fatica.
  2. Creare la cosa di cui abbiamo bisogno sulla base di qualcosa che esiste già.

La strategia ottimale è questa: prendi una buona soluzione esistente, modificala un po', adattala alle nostre esigenze e poi usala.

Se ripercorriamo la storia umana fino ai suoi inizi, scopriamo che sono passati miliardi di anni dall'inizio della vita sul pianeta. Ma se consideriamo che il punto di partenza degli umani sono i nostri antenati primati (cioè gli umani sono "basati su" antenati primati), allora sono passati solo un paio di milioni di anni. Costruire da zero richiede più tempo. Molto più a lungo.

Nella programmazione, puoi fare qualcosa di simile creando una classe basata su un'altra. La nuova classe discende da (eredita) la classe esistente. Questo è molto vantaggioso quando una classe esistente ha l'80-90% dei dati e dei metodi di cui abbiamo bisogno. Dichiariamo semplicemente la classe appropriata come genitore della nostra nuova classe, e tutti i dati ei metodi della classe genitore appaiono automaticamente nella nuova classe. Comodo, vero?


5. Polimorfismo

Il polimorfismo è un concetto di programmazione. Descrive una situazione in cui diverse implementazioni sono nascoste dietro una singola interfaccia. Guardando alla vita reale per una controparte, scopriamo che guidare un veicolo è una buona scelta.

Se qualcuno può guidare un camion, allora può anche essere messo al volante di un'ambulanza o al volante di un'auto sportiva. Una persona può guidare un'auto, indipendentemente dal tipo di auto, perché tutte le auto hanno la stessa interfaccia di controllo: volante, pedali e cambio. Gli interni delle auto sono diversi, ma hanno tutti la stessa interfaccia di controllo.

Tornando al mondo della programmazione, il polimorfismo consente di accedere allo stesso modo a oggetti di classi diverse (di solito aventi un antenato comune), una proprietà il cui valore difficilmente può essere sopravvalutato. Il suo valore aumenta man mano che il programma si ingrandisce.

OOP significa principi. Leggi interne. Ognuno di loro ci limita in qualche modo, ma offre grandi vantaggi in cambio quando il programma diventa grande. I quattro principi dell'OOP sono come le quattro gambe di un tavolo. Togline uno e l'intero sistema diventa instabile.