SlideShare ist ein Scribd-Unternehmen logo
1 von 31
La programmazione a oggetti
   e le macchine del caffé
         (PARTE 3)


    Prof. Marcello Missiroli
Di cosa parliamo
Finalizzazione
Ereditarietà multipla e Interfacce
Classi astratte
Aggregazione
Limitiamo l'ereditarietà
A volte è utile LIMITARE la possibilità di
  derivare (e quindi modificare) il
  comportamento di certi metodi o classi
Mantenendo il parallelo con la macchina del
  caffè, dobbiamo essere CERTI che tutte
  macchine usino llo stesso formato di
  capsule, per esempio.
Come si fa?
Occorre precedere il nome di ciò che ci
 interessa dalla parola chiave “final”
     •
         Una classe final è una classe che non può
         essere estesa
     •
         Un metodo final è un metodo che non può
         essere sovraccaricato nelle sottoclassi
     •
         Un attributo final è una variabile che può
         essere assegnata una sola volta (simile a una
         costante).
Esempio
public class Capsula {
   public float Dimensioni() {...}
   public final void Peso() {...}
}
public class MicroCapsula extends Capsula
  { … } → ERROR!
Estendiamo l'ereditarietà
• Nulla ci vieta, in teoria, di estendere il
  processo di ereditarietà e fare discendere
  il nostro oggetto da 2,3 o anche più
  oggetti.
• Di fatto, aggiungiamo oggetti e metodi ”di
  base” al nostro oggetto.
Troppo complicato!
Questo sistema è possibile in certi linguaggi
  (es. il C++), anche se intruduce una serie
  di problemi
Java usa un meccanismo leggermente
  diverso, chiamato Interfaccia
Torniamo alla nostra macchina
Supponiamo ora di occuparci dell'alimentazione
 della nostra macchina del caffè.
     •
         Una possibile soluzione consiste
         nell'agganciaci alla normale rete di
         alimentazione
     •
         Una seconda soluzione consiste nel mettere
         delle batterie
     •
         Una terza possibile soluzione consiste
         nell'usare accumulatori
In ogni caso..
Il sistema deve fornire le stesse funzionalità
   base:
Un pulsante di accensione/spegnimento
Corrente continua a 12V.
Aggiungiamo
L'interfaccia
public interface ElectricalAdapter {
    static final int OUTPUT = 12.0f;
    String PlugType();
    int InputVoltage(); 

}
Cos'è?
E' una “specie” di classe, ma
* Possiede solo metodi, non attributi (al
  limite costanti statiche)
* Non ha implementazione, per cui non è
  istanziabile.
Cos'è?
E' una sorta di “promessa”. Si garantisce
  che si implementeranno quei metodi, un
  po' come quando si aderisce ad uno
  standard (.iso, .mp3).
Uso delle interfacce
     public class            Dicharazione
  MacchinaCaffeCappBattIta   di uso dell'
implements ElecticalAdapter {interfaccia

String PlugType(){return “Italian”;}
int InputVoltage(){return 220;}; 
    }


          Realizzazione
          (anche gergo UML)
Perché darsi questa pena?
Le implementazioni possono variare anche
  parecchio, ma il funzionamento osservabile è
  identico.
Quindi la macchina funziona e fa il caffé. Può
  essere alimentata a batterie, con la corrente o
  con fluttuazioni nanotropiche del subspazio.
E i dettagli non ci interessano!
Altra implementazione
     public class 
  MacchinaCaffeCappBattUs 
implements ElecticalAdapter {

String PlugType(){return “Usa”;}
int InputVoltage(){return 110;}; 
    }
Altra implementazione
     public class 
  MacchinaCaffeCappBattBattery 
implements ElecticalAdapter {

String PlugType(){return “”;}
int InputVoltage(){return 0;}; 
    }
Anche le interfacce...
Nel loro piccolo, hanno delle gerarchie.
E' possibile estendere una interfaccia per
  compiti più specializzati.
Sistema molto utilizzato (per esempio in
  Swing e nelle Eccezioni)
Classi e metodi astratti
In certi casi si possono definire alcune classi o
  metodi come “astratti” - analogamente alle
  interfacce. Basta precederli con la parola chiave
  'abstract'.
