Specifiche. Scopo e significato delle specifiche (1) Lo scopo di una specifica è di definire il comportamento di un ’ astrazione. Gli utenti si baseranno.

Slides:



Advertisements
Presentazioni simili
Astrazioni Polimorfe e Tipi Generici. 2 Polimorfismo Dal Greco molte forme Una variabile polimorfa può riferirsi a oggetti di classi diverse Un metodo.
Advertisements

1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
LIP: 4 Aprile 2008 ECCEZIONI. Eccezioni Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
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.
Testing e Debugging.
Astrazioni sul controllo Iteratori. 2 Nuove iterazioni Definendo un nuovo tipo come collezione di oggetti (p. es., set) si vorrebbe disporre anche di.
Specifiche senza JML: uso delle asserzioni. 2 Asserzioni in Java Dal jdk 1.4 (da Febbraio 2002) cè meccanismo per gestire asserzioni Asserzione: espressione.
Lezione 4: Costrutti Condizionali Prof. Raffaele Montella.
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.
1 Programmazione = decomposizione basata su astrazioni (con riferimento a Java)
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti dispense prof. G. Levi.
ND-partizione (A) n   A  somma  0 M  1/2 (  a i ) for i  1 to n do S[i]  choice ({true, false}) if S[i] then somma  somma + a i if somma > M then.
Astrazione procedurale ed eccezioni
Esercizi.
Sessione live Testing. Esercizio Quesito 1 Soluzione 1.
1 Un esempio con iteratore: le liste ordinate di interi.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Capitolo 6 Iterazione Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies.
Eccezioni Metodi parziali Eccezioni: Usi e Metodi parziali Eccezioni: rimuovere i requires Eccezioni: rimuovere i requires Eccezioni: definizione, sollevamento,
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
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.
Liste di Interi Esercitazione. IntList Lista di interi Problema tipico: memorizzare una sequenza di valori [6,0,9,3….9] Vediamo un tipo di dato utile.
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 Gerarchie e polimorfismo: liste. 2 Generalizzare le liste di interi  List 4 lista di oggetti –non modificabile 4 vorremo poi definire un sottotipo.
1 Laboratorio di Introduzione alla Programmazione §II MODULO §3 crediti §Esame e voto unico (su 6 crediti totali)
1 Astrazione sul controllo: gli iteratori. 2 Gli iteratori 4 perché vogliamo iterarare “in modo astratto” 4 iteratori e generatori in Java –specifica.
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.
1 Un esempio: le liste ordinate di interi. 2 Liste ordinate  OrderedIntList 4 lista ordinata di interi –modificabile.
Ese 3 (del 3 Aprile 2003). Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterarare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
1 Le gerarchie di tipi: implementazioni multiple e principio di sostituzione.
Testing e debugging. Validazione (1) Il problema: Assicurarsi se un programma funziona come intendiamo e scoprire perché non lo fa, se questo è il caso.
Ese 3 (del 3 Aprile 2003). Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi.
Ese 3 (del 31 Marzo 2004). Testo Dare rappresentazione e realizzazione dei metodi della seguente classe QueueWithPriority. Nella risposta, non riportare.
1 Le s-espressioni. 2  Sexpr 4 alberi binari (possibilmente “vuoti”) che hanno sulle foglie atomi (stringhe) 4 sono la struttura dati base del linguaggio.
Esercizio 3. Testo Dare rappresentazione e realizzazione dei metodi della seguente classe QueueWithPriority. Nella risposta, non riportare i commenti.
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.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
Esercitazione. Problema Vogliamo definire in modo gerachico un tipo di dato che definisce Tabelle multi-dimensionali con un numero di righe variabili.
1 Testing e debugging. 2 Validazione 4 vogliamo assicurarci che un programma funziona come vorremmo e scoprire perché non lo fa, se questo è il caso 4.
1 Metodologie di Programmazione = decomposizione basata su astrazioni.
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.
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.
Liste Concatenate 28 Marzo Avviso Martedi’ 4 Aprile: Verifica di LIP Per iscriversi (obbligatorio) inviare un e- mail entro venerdi’ 31 Marzo a.
Esercitazione sull’ ordinamento 20 maggio 2003
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.
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.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
6/11/01Ordinamento 1 Un esempio di algoritmi: ordinamento.
Transcript della presentazione:

