PROGRAMMAZIONE AD OGGETTI                                                                  ANALISI

 

Per procedere, è necessario comprendere alcuni termini specifici della OOP. Uno dei primi è Class (Classe). La classe estende il concetto di tipo, nel senso che include e specifica sia la struttura dati che i metodi comuni a tutti gli oggetti di una certa categoria. Questo conduce a definire le classi come degli stampi ,delle matrici  (in inglese blueprint),  dai quali ottenere gli oggetti. Quando viene creato un oggetto da una classe si dice che è stata creata un’istanza di una classe.  Per esempio, in Java un istruzione quale:       Audioclip meow = new AudioClip()

crea una nuova istanza denominata meow  della classe ,precedentemente definita o preesistente, AudioClip; in questo linguaggio l’operatore per creare istanze da classi è new, questo operatore alloca la memoria necessaria, in seguito la funzione di garbage collector provvederà a “ripulire” lo spazio di memoria(osserviamo che queste fasi sono nascoste al programmatore).  In Pascal, le  istanze di un nuovo oggetto si dichiarano nello stesso modo delle normali variabili, facendo riferimento a definizioni del tipo oggetto (la classe) o stabilite dal programmatore o già preesistenti; per esempio:

type   Location = Object       {si definisce la classe Location}

x,y : Integer ;                                                        

 end                                              

var Point : Location;             {si crea un istanza denominata Point, della classe Location}        

end

 

Un  concetto chiave della OOP è  l’incapsulamento (occultamento dei dati o information hiding). Formalmente, l’incapsulamento non è   nient’altro che combinazione di dati e comportamenti in un unico package, nel quale l’implementazione dei dati è nascosta all’utente dell’oggetto. I dati di un oggetto sono solitamente denominati  variabili istanze o campi, mentre le funzioni o procedure prendono il nome di metodi. Per avere incapsulamenti che funzionano, il segreto è costruire programmi che non accedono mai direttamente alle variabili istanze (ai campi) di una classe. I programmi dovrebbero interagire con questi dati solo attraverso i metodi dell’oggetto. Se si è previdenti, si forniranno tutti i metodi necessari per l’accesso ai campi, inoltre sussistono istruzioni che permettono di “rafforzare” l’incapsulazione, per es.  private in Pascal e Java. Con l’incapsulamento, l’oggetto si comporta come una “scatola nera”: questa è la chiave di volta della sua possibilità di riutilizzo e della sua affidabilità. 

Fondamentale, per la progettazione secondo le idee della OOP , è un analisi delle relazioni che possono sussistere tra le classi. Le più comuni sono:

·Uso                                                ·Contenimento                                               ·Ereditarietà.

La relazione d’uso è la più ovvia e anche la più generale, una classe ne usa un’altra se manipola oggetti di quest’ultima, è opportuno cercare di ridurre al minimo il numero delle classi che fanno uso di altre per massimizzare l’affidabilità del sistema.Contenimento significa che gli oggetti della classe A contengono oggetti della classe B; è un caso particolare di uso. La relazione di ereditarietà denota specializzazione, nei linguaggi che supportano gli oggetti,  l’ elaborazione  di  classi  “personalizzate” è facilitata da un fondamentale principio:   l’ereditarietà.  Le classi possono essere (ed in taluni linguaggi, come Java, lo sono sempre!) costruite su altre classi. Una classe costruita su un’altra estende quest’ultima, nel senso che la nuova classe inizialmente, possiede tutte le proprietà e metodi della classe di cui è “figlia”; il programmatore può scegliere se modificare o semplicemente conservare proprietà e metodi della classe parent e può inoltre fornire nuovi metodi valevoli solo per la classe figlia. Questo principio è denotato ereditarietà. La parola chiave in Java per estendere le classi è  extends, Visual Basic attualmente non prevede l’ereditarietà.

 

 

Queste tre relazioni tra le classi  formano la base della OOP. I diagrammi delle classi mostrano le classi (solitamente indicate da riquadri) e le loro relazioni (indicate da linee con varie decorazioni che si differenziano estremamente da una metodologia all’altra). La figura 1 illustra un esempio che adotta la notazione UML (Universal Modeling Language), all’interno del linguaggio Java. Nell’esempio viene trattato un sistema di elaborazione di ordini commerciale, figurano 4 classi: order (ordini), item (articoli),account (conto), rushorder (ordini urgenti). La classe ordini usa la classe conto in quanto gli oggetti ordini devono accedere agli oggetti conto per controllare lo stato del credito, gli oggetti ordini contengono oggetti articoli, gli oggetti ordiniurgenti sono figli delle classe ordini.

Nella OOP vengono inviati messaggi (con eventuali parametri) agli oggetti, chiedendo loro di eseguire azioni(metodi). E’ importante capire che cosa accade quando una chiamata di metodo è applicata a oggetti di vario tipo in una gerarchia di ereditarietà. Quando viene inviato un messaggio che chiede ad una sottoclasse di applicare un metodo adottando determinati parametri,  avviene quanto segue:

Questa caratteristica del linguaggio è importante, poiché capita spesso che una variabile venga usata come puntatore indifferentemente a oggetti che stanno su livelli diversi della stessa scala gerarchica, infatti se la classe B estende la classe A allora B è compatibile con A, cioè tutte le espressioni valide per A lo sono anche per B, quindi una variabile puntatore di tipo A può puntare anche ad oggetti di tipo B. La capacità di un oggetto di decidere quale metodo applicare a se stesso, in base alla propria posizione nella gerarchia dell’ereditarietà si chiama polimorfismo. L’idea del polimorfismo è che il messaggio può anche essere lo stesso, gli oggetti possono rispondere in modo diverso. Le singole classi della gerarchia, utilizzando il polimorfismo sono responsabili dell’esecuzione dei dettagli, per determinare quali metodi chiamare. 

 

 

 

Un diagramma che adotta la

notazione   UML    (Universal

Modelling Language)

Le classi  sono  solitamente

indicate  da riquadri, le loro

relazioni  da linee  con  vari

attributi.   Nell’esempio:  la

freccia   indica  la  relazione

di ereditarietà,la linea d’uso, 

il rombo di contenimento.

Esistono      strumenti     che

permettono   di   ottenere  la

generazione  di    codice    a

partire dal diagramma UML.

 

     

                                                                                              

                                                                        Fig.  1