Anche in questo caso le tali classi non possono
  essere istanziati.
Un solo metodo virtuale rende virtuale l'intera
  classe
Classi e metodi astratti (2)
Di solito si preferisce l'uso delle interfacce, che
  offrono più libertà di derivazione
Le classi astratte sono utilizzate spesso nella
  parte iniziale di una progettazione OOD
Binding
In generale, nei linguaggi non OO, la
  decisione su quale funzione viene
  eseguita avviene sempre in fase di
  compilazione.
Nel caso degli oggetti, invece, la decisione
  può essere ritardata alla fase di
  esecuzione (Late binding)
In pratica
Anche se Java è un linguaggio fortemente
   tipizzato, è possibile assegnare ad una
   variabile non solo un oggetto del tipo
   previsto, ma anche uno dei suoi figli
Il messaggio che inviate all'oggetto è lo
   stesso, ma l'effetto può variare.
Esempio
Supponiamo di avere un'applicazione che
 gestisce tre macchine del caffé e può
 controllarle tutte.
Creiamo un'array di macchine di caffé, ma
 una di queste fa anche il cappuccino.
Codice
MacchinaCaffe arr[] = new 
  MacchinaCaffe[3];
arr[0]= new MacchinaCaffe(); Esegue il metodo
arr[1]= new MacchinaCaffe(); della classe
                             MacchinaCaffe
arr[2]= new 
   MacchinaCaffeCappuccio(2,2,2);
arr[0].make_coffee(10);
arr[2].make_coffee(10);


Esegue il metodo della classe MacchinaCaffecappuccio
Ultimi dettagli di OOD
Ereditarietà.....
L'ereditarietà non è l'unico modo per estendere le
  funzionalità del codice mantenendone l'integrità e
  una elevata riusabilità.
Tipicamente, quando si creano sottoclassi si
  estendono le funzionalità esistenti tramite l'override
Si usano classi/metodi astratti quando si vuole una
  certa funzionalità ma non si sa bene come
  implementarla
...o aggregazione?
Un altro modo per creare funzionalità è
  l'aggregazione (o la composizione).
In questo modo, si prendono altre classi e si
  combinano in una nuova classe.
Si fornisce una nuova metodologia per
  renderlo compatibile col codice esistente
Quale scegliere?
In molti casi, la scelta è obbligata e ovvia. In
  altri, sono possibili entrambe le strade e
  c'è un criterio preciso. Ci si basa
  sull'esperienza.
Esempio: Da “punto” a “linea”. Da
  “Macchina da caffe” a “Macchina da caffè
  con batteria”
Riassumendo
Abbiamo così terminato questa breve introduzione
 del mondo della programmazione OOP tramite
 Java.

Spero abbia gettato un po' di luce su questa
 “nuova” modalità di programmazione. (Per la
 verità se ne parla dal 1960, e si usa
 concretmente dagli anni novanta!)
Licenza
Questo documento è soggetto alla licenza
 Creative Common BY-SA (Attribution –
 Share Alike)

Weitere ähnliche Inhalte

Andere mochten auch

Andere mochten auch (14)

Insegnare Agile
Insegnare AgileInsegnare Agile
Insegnare Agile
 
Dhcp
DhcpDhcp
Dhcp
 
Corso Moodle: perché?
Corso Moodle: perché?Corso Moodle: perché?
Corso Moodle: perché?
 
Corso Moodle: presentazione
Corso Moodle: presentazioneCorso Moodle: presentazione
Corso Moodle: presentazione
 
Ruby in 25 minuti
Ruby in 25 minutiRuby in 25 minuti
Ruby in 25 minuti
 
Uefi: l'eterna lotta tra il bene e il male
Uefi: l'eterna lotta tra il bene e il maleUefi: l'eterna lotta tra il bene e il male
Uefi: l'eterna lotta tra il bene e il male
 
Eccezioni in java
Eccezioni in javaEccezioni in java
Eccezioni in java
 
Investire nelle user story
Investire nelle user storyInvestire nelle user story
Investire nelle user story
 