Specifiche

Scopo e significato delle specifiche (1) Lo scopo di una specifica è di definire il comportamento di un ’ astrazione. Gli utenti si baseranno su questo comportamento mentre chi implementa l ’ astrazione dovrà preoccuparsi che venga assicurato. Un ’ implementazione che fornisce il comportamento descritto si dice che soddisfa la specifica. Definiamo significato di una specifica l ’ insieme di tutti i moduli di programma che la soddisfano. Lo chiamiamo insieme specificando della specifica.

Scopo e significato delle specifiche (2) Esempio. static int p (int y) // REQUIRES: y > 0 // EFFECTS: Returns x such that x > y. Questa specifica è soddisfatta da una procedura p che, quando chiamata con un argomento maggiore di zero, restituisce un valore piú grande del suo argomento. Membri dell ’ insieme specificando includono static int p (int y) { return y+1; } static int p (int y) { return y * 2; } static int p (int y) { return y * 3; } Come ogni specifica, questa è soddisfatta da un numero infinito di programmi.

Attributi delle specifiche Una specifica è sufficientemente restrittiva se esclude tutte le implementazioni che sono inaccettabili agli utenti di un ’ astrazione. Una specifica è sufficientemente generale se non preclude implementazioni accettabili. Una specifica dovrebbe essere chiara cosí che sia facile agli utenti capirla.

Restrittività (1) Una buona specifica dovrebbe essere abbastanza restrittiva da escludere qualunque implementazione che sia inaccettabile agli utenti dell ’ astrazione. Questa richiesta è alla base di quasi tutti gli usi di specifiche. In generale, discutere se una specifica è sufficientemente restrittiva oppure no implica discutere gli usi che si fanno dei membri dell ’ insieme specificando. Errori tipici che portano a specifiche restrittive in modo inadeguato: non mettere le richieste necessarie nella clausola REQUIRES. Esempio. Consideriamo tre specifiche per un iteratore elems di un multinsieme (bag) di interi. Un IntBag is come un IntSet tranne che un elemento può occorrervi pi ú volte.

Restrittività (2) public Iterator elems ( ) // EFFECTS: Returns a generator that produces every element of this // (as Integers). public Iterator elems // EFFECTS: Returns a generator that produces every element of this // (as Integers). // REQUIRES: this not be modified while the generator is in use. public Iterator elems ( ) // EFFECTS: Returns a generator that produces every element of this // (as Integers), in arbitrary order. Each element is produced exactly // the number of times it occurs in this // REQUIRES: this not be modified while the generator is in use.

Restrittività (3) La prima specifica non tiene conto di quello che può capitare se il bag è cambiato mentre il generatore restituito da elems è in uso e quindi consente implementazioni che danno comportamenti completamente differenti a seconda che il cambiamento del bag influenzi o no il valore restituito. Un modo di trattare il problema è di richiedere che il bag non sia cambiato fintantoché il generatore è in uso, come viene fatto nella seconda specifica. Questa specifica può ancora non essere sufficientemente restrittiva perché non vincola l ’ ordine in cui gli elementi sono restituiti. Sarebbe meglio o definire un ordine o includere la richiesta "in arbitrary order". Inoltre la specifica non chiarisce che cosa si deve fare quando un elemento compare nel bag piú di una volta e non dice neppure esplicitamente che il generatore restituisce solo gli elementi che sono nel bag. La terza specifica corregge queste mancanze.

