La programmazione orientata agli oggetti
La programmazione orientata agli oggetti è un modo alternativo per affrontare un problema computazionale che riduce il numero di istruzioni nel programma. E' anche indicata con la sigla OO ( Object Oriented )
Come funziona la programmazione a oggetti? Nella programmazione procedurale tradizionale devo scrivere tutte le assegnazioni per ogni oggetto (dato). Nella programmazione a oggetti, invece, mi basta assegnare le proprietà a una classe. Poi associo ogni oggetto alla classe e l'oggetto eredita automaticamente tutte le proprietà della classe.
Cos'è il paradigma orientato agli oggetti
E' un paradigma di programmazione più vicino al modo di pensare delle persone.
Si distingue dal paradigma procedurale che, invece, è più vicino al modo di elaborare i dati di una macchina.
Esempio. Quando penso allo smartphone, considero il suo stato (acceso o spento, livello di carica batteria, ecc) e alle cose che posso fare con lo smartphone (es. telefonare, navigare su internet, fotografare, ecc. ). Gli stati dell'oggetto sono i dati (es. variabili di istanza, attributi, campi) mentre le cose che si possono fare e il comportamento sono i metodi. Ad esempio, i metodi dello smartphone sono telefonare(), fotografare(), ecc.
Nella programmazione OO (Object Oriented) bisogna astrarre la realtà avvicinando i dati alle operazioni.
Devo creare degli oggetti tratti dalla realtà che mantengano il proprio stato (dati), siano interrogabili (metodi) e interagiscano tra loro.
Tutte le caratteristiche (proprietà+metodi) di un oggetto sono definite dalla classe (o dalle classi) a cui appartiene.
E ovviamente spetta al programmatore definire le classi.
Esempio. Tutti gli smartphone sono accomunati dalle stesse proprietà e funzioni che posso definire in una classe. Ad esempio, le proprietà di uno smartphone sono la memoria interna, la velocità del processore, ecc. mentre i metodi sono telefonare, fotografare, ecc.
Una volta definita la classe gli associo tramite un'istanza un oggettio che ne ereditano automaticamente le proprietà e metodi.
Con più istanze posso creare più oggetti appartenenti alla stessa classe.
Gli oggetti appartenenti a una stessa classe hanno gli stessi metodi e le stesse proprietà (es. attributi, campi, variabili di istanza, ecc. ) ma possono comunque avere valori diversi.
Quindi, ogni oggetto ha comunque una propria identità che lo distingue dagli altri oggetti appartenenti alla stessa classe.
Una volta creati con un'istanza alla classe gli oggetti hanno una vita propria.
Esempio. Due smartphone appartengono alla stessa classe "smartphone" e hanno le stesse proprietà "memoria interna" e "colore" ma il primo ha una memoria interna di 4GB ed è bianco mentre il secondo di 6GB ed è nero. Potrebbero anche avere comportamenti e metodi diversi. Ad esempio, il primo ha la fotocamera rotta mentre il secondo no.
Quando oggetti anche appartenenti a classi diverse comunicano tra loro si crea una rete di oggetti.
Gli oggetti si riconoscono e comunicano tra loro tramite il riferimento, un valore univoco che identifica ogni oggetto presente nella rete.
Le classi, gli oggetti e gli attributi
Cos'è una classe?
Una classe è una famiglia di oggetti che ne definisce le proprietà.
Definisce le caratteristiche generali di un insieme di dati.
Esempio. La classe dei mammiferi definisce le caratteristiche comuni di tutti gli animali mammiferi.
Cos'è un oggetto?
Un oggetto è un dato o un'unità indipendente di codice utilizzabile in più programmi diversi.
Ogni oggetto può essere assegnato a una o più classe.
Esempio. Il gatto e il cane sono due "oggetti" assegnati alla classe dei mammiferi. Contemporaneamente, possono anche essere assegnati alla classe degli animali carnivori. Vale la pena ricordare che nella programmazione informatica un oggetto è un dato e può essere qualsiasi cosa materiale o non materiale, vivente o non vivente. Quindi, anche un animale è un oggetto.
Cosa sono gli attributi?
Ogni classe è costituita da attributi (proprietà) comuni a tutti gli oggetti appartenenti alla classe.
A ogni attributo è assegnato un valore che può variare da un oggetto a un altro.
Per questa ragione sono anche dette variabili-istanza.
Esempio. La classe delle automobili è composta dagli attributi "cilindrata", "alimentazione, "trazione", "colore", "peso", "marca". Ogni oggetto appartenente alla classe delle automobili condivide lo stesso elenco di attributi. Tuttavia, può avere valori diversi assegnati agli attributi. Nell'esempio precedente i due oggetti hanno lo stesso valore soltanto nell'attributo "trazione" mentre negli altri due attributi hanno valori diversi.
Cosa sono i metodi?
A ogni classe sono associati anche i metodi.
Un metodo è una funzione che definisce il comportamento degli oggetti.
Esempio. La classe degli esseri viventi è assegnata ai metodi nasce, muore, si riproduce, ecc. La classe delle automobili ai metodi parcheggiare, trasportare, viaggiare, ecc.
L'ereditarietà degli attributi e dei metodi
Una delle caratteristiche della programmazione a oggetti è l'ereditarietà.
Gli oggetti appartenenti a una classe ereditano gli attributi e i metodi della classe.
A cosa serve? Grazie all'ereditarietà è più facile definire gli oggetti. Devo solo associare gli oggetti alle classi e aggiungere eventualmente le caratteristiche particolari di ogni singolo oggetto.
Le sottoclassi e le superclassi
Anche una classe può appartenere ad altre classi ( dette superclassi ) ed ereditare metodi e attributi.
In questo caso è detta sottoclasse.
Esempio. La classe dei mammiferi è una sottoclasse degli animali. Eredita dalla classe degli animali molti attributi e metodi, senza doverli scrivere due volte ( es. durata della vita, riproduzione, ecc. ).
L'ereditarietà caratterizza tutti i linguaggi basati sulla programmazione a oggetti.
Possono comunque esserci delle differenze.
Esempio. Il linguaggio C adotta l'ereditarietà multipla, ogni classe può avere più superclassi. Il linguaggio Java, invece, usa l'ereditarietà singola, ogni classe può avere soltanto una superclasse.
Un esempio pratico
Creo la classe "mammifero".
Poi definisco una proprietà ( "genere" ) della classe e gli assegno un valore ( "animale" ).
mammifero.genere=animale
Definisco un'altra proprietà ( "essere-vivente" ) della classe per indicare se si tratta di un essere vivente oppure no.
mammifero.essere-vivente=si
A questo punto, apro un'istanza ( "gatto" ) e la associo alla classe ( "mammifero" ).
gatto=mammifero()
L'istanza eredita immediatamente tutte le proprietà della classe a cui è associata.
Pertanto, se chiedo la proprietà "genere" dell'oggetto "gatto", il programma restituisce "animale".
gatto.genere=animale
gatto.essere-vivente=si
Inoltre, se chiedo la proprietà "essere-vivente" dell'oggetto "gatto", il programma restituisce "si".
In pratica, l'oggetto "gatto" ha ereditato la proprietà "genere" e "essere-vivente" dalla classe "mammifero".
Qual è il vantaggio del linguaggio a oggetti?
In un linguaggio procedurale avrei dovuto scrivere due istruzioni per associare alla variabile "gatto" le informazioni "mammifero" e "essere vivente".
Con la programmazione a oggetti, invece, è bastato un solo passaggio.
Nota. Quando gli oggetti sono migliaia e le proprietà sono centinaia, diventa considerevole il vantaggio del linguaggio a oggetti rispetto a quello procedurale.
Un esempio pratico
Se dovessi assegnare 10 proprietà a ogni oggetto, con il linguaggio a oggetti agirei nel seguente modo:
- creo una classe
- digito le 10 proprietà della classe
- associo ogni oggetto alla classe.
In questo modo, evito di dover scrivere decine di assegnazioni per ogni singolo oggetto.
Esempio. Se dovessi assegnare 10 proprietà comuni agli oggetti “gatto”, “cane” e “cavallo”, con il linguaggio procedurale dovrei scrivere 30 assegnazioni (10+10+10). Con il linguaggio orientato agli oggetti ne bastano 13 (10+1+1+1). Quanto più sono i dati da assegnare, tanto maggiore è il vantaggio della programmazione a oggetti.