29 febbraio 2008 Progettare tipi di dato astratti.

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

© 2007 SEI-Società Editrice Internazionale, Apogeo Unità B1 Le basi della programmazione a oggetti.
Recupero debito quarto anno Primo incontro
Informatica Recupero debito quarto anno Terzo incontro.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
1 Semantica Operazionale di un frammento di Java: lo stato.
Classi ed Oggetti in Java (Cenni). Richiami Ruolo delle Classi in Java Oggetti.
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
MultiSet, Liste Ordinate
Le gerarchie di tipi.
Esercitazione Frame. Argomento Realizzazione di un tipo di dato astratto Usare le eccezioni per segnalare situazioni particolari Invariante e funzione.
LIP: 19 Aprile Contenuto Soluzione Compitino Tipo di dato MultiSet, estensione con sottoclasse.
Metodologie di Programmazione = decomposizione basata su astrazioni
1 Le gerarchie di tipi: implementazioni multiple e principio di sostituzione.
PolyFun. Dare implementazione,funzione di astrazione, invarianti della rappresentazione. Provare che i metodi apply e bind preservano gli invarianti.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
Liste Ordinate 3 Maggio Ultima Lezione Abbiamo visto i tipi di dato astratti IntList e StringList Realizzano liste di interi e di stringhe Realizzati.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Overriding.
1 Le gerarchie di tipi. 2 Supertipi e sottotipi 4 un supertipo –class –interface 4 può avere più sottotipi –un sottotipo extends il supertipo ( class.
Type int_stack = struct { int top; int P[100]; } int_stack creapila() { int_stack s = new int_stack; s.top = 0; return s; } int_stack push(int_stack s,
Type int_stack = struct { int top; int P[100]; } int_stack creapila() { int_stack s = new int_stack; s.top = 0; return s; } int_stack push(int_stack s,
Java base IV: Java e la programmazione O.O.
1 Programmazione = decomposizione basata su astrazioni (con riferimento a Java)
LE TECNICHE CHE VEDREMO OGGI Pi
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti dispense prof. G. Levi.
Enumerazioni e Classi 1. Enumerazioni Permettono di definire nuovi tipi che consistono in un insieme di valori costanti (ognuno con un nome) – Migliorano.
I metodi F. Bombi Campi e metodi Abbiamo visto che una classe può contenere – Campi – Metodi stato I campi sono utilizzati per memorizzare.
Astrazione procedurale ed eccezioni
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterarare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
Liste di Interi Esercitazione. Una variante Liste concatenate di Integers Non modificabile Costruttori per creare la lista vuota o un nodo Metodi d’istanza.
1 Progettazione dettagliata di un Tipo di Dato Astratto: l’ambiente di metodi.
Ripasso su Java. Introduzione Per risolvere problemi complessi, i linguaggi di programmazione forniscono costrutti per realizzare nuove funzioni che trasformino.
Compitino del 2004 Alberi Generici. Idea Si vuole un tipo di dato astratto che definisca una struttura ad albero in cui nodi e foglie hanno associato.
Liste Concatenate 11 Aprile E’ una delle strutture dati fondamentali in tutti i linguaggi di programmazione di alto livello Una Lista Concatenata.
Liste di Interi Esercitazione. IntList Lista di interi Una lista è una disposizione ordinata di elementi ( non in modo crescente-descrescente, ma per.
1 Laboratorio di Introduzione alla Programmazione §II MODULO §3 crediti §Esame e voto unico (su 6 crediti totali)
LIP: 9 Maggio Esercizi Riprendiamo un esercizio proposto Definire un tipo di dato Persona che definisce oggetti che rappresentano le informazioni.
1 Progettare un Tipo di Dato Astratto. 2 Scelte di Progetto (astrazione) 4 Caratteristiche degli oggetti –Modificabilità 4 Scelta delle operazioni –Realizzare.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
Programmazione in Java. Classi I programmi in Java consistono di classi. Le classi consentono di definire: collezioni di procedure (metodi statici) tipi.
LIP: 8 Marzo 2005 Vettori. Abbiamo visto L’uso di Vector come alternativa all’uso di arrays Rivediamo l’esercizio dell’altra volta.
Esercitazione del 7 marzo 2008 Ereditarieta’. Esercizio: soluzione Implementare la seguente specifica che definisce un tipo di dato Libro.
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
1 Laboratorio di Introduzione alla Programmazione §II MODULO §3 crediti §Esame e voto unico (su 6 crediti totali)
Progettare una classe 21 Febbraio La classe BankAccount Vogliamo realizzare una classe i cui oggetti sono dei semplici conti bancari. * Identifichiamo.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
1 Metodologie di Programmazione = decomposizione basata su astrazioni.
Classi ed Oggetti in Java (Cenni). Richiami Cenni sull’ Implementazione, Macchine Astratte, Compilatore, Interprete Ruolo delle Classi in Java Oggetti.
Ese 1 e 3 (del 6 Aprile 2005). Primo Ese Si identifichino gli errori che il compilatore segnalerebbe per il seguente programma Tipi Legami tra dichiarazioni.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
LIP: 11 Maggio 2007 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Esercitazione 14 Marzo Esercizio dell’altra volta Definire un tipo di dato Abbonato i cui oggetti descrivono le informazioni relative ad un abbonato.
Esercitazione del 9 marzo 2007 Ereditarieta’. Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio.
Introduzione a Java. Java Linguaggio Object-Oriented La maggior parte dei dati manipolati dai programmi e’ contenuta in oggetti La principale forma di.
1 Metodologie di Programmazione §tecniche per la programmazione orientata ad oggetti §esemplificate utilizzando il linguaggio Java §testo di riferimento.
1 Un esempio con iteratore: le liste ordinate di interi.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
LIP: 15 Marzo 2005 Vettori di interi. Esercizio proposto Definire una classe VectorInt i cui oggetti sono vettori omogenei di interi ordinati in modo.
LIP: 18 Aprile 2008 Interfacce. Rappresentazione Lista val next vuota Lista vuota: any true Lista non vuota: any true 154 false 24 false.
Ex.1 - Astrazioni su Dati Si abbia il tipo di dato stack di interi, IntStack, specificato sotto: public class IntStack { \\ OVERVIEW: uno Stack è una collezione.
Introduzione all’Ereditarietà Pietro Palladino. Richiami UML Classe: descrizione di un insieme di oggetti software con caratteristiche simili Definisce.
Introduzione alle Classi e agli Oggetti in Java 1.
Sommario cos’è un tipo di dato astratto astrazione tramite specifica:
Transcript della presentazione:

29 febbraio 2008 Progettare tipi di dato astratti

Oggetti Servono per definire nuovi tipi di dato collezioni di dati + relative operazioni Vedremo cosa vuol dire dare la specifica e limplementazione di un tipo di dato Vedremo cosa vuol dire astrarre dalla implementazione tramite la specifica

Cosa sta nella specifica? 1) La descrizione astratta dei dati 2) La descrizione delle relative operazioni

La specifica Java (parte sintattica della specifica) –classe o interfaccia per ora solo classi –nome per il tipo nome della classe –operazioni metodi di istanza incluso il(i) costruttore(i) la specifica del tipo descrive proprietà generali degli oggetti –per esempio la modificabilità per il resto la specifica è essenzialmente una specifica dei metodi –strutturata come già abbiamo visto per le astrazioni procedurali –loggetto su cui i metodi operano è indicato nella specifica da this

Formato della specifica public class NuovoTipo { // OVERVIEW: Gli oggetti di tipo NuovoTipo // sono collezioni modificabili di.. // costruttori public NuovoTipo () // EFFECTS:... // metodi // specifiche degli altri metodi }

Esempio Vogliamo realizzare una classe Data i cui oggetti memorizzano giorno, mese, anno(int). Vogliamo che 1<=giorno<=30 1<=mese<= <=anno Vogliamo le seguenti operazioni leggere\modificare giorno, mese, anno

Una possibile specifica public class Data{ //OVERVIEW: una Data memorizza giorno, mese, anno // costruttore public Data(int g, int m,int a){ //REQUIRES: 1 = 2008 //EFFECTS: crea una nuova Data con giorno g, mese //m ed anno a}

Una possibile specifica // metodi public void modifica(int g, int m,int a) { //REQUIRES: 1 = 2008 //MODIFIES:this //EFFECTS: aggiorna il giorno, mese ed anno di //this con g,m ed a rispettivamente } public int getGiorno() { //EFFECTS: restituisce il giorno di this} public int getMese() { //EFFECTS: restituisce il mese di this} public int getAnno() { //EFFECTS: restituisce lanno di this} }

Implementazione scelta fondamentale è quella della rappresentazione variabili distanza che rappresentano lo stato degli oggetti usando tipi primitivi o già implementati nuovi tipi astratti che facilitano limplementazione del nostro segue limplementazione dei costruttori e dei metodi

Una possibile implementazione public class Data{ //OVERVIEW: una Data memorizza giorno, mese, anno public int giorno; public int mese; public int anno; public Data(int g, int m,int a){ //REQUIRES: 1 = 2008 //EFFECTS: crea una nuova Data con giorno g, mese //m ed anno a giorno=g; mese=m; anno=a; }

Una possibile implementazione public void modifica(int g, int m,int a) { //REQUIRES: 1 = 2008 //MODIFIES:this //EFFECTS: aggiorna il giorno, mese ed anno di //this con g,m ed a rispettivamente giorno=g; mese=m; anno=a;} public int getGiorno() { //EFFECTS: restituisce il giorno di this return giorno;} public int getMese() { //EFFECTS: restituisce il mese di this return mese;} public int getAnno() { //EFFECTS: restituisce lanno di this return anno;} }

Ovviamente Limplementazione deve soddisfare la specifica Diverse implementazioni per la stessa specifica

Una implementazione alternativa public class Data{ //OVERVIEW: una Data memorizza giorno, mese, anno public int[] valori; public Data(int g, int m,int a){ //REQUIRES: 1 = 2008 //EFFECTS: crea una nuova Data con giorno g, mese //m ed anno a valori=new int[3]; valori[0]=g; valori[1]=m; valori[2]=a;}

Una implementazione alternativa public void modifica(int g, int m,int a) { //REQUIRES: 1 = 2008 //MODIFIES:this //EFFECTS: aggiorna il giorno, mese ed anno di //this con g,m ed a rispettivamente valori[0]=g; valori[1]=m; valori[2]=a;}} public int getGiorno() { //EFFECTS: restituisce il giorno di this return valori[0];} public int getMese() { //EFFECTS: restituisce il mese di this return valori[1];} public int getAnno() { //EFFECTS: restituisce lanno di this return valori[2];} }

Astrazione tramite specifica I moduli che usano il tipo di dato vedono solo la specifica (interfaccia pubblica) I moduli sono quindi indipendenti dallimplementazione del tipo di dato Necessario per avere moduli indipendenti in cui le modifiche del codice siano il piu possibile locali

Esempio Consideriamo di dovere sviluppare una applicazione in cui dobbiamo confrontare due date public static boolean minore(Data x, Data y) { //EFFECTS: restituisce true se x <=y, false //altrimenti } Minore o uguale in senso ovvio, temporale

Soluzione corretta public static boolean minore(Data x, Data y) { //EFFECTS: restituisce true se x <=y, false //altrimenti if (x.getAnno() < y.getAnno()) {return true;} if (x.getAnno() > y.getAnno()) {return false;} if (x.getMese() < y.getMese()) {return true;} if (x.getMese() > y.getMese()) {return false;} if (x.getGiorno() <= y.getGiorno()) {return true;} else {return false;} } Programmato guardando solo la specifica di Data Non accede alla rappresentazione ===> funziona per tutte le implementazioni

Soluzione sbagliata public static boolean minore(Data x, Data y) { //EFFECTS: restituisce true se x <=y, false //altrimenti if (x.anno < y.anno()) {return true;} if (x.anno > y.anno()) {return false;} if (x.mese < y.mese) {return true;} if (x.mese > y.mese) {return false;} if (x.giorno <= y.giorno) {return true;} else {return false;} } Accede alla rappresentazione ===> funziona solo per una implementazione } Programmato guardando solo la specifica di Data

Rappresentazione Privata Si deve forzare questo stile di programmazione dichiarando sempre le variabili distanza private in questo modo i moduli che utilizzano il tipo di dato sono costretti a programmare astraendo dalla specifica La rappresentazione privata e fondamentale anche per garantire la corretta dellimplementazione

Esempio Vogliamo che tutti gli oggetti di tipo Data memorizzino giorno, mese, anno tali che 1<=giorno<=30 1<=mese<= <=anno Nella progettazione della classe abbiamo garantito tramite pre- condizioni che tutti gli oggetti lo soddisfino Se la rappresentazione fosse pubblica qualsiasi altro modulo del programma potrebbe assegnare valori arbitari a giorno, mese, anno

Esercizio: Part I Implementare la seguente specifica che definisce un tipo di dato Libro Come? Come si vuole ma usando una rappresentazione privata

public class Libro{ //OVERVIEW: un Libro memorizza il titolo (String), //lautore (String), numero di copie (int) public Libro(String t,String a,int n){ //REQUIRES: n >0 //EFFECTS: crea un nuovo Libro con titolo t, //autore a, e numero di copie n } public void somma(int num) { //REQUIRES: num>0 //MODIFIES:this //EFFECTS: aggiorna il numero delle copie sommando //num } public String autore(){ //EFFECTS: restituisce lautore di this} public String titolo(){ //EFFECTS: restituisce il titolo di this}

public int copie(){ //EFFECTS: restituisce il numero di copie di this} public boolean equals(Libro p){ //EFFECTS: restituisce true se this e p // sono uguali, altrimenti false} } uguali ======> hanno lo stesso stato interno

Suggerimento Partire dallo stato degli oggetti (da definire tramite opportune variabili distanza) Poi implementare i metodi

Esercizio: Part II Vogliamo realizzare un modulo che usa il tipo di dato Libro Dei metodi statici che effettuano operazioni su un insieme di Libri (rappresentati come un array di Libro)--biblioteca Vediamo la specifica della classe (da implemenatre)

public class ProcLibro{ //OVERVIEW: definisce metodi statici per //effettuare operazioni su un array di Libri public static boolean cerca(Libro[] b, Libro p){ //EFFECTS: restituisce true se p occorre in b, altrimenti false} public static String cerca(Libro[] b, String a){ //EFFECTS: restituisce il titolo di un Libro //appartenente ad l con autore a, se non ce ne // sono la stringa vuota} public static String all-copie(Libro[] b, String a, String t){ //EFFECTS: restituisce il numero di copiein b del //Libro che ha autore a e titolo t } }

Part III: testing Per testare le due classi e necessario realizzare un metodo main Crea delle istanze di tipo Libro e un array Chiama i metodi delle due classi per verificare il loro funzionamento Gli esercizi vanno finiti a casa (si possono fare benissimo anche sulla carta) Io sono a disposizione per correggerli