Restrittività (4) Altri errori sono dovuti alla non identificazione delle eccezioni da segnalare e alla mancata specifica di quello che va fatto in situazioni al confine. Esempio. Consideriamo una procedura indexString that prende stringhe s1 e s2 e, se s1 è una sottostringa di s2, restituisce l ’ indice a cui il primo carattere di s1 occorre in s2 ( indexString ("ab", "babc") restituisce 1). Una specifica che contenesse solo questa informazione non sarebbe abbastanza restrittiva perché non spiega che cosa capita se s1 non è una sottostringa di s2 o se occorre piú volte in s2 o se s1 oppure s2 sono vuote. La specifica seguente è abbastanza restrittiva. public static int indexString (String s1, String s2) throws NullPointerException, EmptyException // EFFECTS: If s1 or s2 is null, throws NullPointerException; else if s1 // is the empty string, throws EmptyException; else if s1 occurs as a // substring in s2, returns the least index at which s1 occurs; else returns -1. // E.g. indexString("bc", "abcbc") = 1, indexString ("b", a") = -1 //

Generalità Una buona specifica dovrebbe essere abbastanza generale da assicurare che pochi o nessun programma accettabile sia escluso. Anche se programmi accettabili sono esclusi non lo dovrebbero essere i piú desiderabili, ossia i piú efficienti ed eleganti. Esempio. La specifica seguente public static float sqrt (float sq, float e) // REQUIRES: sq >= 0 && e >.001 // EFFECTS: Returns rt such that 0 <= (rt * rt - sq) <= e. costringe l ’ implementatore ad algoritmi che trovano approssimazioni piú grandi o uguali all ’ effettiva radice quadrata. Il vincolo può portare a una perdita di efficienza.

Specifiche operazionali e definizionali (1) Una specifica definizionale elenca esplicitamente proprietà che i membri dell ’ insieme specificando devono esibire Un aspecifica operazionale, invece di descrivere le proprietà dei programmi specificandi dà una ricetta per costruirli. Esempio. Prendiamo un programma che cerca un elemento in un array. La prima specifica spiega come implementare la ricerca, mentre la seconda descrive soltanto una proprietà che gli input e gli output devono soddisfare. La specifica definizionale è piú breve e inoltre lascia all ’ implementatore la scelta di esaminare l ’ array in un ordine diverso da quelli dal primo all ’ ultimo elemento.

Specifiche operazionali e definizionali (2) public static int search (int[ ] a, int x) throws NotFoundException, NullPointerException // EFFECTS: If a is null throws NullPointerException else examines //a[0], a[1], ….., in turn and returns the index of the first one // that is equal to x. Signals NotFoundException if none equals x. public static int search (int[ ] a, int x) throws NotFoundException, NullPointerException // EFFECTS: if a is null throws NullPointerException else returns i // such that a[i] = x; signals NotFoundException if there is no such i.

Chiarezza (1) Una buona specifica dovrebbe essere chiara. I fattori che contribuiscono alla chiarezza sono concisione, ridondanza e struttura. La presentazione piú concisa può non essere la migliore, ma è un buon punto di partenza. La ridondanza può essere introdotta se serve a ridurre il rischio di incomprensione o a cogliere errori. Esempio. Consideriamo un programma che prende due insiemi e verifica se uno è un sottoinsieme dell ’ altro. La prima specifica è precisa ma può lasciare dei dubbi. Con subset si intende sottoinsieme o sottoinsieme proprio? La seconda specifica non lascia dubbi, ma non dice esplicitamente che si vuole un test della proprietà “ essere un sottoinsieme ”. La terza specifica è la piú soddisfacente.

Chiarezza (2) static boolean subset (IntSet s1, IntSet s2) throws NullPointerException // EFFECTS: If s1 or s2 is null throws NullPointerException else // returns true if s1 is a subset of s2 else returns false. static boolean subset (IntSet s1, Intset s2) throws NullPointerException // EFFECTS: if s1 or s2 is null throws NullPointerException else // returns true if every element of s1 is an element of s2 else returns // false. static boolean subset (IntSet s1, IntSet s2) throws NullPointerException // EFFECTS: If s1 or s2 is null throws NullPointerException else returns // true if s1 is a subset of s2 else returns false, i.e., returns true if every // element of s1 is an element of s2 else returns false.