Moodle: i compiti (homework)
Moodle: i compiti (homework)Moodle: i compiti (homework)
Moodle: i compiti (homework)
 
Routing dinamico
Routing dinamicoRouting dinamico
Routing dinamico
 
Espressioni regolari
Espressioni regolariEspressioni regolari
Espressioni regolari
 
The Sequel to sql
The Sequel to sqlThe Sequel to sql
The Sequel to sql
 
Introduzione al dns
Introduzione al dnsIntroduzione al dns
Introduzione al dns
 
Il sistema binario
Il sistema binarioIl sistema binario
Il sistema binario
 

Ähnlich wie Programmazione a oggetti tramite la macchina del caffé (pt. 3)

Progetto SOD Davide Sito
Progetto SOD Davide SitoProgetto SOD Davide Sito
Progetto SOD Davide Sito
Davide Sito
 
Design pattern template method
Design pattern template methodDesign pattern template method
Design pattern template method
Nelson Firmani
 
Configurazione automatica di ambienti di testing per reti di calcolatori - te...
Configurazione automatica di ambienti di testing per reti di calcolatori - te...Configurazione automatica di ambienti di testing per reti di calcolatori - te...
Configurazione automatica di ambienti di testing per reti di calcolatori - te...
Bruno Interlandi
 

Ähnlich wie Programmazione a oggetti tramite la macchina del caffé (pt. 3) (20)

Programmazione a oggetti tramite la macchina del caffé (pt. 2)
Programmazione a oggetti tramite la macchina del caffé (pt. 2)Programmazione a oggetti tramite la macchina del caffé (pt. 2)
Programmazione a oggetti tramite la macchina del caffé (pt. 2)
 
Corso Object Oriented Analysis and Design
Corso Object Oriented Analysis and DesignCorso Object Oriented Analysis and Design
Corso Object Oriented Analysis and Design
 
Corso Java
Corso JavaCorso Java
Corso Java
 
Java codestyle & tipstricks
Java codestyle & tipstricksJava codestyle & tipstricks
Java codestyle & tipstricks
 
PowerMock TDD User Group Milano
PowerMock TDD User Group MilanoPowerMock TDD User Group Milano
PowerMock TDD User Group Milano
 
Programmazione funzionale e Stream in Java
Programmazione funzionale e Stream in JavaProgrammazione funzionale e Stream in Java
Programmazione funzionale e Stream in Java
 
Dal C a Java (1/3)
Dal C a Java (1/3)Dal C a Java (1/3)
Dal C a Java (1/3)
 
Mini Corso Java - Parte 3
Mini Corso Java - Parte 3Mini Corso Java - Parte 3
Mini Corso Java - Parte 3
 
Corso Programmazione Java Base
Corso Programmazione Java BaseCorso Programmazione Java Base
Corso Programmazione Java Base
 
Introduzione a scala prima parte
Introduzione a scala   prima parteIntroduzione a scala   prima parte
Introduzione a scala prima parte
 
Progetto SOD Davide Sito
Progetto SOD Davide SitoProgetto SOD Davide Sito
Progetto SOD Davide Sito
 
TDD in WordPress
TDD in WordPressTDD in WordPress
TDD in WordPress
 
Design pattern template method
Design pattern template methodDesign pattern template method
Design pattern template method
 
Javaday 2006: Java 5
Javaday 2006: Java 5Javaday 2006: Java 5
Javaday 2006: Java 5
 
Potenza e controllo con le Parallel Libraries (Raffaele Rialdi)
Potenza e controllo con le Parallel Libraries (Raffaele Rialdi)Potenza e controllo con le Parallel Libraries (Raffaele Rialdi)
Potenza e controllo con le Parallel Libraries (Raffaele Rialdi)
 
Unit testing 101
Unit testing 101Unit testing 101
Unit testing 101
 
Java introduzione
Java introduzioneJava introduzione
Java introduzione
 
Configurazione automatica di ambienti di testing per reti di calcolatori - te...
Configurazione automatica di ambienti di testing per reti di calcolatori - te...Configurazione automatica di ambienti di testing per reti di calcolatori - te...
Configurazione automatica di ambienti di testing per reti di calcolatori - te...
 
