PROGRAMMAZIONE ORIENTATA AGLI OGGETTI
5.3 L’ASTRAZIONE NELLA PROGRAMMAZIONE AD OGGETTI
La programmazione ad oggetti, come già sottolineato, è un modo alternativo di affrontare e scomporre il progetto software. Il suo paradigma è che l’unità elementare di scomposizione non è più la procedura bensì l’oggetto, inteso come modello di entità reale.
Quest’ultima operazione, chiamata abstraction (o data abstraction), ha un’importanza fondamentale nei linguaggi orientati agli oggetti ed è uno dei metodi fondamentali con il quale gli esseri umani affrontano i sistemi complessi. Esistono varie definizioni del concetto di astrazione. Booch definisce l’astrazione come segue: <<con l’attività di astrazione si individuano le caratteristiche di un oggetto che lo distinguono da tutti gli altri tipi di oggetti fornendo, quindi, per l’oggetto in questione, un ben preciso ambito concettuale, relativo al punto di vista dell’osservatore>>.
L’attività di astrazione implica la facilità di definire oggetti che rappresentino “attori” che possono svolgere lavori, riportare e cambiare il loro stato, e comunicare con gli altri oggetti del sistema.
Un sistema complesso è, così, visto come un insieme di oggetti interagenti (Figura 1), ciascuno dei quali provvisto di una struttura dati e dell’insieme delle operazioni, che l’oggetto è capace di compiere su tale struttura. Un oggetto, inclusa la propria struttura dati, non viene influenzato dai cambiamenti che avvengono al di fuori di esso.
5.4 PROPRIETA’
In genere, un linguaggio di programmazione è definito ad oggetti quando permette di implementare i tre meccanismi seguenti:
• incapsulamento
• ereditarietà
• polimorfismo
L’incapsulamento è la proprietà per cui un oggetto contiene (incapsula) al suo interno degli attributi (dati). Lo scopo principale dell’incapsulamento è, appunto, dare accesso ai dati incapsulati solo attraverso i metodi accessibili all’esterno.
Se gestito opportunamente, l’incapsulamento permette di vedere l’oggetto come un
black-box (scatola nera) di cui, attraverso l’interfaccia, è noto come si comporta e
come interagisce con l’esterno, ma non come esegue le funzioni.
L’incapsulamento prevede di raggruppare in un’unica entità (la classe) la definizione delle strutture dati e delle procedure, che operano su di esse.
Le classi definiscono, appunto, gli “oggetti” software dotati di attributi (dati) e metodi (procedure), che operano sui dati dell’oggetto stesso.
L’ereditarietà permette essenzialmente di definire le classi, a partire da altre già definite. Una classe o una sottoclasse, derivata attraverso l’ereditarietà, mantiene i metodi e gli attributi della classe da cui deriva (classe base o superclasse); inoltre, possono essere aggiunti nuovi attributi e metodi e può essere modificato il comportamento dei metodi ereditati (overriding).
Si noti in Figura 2 come, grazie alla proprietà di ereditarietà, le informazioni comuni delle classi “Studente” e “Professore” sono fattorizzate nella classe “Persona”, da cui “Studente” e “Professore” le ereditano.
Quando una classe eredita da una superclasse si parla di eredità singola, viceversa di ereditarietà multipla. Alcuni linguaggi (tra gli altri Java24) forniscono il supporto esclusivo all’eredità singola. Altri (Phyton, C++) prevedono l’eredità multipla.
L’ereditarietà può essere usata come meccanismo per gestire l’estensione e il riutilizzo del codice e risulta particolarmente vantaggiosa sfruttando le relazioni di eredità, esistenti nei concetti modellati, attraverso il costrutto di classe. Oltre all’evidente riutilizzo del codice della superclasse, l’ereditarietà permette la definizione di codice generico, attraverso il meccanismo del polimorfismo.
Il polimorfismo è una proprietà del codice che permette diversi comportamenti a seconda del contesto di esecuzione. In pratica, ciò avviene quando lo stesso codice può essere utilizzato con istanze di tipi diversi. Nella programmazione ad oggetti, il polimorfismo è legato alle relazioni di eredità tra classi, garantendo delle proprietà in
24 Java è un linguaggio di programmazione orientato agli oggetti, creato da James Gosling e altri ingegneri di Sun Microsystems.
comune tra gli oggetti. La possibilità che le classi derivate implementino in modo differente i metodi e le proprietà dei propri antenati rende possibile che gli oggetti, appartenenti a delle sottoclassi di una stessa classe, rispondano diversamente alle stesse istruzioni.
5.5 CLASSI
Nella programmazione orientata ad oggetti, una classe è definibile come un unione di metodi per la gestione di variabili, usata come modello per creare oggetti. In informatica, le classi sono utilizzate per l’effettiva programmazione di un fenomeno osservato che si vuole riprodurre virtualmente. Ad esempio, all’interno del simulatore, è stata creata una classe che riportasse in simulazione le caratteristiche di comportamento di differenti agenti studiati nella realtà. Ogni oggetto software, inoltre, è creato richiamando una classe. Il modello “classe” comprende attributi e metodi, che saranno condivisi da tutti gli oggetti (istanze) creati (ovvero istanziati). Una classe può rappresentare una persona, un luogo o una cosa ed è, quindi, l’astrazione di un concetto implementata in un programma informatico. Essa definisce, al proprio interno, lo stato ed il comportamento dell’entità che rappresenta.
Grazie alle relazioni di ereditarietà, nuove classi di oggetti sono derivate da classi esistenti, ereditando le loro caratteristiche ed accorpandole con le proprie25.
Definire una classe coincide essenzialmente con la definizione dei propri membri:
• attributi: rappresentano quelle proprietà che descrivono le caratteristiche peculiari di un oggetto (ad esempio, riferendoci ad una persona: altezza, peso)
• metodi: identificabili come proprietà, atte a svolgere delle azioni
Dal punto di vista matematico il concetto di classe è definibile come un insieme in modo intensivo, ovvero, sono definite le caratteristiche e non sono elencati gli elementi. In altre parole, sono definiti i metodi ma non sono forniti i dati su cui i metodi operano.
25
Per comprendere meglio questo concetto, fare riferimento al manuale utente in cui sarà spiegata una
5.6 OGGETTI
Un oggetto è un’istanza di una classe, ossia, la realizzazione di un dato secondo le specifiche funzioni definite nella classe stessa. Un oggetto è la rappresentazione di una classe all’interno del programma, in cui, oltre al nome della classe, vengono definite le sorgenti dati a cui le variabili, richiamate nei metodi, devono fare riferimento.
Esso contiene gli attributi, definiti nella classe, e il valore degli attributi determina il suo valore (o stato). Secondo il principio, noto come information hinding26, l’accesso
agli attributi di un’istanza è permesso solo tramite metodi richiamati su quello stesso oggetto. Facendo riferimento al simulatore, un oggetto creato sulla classe rappresentante gli agenti “random” può solamente richiamare metodi interni a questa specifica classe e non metodi appartenenti a classi diverse.