La programmazione orientata agli oggetti (OOP) è un paradigma di programmazione basato sul concetto di oggetto. In OOP, i programmi sono organizzati in oggetti, che contengono dati e codice. Il codice in un oggetto è organizzato in metodi, che sono procedure che manipolano i dati dell’oggetto.
OOP ti permette di creare componenti software riutilizzabili. Per per esempio, puoi creare un componente software che rappresenta un conto bancario. Questo componente può essere utilizzato in qualsiasi programma che ha bisogno di trattare con i conti bancari.
OOP rende anche più facile la modularizzazione dei programmi. Cioè, puoi spezzare un grande programma in pezzi più piccoli, ognuno dei quali è un oggetto. Questo rende il programma più facile da capire e mantenere.
Infine, OOP ti permette di creare programmi che possono essere estesi facilmente. Cioè, puoi aggiungere nuove funzionalità ad un programma esistente senza dover cambiare il codice esistente.
I concetti base sui quali si basa la OOP sono applicabili sia ad applicazioni WEB che a software più sofisticati, come i giochi 3D. Poiché la tecnica non è legata ad un linguaggio di programmazione specifico, non richiede alcuna conoscenza precedente per essere compresa; tuttavia è comunque suggerita.
Indice dei contenuti
Programmazione ad oggetti (OOP)
Cominciamo con il dire che l’approccio OOP si basa su oggetti che interagiscono tra loro attraverso messaggi o procedure, mantenendo il loro stato interno, la logica di business e i dati separati.
L’idea alla base della programmazione orientata agli oggetti è l’oggetto. La caratteristica principale di un oggetto è la sua Classe (che identifica gli oggetti), così come gli attributi e i metodi della classe. Una classe è un’astrazione che rappresenta un insieme di caratteristiche comuni (struttura e funzione) condivise da un gruppo di oggetti distinti (istanze).
Potrebbe interessarti: Linguaggi di programmazione: i 10 più richiesti nel mondo del lavoro
OOP: concetti base
I concetti base della programmazione orientata agli oggetti (OOP) sono:
- Oggetti
- Classi
- Ereditarietà
- Polimorfismo
- Incapsulamento
Gli Oggetti
Un oggetto è un componente software che ha dati e codice. I dati sono rappresentati dagli attributi e il codice è rappresentato dai metodi. Gli attributi sono variabili che memorizzano dati e i metodi sono funzioni che operano sui dati.
Per esempio, considera un oggetto che rappresenta un conto bancario. L’oggetto avrebbe attributi come il numero di conto, il saldo e il nome della banca. Avrebbe anche metodi come deposito() e prelievo().
Le Classi
Una classe è un modello per creare oggetti. Definisce gli attributi e i metodi che tutti gli oggetti di quella classe condivideranno. Per esempio, la classe ContoCorrente sarebbe un modello per la creazione di oggetti conto corrente. Definirebbe gli attributi e i metodi che tutti gli oggetti del conto bancario condividono.
L’Ereditarietà
L’ereditarietà ti permette di creare nuove classi che sono basate su classi esistenti. Le nuove classi ereditano gli attributi e i metodi delle classi esistenti.
Questo rende possibile creare oggetti complessi combinando oggetti più semplici.
Per esempio, considera una gerarchia di classi per le forme. La classe base è Forma e ha due sottoclassi: Cerchio e Rettangolo. Entrambe queste classi ereditano gli attributi e i metodi della classe Forma. Inoltre, ogni classe ha i propri attributi e metodi unici.
Il Polimorfismo
Polimorfismo significa che un oggetto può assumere molte forme.
Per esempio, una classe Cerchio potrebbe avere un metodo draw() che disegna il cerchio in un modo specifico. Ma la classe Rettangolo potrebbe avere una diversa implementazione del metodo draw() che disegna il rettangolo in un modo diverso.
In parole semplici, lo stesso metodo (draw()) si comporta diversamente a seconda dell’oggetto su cui viene chiamato.
L’Incapsulamento
Incapsulamento significa che i dati di un oggetto sono nascosti da altri oggetti. Cioè, altri oggetti possono accedere ai dati solo attraverso i metodi dell’oggetto. Questo ti permette di controllare come gli altri oggetti possono utilizzare i dati in un oggetto.
Per esempio, una classe Conto potrebbe avere un metodo saldo() che restituisce il saldo del conto. Ma potrebbe non avere un metodo impostaSaldo(). Questo significherebbe che altri oggetti potrebbero solo leggere il saldo, ma non cambiarlo.
Questo è un concetto importante perché ti permette di proteggere i dati in un oggetto dall’essere manomesso da altri oggetti.
L’importanza dell’astrazione nella programmazione ad oggetti
L’astrazione è una tecnica per semplificare un problema difficile. È simile all’incapsulamento in quanto è un’espansione dell’incapsulamento. Nella progettazione orientata agli oggetti, i programmi sono spesso piuttosto enormi. Possono includere centinaia o migliaia di oggetti distinti che interagiscono tra loro. Considera un progetto con diversi sviluppatori che lavorano per mesi, se non anni. Senza un “accordo”, mantenere il codice aggiornato e incorporare tutte le modifiche e gli aggiornamenti richiesti diventerebbe estremamente difficile.
Per risolvere un problema, è necessario non perdersi in ogni dettaglio, ma piuttosto concentrarsi su quelli che portano alla sua soluzione. In pratica, l’astrazione permette una risposta più generale e una che può essere utilizzata in tutte le circostanze simili. Quindi una soluzione che dovrebbe essere semplice da usare (per un uso futuro) e raramente modificata nel tempo è l’ideale.
Considera questo esempio. La classe “Ciclomotore” è stata volutamente alterata in “Motorino” perché potrebbe ospitare motociclette a tre ruote, così come piccoli quadricicli, oltre ai ciclomotori. Questi mezzi hanno per lo più caratteristiche simili, ma con valori differenti.
Quali sono le somiglianze tra astrazione e incapsulamento? L’astrazione è un meccanismo che permette all’incapsulamento di funzionare.
Prendi, per esempio, la macchina del caffè. È disponibile in una varietà di forme e colori, ma tutto quello che devi fare per preparare una tazza di caffè è inserire la capsula e premere un pulsante. Quindi, consideriamo che l’astrazione sia un insieme di funzioni pubbliche (interfaccia) che qualsiasi altra classe può utilizzare senza “sapere” come funzionano (che l’acqua nella macchina sia riscaldata da un riscaldatore elettrico o a gas, o con un laser, non ci interessa; tutto ciò che ci interessa è che la macchina esegua la sua funzione).
In sintesi, l’astrazione è la capacità di concentrarsi sulle caratteristiche più importanti nella rappresentazione di un’entità.
Per descrivere un oggetto o entità, bisogna prima identificare quanto segue:
- le sue caratteristiche o attributi
- le azioni che può eseguire
Il ciclomotore, per esempio, è rappresentato da attributi, che sono astrazioni del dispositivo. Le azioni che possono essere eseguite su un ciclomotore, o che possono essere utilizzate per alterare lo stato del ciclomotore in un altro modo.
Ovviamente, l’insieme degli oggetti generati forma un’astrazione di un sistema di dominio.
Quindi, passiamo attraverso tre tipi di astrazione per la sua implementazione nella programmazione orientata agli oggetti:
- astrazione funzionale (i metodi degli oggetti)
- astrazione dei dati (gli stati o attributi degli oggetti)
- astrazione del sistema (l’insieme degli oggetti che comunicano tra di loro)
Cosa sono le Interfacce
Un’interfaccia è composta da una serie di nomi di metodi astratti che possono essere implementati da diverse classi.
Un’interfaccia è una specifica per un insieme di metodi. Un oggetto che implementa un’interfaccia deve implementare tutti i metodi dell’interfaccia.
Per esempio, l’interfaccia Forma potrebbe specificare che tutte le forme devono avere un metodo draw(). Questo significa che qualsiasi oggetto che implementa l’interfaccia Shape deve avere un metodo draw().
Interfacce sono importanti perché ti permettono di creare classi che non hanno dati. Tutti i dati sono forniti dagli oggetti che implementano l’interfaccia. Questo rende possibile creare classi riutilizzabili che possono essere utilizzate con qualsiasi tipo di dati.
La programmazione ad oggetti in pratica
Immaginiamo una classe chiamata “Ciclomotore” I seguenti sono alcuni dei possibili attributi: Potenza del motore, Tipo di alimentazione, Numero di ruote, Numero di porte e così via. “ecc
Per far funzionare il programma dovresti essere in grado di: Avviare il motore, Fermare il motore, Aumentare la velocità, Abbassare la marcia, ecc. Questi sono i metodi (o funzioni)
Un esempio distinto della classe dei ciclomotori potrebbe essere un certo modello di ciclomotore, come un Piaggio Liberty.
Naturalmente, il Liberty ha la sua potenza e il suo motore. Il motore è nascosto alla vista ma può essere utilizzato, acceso o spostato.
Inoltre, un’istanza è una cosa che esiste nel tempo (viene costruita e poi distrutta) e nello spazio (occupa la memoria di sistema o di persistenza).
Nella maggior parte dei casi, due oggetti con le stesse caratteristiche non sono identici a livello di applicazione (anche se hanno le stesse caratteristiche).
Cosa sono le istanze di una classe? Un’istanza di una classe è un oggetto specifico che ha gli attributi e i metodi di quella classe. Per esempio, potresti avere una classe chiamata “Ciclomotore” con gli attributi “Potenza del motore”, “Tipo di potenza”, “Numero di ruote” e “Numero di porte”.
Potresti creare un’istanza specifica della classe ciclomotore chiamata “Piaggio Liberty” che ha gli attributi:
- Potenza del motore = “50cc”
- Tipo di alimentazione = “motore a benzina”
- Numero di ruote = 2
- Numero di porte = 0
Una classe è un modello per creare oggetti. Puoi creare tutti gli oggetti che vuoi da una classe, ognuno con il suo un insieme unico di attributi e metodi.
Le istanze hanno quindi un ruolo fondamentale in OOP. La classe è il modello e le istanze sono gli oggetti specifici che vengono creati dal modello.