Java OCA teoria 1
Java OCA teoria 1Java OCA teoria 1
Java OCA teoria 1
 
Terracotta JUG Milano
Terracotta JUG MilanoTerracotta JUG Milano
Terracotta JUG Milano
 

Mehr von Marcello Missiroli

Mehr von Marcello Missiroli (11)

Algorithmist guide II
Algorithmist guide IIAlgorithmist guide II
Algorithmist guide II
 
Guida del perfetto Algoritmista I
Guida del perfetto Algoritmista IGuida del perfetto Algoritmista I
Guida del perfetto Algoritmista I
 
Workshop: Introduzione ad TDD
Workshop: Introduzione ad TDDWorkshop: Introduzione ad TDD
Workshop: Introduzione ad TDD
 
Dal c a Java (3/3)
Dal c a Java (3/3)Dal c a Java (3/3)
Dal c a Java (3/3)
 
Dal C a Java (2/3)
Dal C a Java (2/3)Dal C a Java (2/3)
Dal C a Java (2/3)
 
Variabili
VariabiliVariabili
Variabili
 
Sviluppo degli algoritmi
Sviluppo degli algoritmiSviluppo degli algoritmi
Sviluppo degli algoritmi
 
5 stadi dello sviluppo di un gruppo
5 stadi dello sviluppo di un gruppo5 stadi dello sviluppo di un gruppo
5 stadi dello sviluppo di un gruppo
 
Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!
 
Big O Notation
Big O NotationBig O Notation
Big O Notation
 
Introduzione a java doc
Introduzione a java docIntroduzione a java doc
Introduzione a java doc
 

