Le basi della programmazione object oriented: classi ed oggetti

I concetti di classe ed oggetto, sono strettamente legati. Esistono infatti, delle definizioni ufficiali derivanti dalla teoria della programmazione orientata agli oggetti, che di seguito vi presentiamo:

Definizione 1:

una classe è un’astrazione per un gruppo di oggetti che condividono le stesse caratteristiche e le stesse funzionalità.

Definizione 2:

un oggetto è un’istanza (ovvero, una creazione 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 la definizione di oggetto, e il concetto di oggetto tramite la definizione di classe, non è di certo il massimo della chiarezza! Ma la situazione è molto meno complicata di quella che può sembrare. Passiamo subito ad un esempio:

 

class Punto

          {

        int x;

        int y;

          }

 

 

Sopra abbiamo definito una classe Punto. Evidentemente, la funzione di questa classe, è quella di astrarre il concetto di punto (a due dimensioni), tramite la definizione delle sue coordinate su di un piano cartesiano. Potremmo salvare questo listato in un file chiamato "Punto.java" , compilarlo, ma non mandarlo in esecuzione (otterremmo un’eccezione). Infatti, in questa classe, è assente il metodo main, e quindi non sarà eseguita nessun’azione inizialmente.

Il concetto di classe è servito per definire come è fatto un generico punto, ma in questo modo, abbiamo solo definito il concetto di punto, in realtà non abbiamo ancora nessun punto da poter utilizzare.

Nel contesto della programmazione ad oggetti, una classe dovrebbe limitarsi a definire che struttura avranno gli oggetti che da essa saranno istanziati. "Istanziare" , come abbiamo già visto, è il termine object oriented che sta per "creare fisicamente" , ed il risultato di un’istanza deve essere un oggetto.

Istanzieremo allora oggetti dalla classe Punto, nel modo seguente:

 

1 class Principale

2 {

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 di tipo Punto e lo chiama punto1 (così come nella classe Punto avevo dichiarato un intero e lo avevo chiamato x). Ma è solamente alla riga 6 che avviene l’istanza della classe Punto. La parola chiave new, di fatto, istanzia la classe Punto. Dalla riga 6 in poi possiamo utilizzare l’oggetto punto1. Precisamente, alle righe 7 e 8, settiamo le coordinate x ed y del punto1, rispettivamente ai valori interi 2 e 6. In pratica, sfruttando la definizione di punto che mi ha fornito la classe Punto, ho creato un oggetto di 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 ".") per accedere alle variabili x e y.

Alla riga 9, però, abbiamo dichiarato ed istanziato in una sola riga di codice un altro oggetto dalla classe Punto chiamandolo punto2. Abbiamo poi settato le coordinate di quest’ultimo rispettivamente a 0 e 1. Abbiamo infine stampato le coordinate di entrambi i punti.

Ora, le definizioni di classi ed oggetto dovrebbero risultare un po’ più chiare: la classe serve per definire come 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 sono punti diversi.

Questi concetti, come d’altronde tutti quelli relativi alla programmazione ad oggetti, sono già familiari a chiunque, giacchè derivanti dalla realtà che ci circonda. L’essere umano, per superare la complessità della realtà, raggruppa gli oggetti in classi. Per esempio nella nostra mente esiste il modello definito dalla classe Persona. Ma nella realtà esistono miliardi di oggetti di tipo Persona, ognuno dei quali ha caratteristiche uniche. Comprendere le definizioni 1 e 2 ora, non dovrebbe essere più un problema.

N.B.: tutti i concetti dell’object orientation, derivano dal mondo reale. Il concetto di classe nella programmazione, può essere paragonato al concetto di "idea" del mondo reale. Per esempio, volendo definire l’idea (astrazione) di un’auto,dovremmo parlare delle caratteristiche e delle funzionalità comuni ad ogni auto. Quindi, banalizzando, potremmo definire un’auto come"un mezzo di trasporto (quindi che si può muovere), con quattro ruote". Questa definizione può essere portata nella programmazione sotto forma di classe dichiarante come attributo un intero chiamato numeroRuote inizializzato a 4, ed un metodo che potremmo chiamare per semplicità muoviti(). Il lettore è rimandato alle prossime pagine per la comprensione e l’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 ed una Fiat Cinquecento, hanno entrambe 4 ruote e si muovono, anche se in modo diverso. La Testarossa e la Cinquecento sono da considerarsi oggetti della classe Auto, e nella realtà esisterebbero come oggetti concreti.

- Osservazione importante

Nel primo esempio abbiamo potuto commentare la definizione di due classi. Per la prima (la classe Punto), abbiamo sottolineato la sua caratteristica di essere un dato. E’ da considerarsi una parte strutturale dell’applicazione, e quindi svolge un ruolo essenziale nell’ambito compilativo. Nell’ambito esecutivo la classe Punto non ha un ruolo. Infatti, sono gli oggetti istanziati da essa che influenzano il flusso di lavoro del programma. Questo può definirsi come il caso standard. In un’applicazione object oriented, una classe dovrebbe limitarsi definire la struttura comune di un gruppo oggetti, non dovrebbe mai possedere né variabili né metodi. Infatti, la classe Punto, non possiede le variabili x e y, bensì, dichiarando le due variabili, definisce gli oggetti che da essa saranno istanziati, come possessori di quelle variabili. Notare che mai all’interno del codice è 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 accade nell’informatica, è sinonimo di appartenenza, e quindi sono gli oggetti a possedere le variabili dichiarate nella classe (che tra l’altro verranno dette "variabili d’istanza"). Infatti, i due oggetti istanziati avevano valori diversi per x e y, il che significa che l’oggetto punto1 ha la sua variabile x e la sua variabile y, mentre l’oggetto punto2 ha la sua variabile x e la sua variabile y. Le variabili di punto1 sono assolutamente indipendenti dalle variabili di punto2. Giacché le classi non hanno membri (variabili e metodi), non eseguono codice e non hanno un ruolo nell’ambito esecutivo, e per quanto visto sono gli oggetti che sono i protagonisti assoluti di quest’ambito. Come spesso accade quando si approccia a Java, appena definita una nuova regola, subito si presenta l’eccezione (che se vogliamo dovrebbe confermarla!). Puntiamo infatti l’attenzione sulla classe Principale. Essa è invece una classe che esegue del codice contenuto all’interno dell’unico metodo main, che per quanto detto, è assunto per default come punto di partenza di un’applicazione Java. In qualche modo i creatori di Java, dovevano stabilire un modo per far partire il runtime di un programma. La scelta è stata fatta in base ad una questione pratica: un’applicazione scritta in C o C++, ha come punto di partenza per default un programma chiamante che si chiama proprio main. In Java i programmi chiamanti non esistono, ma esistono i metodi, ed in particolare i metodi statici, ovvero, dichiarati con un modificatore static. Questo modificatore molto potente sarà trattato in dettaglio nei prossimi moduli. Per ora limitiamoci a sapere che un membro dichiarato statico, appartiene alla classe, e tutti gli oggetti istanziati da essa condivideranno gli stessi membri. Giacché la classe Principale contiene un metodo, può eseguire del codice.

E’ bene che il lettore eviti di utilizzare il modificatore static nei primi tempi ed aspetti che "i tempi 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 nostro discorso.

 

 



Ti potrebbe interessare anche

commenta la notizia

Ci sono 3 commenti
Anonimo
complimenti, fino a questo momento sei stato chiarissimo....ora vediamo nelle prossime pagine..

aarceci
Trovo questa guida eccellente e di chiarezza assoluta, in grado di far comprendere anche ad un profano concetti fondamentali di programmazione.

E' un peccato che sia in così modesta evidenza e di difficile reperimento tramite motori di ricerca.