Le basi della programmazione object oriented: classi ed oggetti
I concetti di classe ed oggetto, sono strettamente legati.Esistono infatti, delle definizioni ufficiali derivanti dallateoria della programmazione orientata agli oggetti, che diseguito vi presentiamo:
Definizione 1:
una classe è un’astrazione per ungruppo di oggetti che condividono le stesse caratteristiche ele stesse funzionalità.
Definizione 2:
un oggetto è un’istanza (ovvero, unacreazione fisica) di una classe.
A questo punto, il lettore più "matematico"sicuramente avrà le idee un po’ confuse.Effettivamente definire il concetto di classe tramite ladefinizione di oggetto, e il concetto di oggetto tramite ladefinizione di classe, non è di certo il massimo dellachiarezza! Ma la situazione è molto meno complicata diquella che può sembrare. Passiamo subito ad unesempio:
class Punto { int x; int y; }
Sopra abbiamo definito una classe Punto. Evidentemente, lafunzione di questa classe, è quella di astrarre ilconcetto di punto (a due dimensioni), tramite la definizionedelle sue coordinate su di un piano cartesiano. Potremmosalvare questo listato in un file chiamato"Punto.java" , compilarlo, ma non mandarlo inesecuzione (otterremmo un’eccezione). Infatti, inquesta classe, è assente il metodo main, e quindi nonsarà eseguita nessun’azione inizialmente.
Il concetto di classe è servito per definire comeè fatto un generico punto, ma in questo modo, abbiamosolo definito il concetto di punto, in realtà nonabbiamo ancora nessun punto da poter utilizzare.
Nel contesto della programmazione ad oggetti, una classedovrebbe limitarsi a definire che struttura avranno glioggetti che da essa saranno istanziati."Istanziare" , come abbiamo già visto,è il termine object oriented che sta per "crearefisicamente" , ed il risultato di un’istanza deveessere un oggetto.
Istanzieremo allora oggetti dalla classe Punto, nel modoseguente:
1 class Principale2 {3 public static void main(String args[])4 {5 Punto punto1;6 punto1 = new Punto();7 punto1.x = 2;8 punto1.y = 6;9 Punto punto2 = new Punto();10 punto2.x = 0;11 punto2.y = 1;12 System.out.println(punto1.x);13 System.out.println(punto1.y);14 System.out.println(punto2.x);15 System.out.println(punto2.y);16}17 }
La classe Principale, dichiara alla riga 5, un oggetto ditipo Punto e lo chiama punto1 (così come nella classePunto avevo dichiarato un intero e lo avevo chiamato x). Maè solamente alla riga 6 che avviene l’istanzadella classe Punto. La parola chiave new, di fatto, istanziala classe Punto. Dalla riga 6 in poi possiamo utilizzarel’oggetto punto1. Precisamente, alle righe 7 e 8,settiamo le coordinate x ed y del punto1, rispettivamente aivalori interi 2 e 6. In pratica, sfruttando la definizione dipunto che mi ha fornito la classe Punto, ho creato un oggettodi tipo Punto, che è individuato dal nome punto1.Notiamo anche, l’utilizzo dell’operatore"dot" (che in inglese significa "punto" ,ma nel senso del simbolo di punteggiatura ".") peraccedere alle variabili x e y.
Alla riga 9, però, abbiamo dichiarato ed istanziato inuna sola riga di codice un altro oggetto dalla classe Puntochiamandolo punto2. Abbiamo poi settato le coordinate diquest’ultimo rispettivamente a 0 e 1. Abbiamo infinestampato le coordinate di entrambi i punti.
Ora, le definizioni di classi ed oggetto dovrebbero risultareun po’ più chiare: la classe serve per definirecome sarà fatto un oggetto, l’oggetto èla realizzazione fisica della classe. In questo esempio,abbiamo istanziato due oggetti diversi da una stessa classe.Entrambi questi oggetti sono punti, ma evidentemente sonopunti diversi.
Questi concetti, come d’altronde tutti quelli relativialla programmazione ad oggetti, sono già familiari achiunque, giacchè derivanti dalla realtà che cicirconda. L’essere umano, per superare lacomplessità della realtà, raggruppa gli oggettiin classi. Per esempio nella nostra mente esiste il modellodefinito dalla classe Persona. Ma nella realtàesistono miliardi di oggetti di tipo Persona, ognuno deiquali ha caratteristiche uniche. Comprendere le definizioni 1e 2 ora, non dovrebbe essere più un problema.
N.B.: tutti i concetti dell’object orientation,derivano dal mondo reale. Il concetto di classe nellaprogrammazione, può essere paragonato al concetto di"idea" del mondo reale. Per esempio, volendodefinire l’idea (astrazione) di un’auto,dovremmoparlare delle caratteristiche e delle funzionalitàcomuni ad ogni auto. Quindi, banalizzando, potremmo definireun’auto come"un mezzo di trasporto (quindi che sipuò muovere), con quattro ruote". Questadefinizione può essere portata nella programmazionesotto forma di classe dichiarante come attributo un interochiamato numeroRuote inizializzato a 4, ed un metodo chepotremmo chiamare per semplicità muoviti(). Il lettoreè rimandato alle prossime pagine per la comprensione el’utilizzo del concetto di metodo.
class Auto{ int numeroRuote=4; void muoviti() { // implementazione del metodo… }}
Ogni auto ha 4 ruote, e si muove. Una Ferrari Testarossa eduna Fiat Cinquecento, hanno entrambe 4 ruote e si muovono,anche se in modo diverso. La Testarossa e la Cinquecento sonoda considerarsi oggetti della classe Auto, e nellarealtà esisterebbero come oggetti concreti.
- Osservazione importante
Nel primo esempio abbiamo potuto commentare la definizione didue classi. Per la prima (la classe Punto), abbiamosottolineato la sua caratteristica di essere un dato.E’ da considerarsi una parte strutturaledell’applicazione, e quindi svolge un ruolo essenzialenell’ambito compilativo. Nell’ambito esecutivo laclasse Punto non ha un ruolo. Infatti, sono gli oggettiistanziati da essa che influenzano il flusso di lavoro delprogramma. Questo può definirsi come il caso standard.In un’applicazione object oriented, una classe dovrebbelimitarsi definire la struttura comune di un gruppo oggetti,non dovrebbe mai possedere né variabili németodi. Infatti, la classe Punto, non possiede le variabili xe y, bensì, dichiarando le due variabili, definiscegli oggetti che da essa saranno istanziati, come possessoridi quelle variabili. Notare che mai all’interno delcodice è presente un’istruzione come:
Punto.x
ovvero
nomeClasse.nomeVariabile
(che tra l’altro produrrebbe un errore in compilazione)bensì:
punto1.x
ovvero
nomeOggetto.nomeVariabile
L’operatore "." , come spesso accadenell’informatica, è sinonimo di appartenenza, equindi sono gli oggetti a possedere le variabili dichiaratenella classe (che tra l’altro verranno dette"variabili d’istanza"). Infatti, i dueoggetti istanziati avevano valori diversi per x e y, il chesignifica che l’oggetto punto1 ha la sua variabile x ela sua variabile y, mentre l’oggetto punto2 ha la suavariabile x e la sua variabile y. Le variabili di punto1 sonoassolutamente indipendenti dalle variabili di punto2.Giacché le classi non hanno membri (variabili emetodi), non eseguono codice e non hanno un ruolonell’ambito esecutivo, e per quanto visto sono glioggetti che sono i protagonisti assoluti diquest’ambito. Come spesso accade quando si approccia aJava, appena definita una nuova regola, subito si presental’eccezione (che se vogliamo dovrebbe confermarla!).Puntiamo infatti l’attenzione sulla classe Principale.Essa è invece una classe che esegue del codicecontenuto all’interno dell’unico metodo main, cheper quanto detto, è assunto per default come punto dipartenza di un’applicazione Java. In qualche modo icreatori di Java, dovevano stabilire un modo per far partireil runtime di un programma. La scelta è stata fatta inbase ad una questione pratica: un’applicazione scrittain C o C++, ha come punto di partenza per default unprogramma chiamante che si chiama proprio main. In Java iprogrammi chiamanti non esistono, ma esistono i metodi, ed inparticolare i metodi statici, ovvero, dichiarati con unmodificatore static. Questo modificatore molto potentesarà trattato in dettaglio nei prossimi moduli. Perora limitiamoci a sapere che un membro dichiarato statico,appartiene alla classe, e tutti gli oggetti istanziati daessa condivideranno gli stessi membri. Giacché laclasse Principale contiene un metodo, può eseguire delcodice.
E’ bene che il lettore eviti di utilizzare ilmodificatore static nei primi tempi ed aspetti che "itempi maturino" , per non buttare via tempo prezioso.L’accenno fatto ad un argomento complesso come static,ha solamente lo scopo di chiarire un punto oscuro del nostrodiscorso.