Programmazione a oggetti tramite la macchina del caffé (pt. 3)

  • 1. La programmazione a oggetti e le macchine del caffé (PARTE 3) Prof. Marcello Missiroli
  • 2. Di cosa parliamo Finalizzazione Ereditarietà multipla e Interfacce Classi astratte Aggregazione
  • 3. Limitiamo l'ereditarietà A volte è utile LIMITARE la possibilità di derivare (e quindi modificare) il comportamento di certi metodi o classi Mantenendo il parallelo con la macchina del caffè, dobbiamo essere CERTI che tutte macchine usino llo stesso formato di capsule, per esempio.
  • 4. Come si fa? Occorre precedere il nome di ciò che ci interessa dalla parola chiave “final” • Una classe final è una classe che non può essere estesa • Un metodo final è un metodo che non può essere sovraccaricato nelle sottoclassi • Un attributo final è una variabile che può essere assegnata una sola volta (simile a una costante).
  • 5. Esempio public class Capsula { public float Dimensioni() {...} public final void Peso() {...} } public class MicroCapsula extends Capsula { … } → ERROR!
  • 6. Estendiamo l'ereditarietà • Nulla ci vieta, in teoria, di estendere il processo di ereditarietà e fare discendere il nostro oggetto da 2,3 o anche più oggetti. • Di fatto, aggiungiamo oggetti e metodi ”di base” al nostro oggetto.
  • 7. Troppo complicato! Questo sistema è possibile in certi linguaggi (es. il C++), anche se intruduce una serie di problemi Java usa un meccanismo leggermente diverso, chiamato Interfaccia
  • 8. Torniamo alla nostra macchina Supponiamo ora di occuparci dell'alimentazione della nostra macchina del caffè. • Una possibile soluzione consiste nell'agganciaci alla normale rete di alimentazione • Una seconda soluzione consiste nel mettere delle batterie • Una terza possibile soluzione consiste nell'usare accumulatori
  • 9. In ogni caso.. Il sistema deve fornire le stesse funzionalità base: Un pulsante di accensione/spegnimento Corrente continua a 12V.
  • 12. Cos'è? E' una “specie” di classe, ma * Possiede solo metodi, non attributi (al limite costanti statiche) * Non ha implementazione, per cui non è istanziabile.
  • 13. Cos'è? E' una sorta di “promessa”. Si garantisce che si implementeranno quei metodi, un po' come quando si aderisce ad uno standard (.iso, .mp3).
  • 14. Uso delle interfacce      public class  Dicharazione MacchinaCaffeCappBattIta  di uso dell' implements ElecticalAdapter {interfaccia String PlugType(){return “Italian”;} int InputVoltage(){return 220;};      } Realizzazione (anche gergo UML)
  • 15. Perché darsi questa pena? Le implementazioni possono variare anche parecchio, ma il funzionamento osservabile è identico. Quindi la macchina funziona e fa il caffé. Può essere alimentata a batterie, con la corrente o con fluttuazioni nanotropiche del subspazio. E i dettagli non ci interessano!
  • 16. Altra implementazione      public class  MacchinaCaffeCappBattUs  implements ElecticalAdapter { String PlugType(){return “Usa”;} int InputVoltage(){return 110;};      }
  • 17. Altra implementazione      public class  MacchinaCaffeCappBattBattery  implements ElecticalAdapter { String PlugType(){return “”;} int InputVoltage(){return 0;};      }
  • 18. Anche le interfacce... Nel loro piccolo, hanno delle gerarchie. E' possibile estendere una interfaccia per compiti più specializzati. Sistema molto utilizzato (per esempio in Swing e nelle Eccezioni)
  • 19. Classi e metodi astratti In certi casi si possono definire alcune classi o metodi come “astratti” - analogamente alle interfacce. Basta precederli con la parola chiave 'abstract'. Anche in questo caso le tali classi non possono essere istanziati. Un solo metodo virtuale rende virtuale l'intera classe
  • 20. Classi e metodi astratti (2) Di solito si preferisce l'uso delle interfacce, che offrono più libertà di derivazione Le classi astratte sono utilizzate spesso nella parte iniziale di una progettazione OOD
  • 21. Binding In generale, nei linguaggi non OO, la decisione su quale funzione viene eseguita avviene sempre in fase di compilazione. Nel caso degli oggetti, invece, la decisione può essere ritardata alla fase di esecuzione (Late binding)
  • 22. In pratica Anche se Java è un linguaggio fortemente tipizzato, è possibile assegnare ad una variabile non solo un oggetto del tipo previsto, ma anche uno dei suoi figli Il messaggio che inviate all'oggetto è lo stesso, ma l'effetto può variare.
  • 23. Esempio Supponiamo di avere un'applicazione che gestisce tre macchine del caffé e può controllarle tutte. Creiamo un'array di macchine di caffé, ma una di queste fa anche il cappuccino.
  • 24. Codice MacchinaCaffe arr[] = new  MacchinaCaffe[3]; arr[0]= new MacchinaCaffe(); Esegue il metodo arr[1]= new MacchinaCaffe(); della classe MacchinaCaffe arr[2]= new  MacchinaCaffeCappuccio(2,2,2); arr[0].make_coffee(10); arr[2].make_coffee(10); Esegue il metodo della classe MacchinaCaffecappuccio
  • 26. Ereditarietà..... L'ereditarietà non è l'unico modo per estendere le funzionalità del codice mantenendone l'integrità e una elevata riusabilità. Tipicamente, quando si creano sottoclassi si estendono le funzionalità esistenti tramite l'override Si usano classi/metodi astratti quando si vuole una certa funzionalità ma non si sa bene come implementarla
  • 27. ...o aggregazione? Un altro modo per creare funzionalità è l'aggregazione (o la composizione). In questo modo, si prendono altre classi e si combinano in una nuova classe. Si fornisce una nuova metodologia per renderlo compatibile col codice esistente
  • 28. Quale scegliere? In molti casi, la scelta è obbligata e ovvia. In altri, sono possibili entrambe le strade e c'è un criterio preciso. Ci si basa sull'esperienza. Esempio: Da “punto” a “linea”. Da “Macchina da caffe” a “Macchina da caffè con batteria”
  • 29. Riassumendo Abbiamo così terminato questa breve introduzione del mondo della programmazione OOP tramite Java. Spero abbia gettato un po' di luce su questa “nuova” modalità di programmazione. (Per la verità se ne parla dal 1960, e si usa concretmente dagli anni novanta!)
  • 30.
  • 31. Licenza Questo documento è soggetto alla licenza Creative Common BY-SA (Attribution – Share Alike)