Metodi Per Riutilizzare Programmi Oo

898 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
898
On SlideShare
0
From Embeds
0
Number of Embeds
57
Actions
Shares
0
Downloads
38
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Metodi Per Riutilizzare Programmi Oo

  1. 1. I concetti della programmazione OO per riutilizzare il codice Lezione del 27 ottobre 2008 per il modulo “ Programmazione ad Oggetti 3° parte
  2. 2. La riutilizzazione del codice <ul><li>La programmazione strutturata consente di riutilizzare i programmi esistenti. </li></ul><ul><ul><li>Si può scrivere una procedura, una funzione, una subroutine, e poi usarla tante volte quante si vuole </li></ul></ul><ul><li>Tuttavia nella progettazione Orientata agli Oggetti si fa molto di più. </li></ul><ul><li>La programmazione OO permette di definire relazioni tra le classi degli oggetti che facilitano: </li></ul><ul><ul><li>non solo il riutilizzo del codice, </li></ul></ul><ul><ul><li>ma anche la progettazione del medesimo con una visione globale della sua architettura </li></ul></ul>
  3. 3. Metodi per riutilizzare del codice nella programmazione Orientata agli Oggetti <ul><li>Nella programmazione OO ci sono fondamentalmente due modi distinti per riutilizzare il codice esistente </li></ul><ul><li>La “ Ereditarietà ” che permette ad una classe di ereditare gli attributi ed i metodi di un’altra classe. </li></ul><ul><li>La “ Composizione ” che fornisce un meccanismo per costruire un oggetto composto di altri oggetti, quindi una nuova classe a partire da altre classi già esistenti </li></ul>
  4. 4. La ereditarietà <ul><li>Qualcuno ha creato con un processo di astrazione una superclasse che ha attributi e metodi comuni ad un certo insieme di classi. </li></ul><ul><li>Ad esempio in una classe Dog ed in un’altra Cat c’è un attributo per il colore degli occhi. </li></ul><ul><ul><li>In un modello procedurale, il codice per Dog, nonché quello per Cat dovrebbero entrambi contenere questo attributo </li></ul></ul><ul><ul><li>Invece in un progetto OO, l’attributo colore occhi è spostato nella superclasse Mammal (mammiferi), insieme con altri attributi comuni e metodi comuni. </li></ul></ul><ul><ul><li>In questo caso sia Dog che Cat ereditano dalla classe Mammal questo attributo eyeColor </li></ul></ul>
  5. 5. Esempio di ereditarietà <ul><li>Ciò significa che questa classe Dog ha i seguenti attributi </li></ul><ul><ul><li>eyeColor // ereditato dalla classe Mammal </li></ul></ul><ul><ul><li>barkFrequency // definito solo per gli oggetti Dogs </li></ul></ul><ul><li>Al medesimo modo, un oggetto Dog ha i seguenti metodi: </li></ul><ul><ul><li>getEyeColor() // ereditato da Mammal </li></ul></ul><ul><ul><li>bark() // definito solo per Dog </li></ul></ul><ul><li>Ciò significa che questa classe Cat ha i seguenti attributi: </li></ul><ul><ul><li>eyeColor // ereditato dalla classe Mammal </li></ul></ul><ul><ul><li>meowFrequency // definito solo per gli oggetti Cats </li></ul></ul><ul><li>Al medesimo modo un oggetto Cat ha i seguenti metodi: </li></ul><ul><ul><li>getEyeColor() // ereditato da Mammal </li></ul></ul><ul><ul><li>meow() // definito solo per Cat </li></ul></ul>Le classi Dog e Cat ereditano entrambe dalla superclasse Mammal. <ul><li>Quando un oggetto Dog o Cat viene instanziato, esso contiene ogni cosa definita nella sua classe così come ogni cosa definita nella classe genitore. </li></ul><ul><li>Pertanto essi hanno le proprietà delle loro definizione di classe e quelle ereditate dalla classe Mammal. </li></ul>
  6. 6. Superclasse e sottoclasse <ul><li>La superclasse, o classe genitore, contiene tutti gli attributi ed i comportamenti che sono comuni alle classi che li ereditano. </li></ul><ul><li>Ad esempio, nel caso della classe Mammal, tutti i mammiferi hanno attributi simili quali colore degli occhi, colore dei capelli, così come comportamenti comuni quali generaCaloreInterno() cresceCapelli(). </li></ul><ul><li>Tutti i mammiferi hanno questi attributi e comportamenti, </li></ul><ul><ul><li>pertanto non è necessario duplicarli lungo la gerarchia della ereditarietà in ciascun tipo di mammifero. </li></ul></ul><ul><li>La duplicazione, oltre ad essere faticosa, introduce errori ed inconsistenze </li></ul><ul><li>Le classi Dog e Cat ereditano tutti questi attributi e comportamenti comuni dalla classe Mammal. </li></ul><ul><li>La classe Mammal è la superclasse, Dog e Cat sono le sottoclassi o classi figlie. </li></ul>
  7. 7. Programmare per differenze (generalizzazione) (specializzazione) <ul><li>Poiché la classe Dog e Cat ereditano gli attributi e i comportamenti della superclasse Mammal, queste classi specializzate devono solo implementare quegli attributi e quei comportamenti per i quali sono diverse dai mammiferi in generali . </li></ul><ul><li>Queste sottoclassi devono aggiungere i loro dettagli, specifici del loro essere Dog e Cat . </li></ul><ul><li>Per questo motivo si dice anche che le superclassi sono classi generali , mentre le sottoclassi si dicono specializzate . </li></ul><ul><li>Inoltre il processo di creazione della superclasse si chiama per il medesimo motivo “generalizzazione ”, mentro il processo di programmazione per differenza delle sottoclassi si chiama “ specializzazione” </li></ul>
  8. 8. Astrazione per ereditarietà <ul><li>Un albero di ereditarietà può diventare molto grande. </li></ul><ul><li>Dopo che le classi Mammal, Cat e Dog sono state completate, altre classi si possono aggiungere alla gerarchia quali Lions, Tigers. Ognuna di queste può, a sua volta essere la superclasse di altre classi. </li></ul><ul><li>Cat può essere superclasse di GattoPersiano, GattoSiamese. </li></ul><ul><li>Dog può essere superclasse di GermanShepherd, di Poodle </li></ul><ul><li>La potenza della ereditarietà sta in quella della astrazione e della organizzazione </li></ul>
  9. 9. Esempio di albero di ereditarietà <ul><li>Quali sono i metodi di GermanShepherd ? </li></ul><ul><ul><li>I suoi  isGerman() </li></ul></ul><ul><ul><li>di Dog  bark() </li></ul></ul><ul><ul><li>di Mammal  getEyeColor </li></ul></ul><ul><li>Quali sono i metodi di Poodle ? </li></ul>
  10. 10. Relazione “is-a” <ul><li>Il Cerchio, il Quadrato, la Stella ereditano direttamente da Shape </li></ul><ul><li>A questa relazione ci si riferisce spesso come ad una “relazione is-a” </li></ul><ul><li>Un cerchio “is a” shape </li></ul><ul><li>Un quadrato è una forma </li></ul><ul><li>Una stella è una forma </li></ul>
  11. 11. Introduzione al polimorfismo <ul><li>Nelle figura shape, il nome su ciascuno degli oggetti rappresenta il metodo “draw” (disegna) rispettivamente di Cerchio, Quadrato, Stella </li></ul><ul><li>Quando disegniamo una forma, indipendentemente da quale essa sia, invochiamo un metodo chiamato draw() </li></ul><ul><li>È responsabilità individuale dell’oggetto, che esso sia un cerchio, un quadrato oppure una stella, disegnare sé stesso </li></ul><ul><li>Qui sta un nuovo concetto della programmazione OO </li></ul><ul><li>Il polimorfismo </li></ul>
  12. 12. Il polimorfismo <ul><li>Polimorfismo è un termine greco che significa “molte forme” </li></ul><ul><li>Il polimorfismo è strettamente correlato al concetto di ereditarietà </li></ul><ul><li>Quando un messaggio è inviato ad un oggetto, quell’oggetto deve avere un metodo (un’interfaccia) per rispondere a quel messaggio </li></ul><ul><li>In una gerarchia ereditaria, tutte le sottoclassi ereditano le interfacce delle loro superclassi </li></ul><ul><li>Poiché ogni sottoclasse è un’entità separata, ciascuna di esse può richiedere una distinta e diversa risposta al medesimo messaggio. </li></ul>
  13. 13. Esempio per comprendere il polimorfismo <ul><li>Consideriamo la classe Shape ed un suo comportamento draw() </li></ul><ul><li>Quando chiedete di disegnare una forma </li></ul><ul><ul><li>dovete specificare quale forma. </li></ul></ul><ul><ul><li>nessuno può disegnare una forma ( Shape ) perché Shape è un concetto astratto </li></ul></ul><ul><ul><li>In effetti il metodo draw() di Shape non ha neanche un’implementazione </li></ul></ul><ul><li>Per disegnare una forma occorre specificare una forma concreta (cerchio, quadrato, stella) </li></ul><ul><ul><li>Per fare questo dovete fornire l’effettiva implementazione del metodo draw() in Cerchio, Quadrato, Stella. </li></ul></ul>
  14. 14. Sovrascrittura (overriding) di un metodo <ul><li>Anche se la classe Shape ha un metodo draw() , nelle classi Cerchio, Quadrato, Stella scriviamo il metodo draw() sovrascrivendo il metodo draw() ereditato da Shape . </li></ul><ul><li>Sovrascrivere significa riscrivere e rimpiazzare in una sottoclasse l’implementazione di un metodo ereditata dalla superclasse </li></ul>
  15. 15. Esempio di sovrascrittura di un metodo <ul><li>Ad esempio supponiamo di avere una collezione di tre forme geometriche: cerchio, quadrato, stella </li></ul><ul><li>Anche se le trattiamo tutte come forme geometriche e gli inviamo il medesimo messaggio draw() </li></ul><ul><ul><li>Il risultato finale di ciascun disegno è diverso perché in ciascuna delle classi di questi oggetti abbiamo fornito una concreta implementazione di questo metodo draw() riscrivendolo </li></ul></ul><ul><li>Pertanto ciascuna classe pur sollecitata dal medesimo messaggio è in grado di rispondere differentemente </li></ul><ul><li>Questo è il polimorfismo !!!! </li></ul>
  16. 16. Un po’ di codice per esempio <ul><li>public abstract class Shape{ </li></ul><ul><ul><li>public abstract void draw(); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>public class Cerchio{ </li></ul><ul><ul><li>public void draw(){ </li></ul></ul><ul><ul><li> System.out.println(“Cerchio!!”); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>public class Quadrato{ </li></ul><ul><ul><li>public void draw(){ </li></ul></ul><ul><ul><li> System.out.println(“Quadrato!!”); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>public class Stella{ </li></ul><ul><ul><li>public void draw(){ </li></ul></ul><ul><ul><li> System.out.println(“Stella!!”); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>Instanziamo qualche oggetto </li></ul><ul><ul><li>c1=new Cerchio(); </li></ul></ul><ul><ul><li>q1=new Quadrato(); </li></ul></ul><ul><ul><li>s1=new Stella(); </li></ul></ul><ul><li>Inviamo il medesimo messaggio a tutti questi oggetti </li></ul><ul><ul><li>c1.draw(); </li></ul></ul><ul><ul><li>q1.draw(); </li></ul></ul><ul><ul><li>s1.draw(); </li></ul></ul><ul><li>L’effettiva risposta dipende dal tipo di oggetto </li></ul><ul><li>Ma abbiamo inviato a tutti il medesimo messaggio !! </li></ul><ul><li>Il concetto chiave è che stiamo inviando il medesimo messaggio alle classi Shape e sperimentiamo diverse risposte a seconda di quale sottoclasse di Shape è utilizzata ! </li></ul><ul><li>Questo è il polimorfismo ! </li></ul>
  17. 17. La composizione <ul><li>È naturale pensare agli oggetti come aggregati di altri oggetti </li></ul><ul><li>Un computer contiene una scheda madre, una scheda video, una tastiera, un disco rigido. </li></ul><ul><li>Anche se il computer è considerato come un oggetto unico, anche l’unità disco è un oggetto valido </li></ul><ul><li>Infatti potreste aprire il computer e rimuovere il disco rigido e prenderlo in mano </li></ul><ul><li>Gli oggetti quindi sono spesso costruiti o composti da altri oggetti </li></ul><ul><li>Questa è la composizione </li></ul>
  18. 18. L’astrazione della composizione <ul><li>Anche la composizione fornisce un meccanismo per costruire gli oggetti, includendo delle classi all’interno di altre classi </li></ul><ul><li>Come si fa ? </li></ul><ul><li>Consideriamo la relazione tra un automobile e il suo motore </li></ul><ul><li>Possiamo dire che l’auto contiene il motore </li></ul><ul><li>Ma non possiamo dire che un’auto è un motore ! </li></ul><ul><li>Piuttosto usiamo il termine l’auto “has a” ha un motore </li></ul><ul><li>public class Motore { } </li></ul><ul><li>public class Auto { </li></ul><ul><ul><li>private Motore m; </li></ul></ul><ul><ul><li>… </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>In questo modo siamo in grado di includere un oggetto all’interno di un altro oggetto che lo contiene </li></ul></ul><ul><ul><li>In pratica definiamo un nuovo tipo di variabile che rappresenta l’oggetto che vogliamo includere </li></ul></ul>
  19. 19. La relazione “has a” <ul><li>La relazione di ereditarietà è considerata una relazione del tipo “è un” ( is-a ) </li></ul><ul><li>Invece la relazione di composizione è considerata del tipo ha un ( has-a ) </li></ul><ul><li>Quindi il computer ha un disco rigido </li></ul><ul><li>Un computer non è un disco rigido quindi tra computer e disco rigido non c’è una relazione di ereditarietà, ma invece c’è una relazione di composizione </li></ul>

×