Public abstract class Tree {



Scaricare 38 Kb.
23.05.2018
Dimensione del file38 Kb.

Metodologie di Programmazione

18-7-2006

Si consideri la seguente specifica del tipo di dato astratto Env,
public class Env {

// OVERVIEW: un Env è una funzione parziale (a dominio finito) da

// un dominio di oggetti omogenei ad un codominio di oggetti //omogenei. E’ modificabile.
// costruttore

public Env(Object d, Object c) throws NullPointerException {

// EFFECTS: se d o c sono null solleva NullPointerException, //altrimenti costruisce un nuovo Env che ha il dominio del tipo di //d e il codominio del tipo di c, ed è indefinito per tutti gli //argomenti.}
//metodi

public boolean defined(Object s) {

// EFFECTS: se this è definito per l'argomento s restituisce true, //altrimenti false.}
public Object apply (Object s) throws UndefinedSymbolException {

// EFFECTS: se this è definito per s restituisce this(s), //altrimenti solleva 1'eccezione UndefinedSymbolException}


public void bind (Object d, Object c) throws DuplicateException, ClassCastException, NullPointerException {

//MODIFIES: this

// EFFECTS: se d o c e’ null solleva NullPointerException, se this è già //definita per d solleva DuplicateException, se c non è dello stesso //tipo del codominio o d non è dello stesso tipo del dominio di this //solleva ClassCastException, altrimenti aggiunge a this l’associazione tra d e c}

}


  1. Si fornisca la rappresentazione di Env, l’invariante di rappresentazione e la funzione di astrazione

private Vector dom;

private Vector cod;

private Class tipod;

private Class tipoc;

Il Vector dom e cod memorizzano gli elementi del dominio e codominio, rispettivamente.

La funzione associa all’elemento in posizione i di dom l’elemento in posizione i di cod.

Il tipo degli elementi del dominio e codominio e’ memorizzato nelle variabili tipod e tipoc, rispettivamente.

Queste proprieta’ sono formalizzate dalle seguenti funzione di astrazione ed invariante di rappresentazione:

Alpha (c)= f:c.dom - c.cod tale che per ogni i, 0<=i < c.dom.size()


f(c.dom.get(i))=c.cod.get(i)

I(c)= c.dom,c.cod,c.tipod,c.tipoc!=null &

c.dom.size()=c.cod.size() (i due vettori sono lunghi uguali) &

per ogni i, 0<=i < j< < c.dom.size() (

c.tipod.isinstance(c.dom.get(i)) & (tutti quelli del dominio hanno lo stesso tipo)

c.tipoc.isinstance(c.cod.get(i)) & (tutti quelli del codominio hanno lo stesso tipo)

!(c.dom.get(i).equals(c.dom.get(j)) (tutti gli elementi di dom sono distinti))


  1. Si implementi il costruttore ed il metodo bind, e si dimostri che soddisfano l’invariante

public Env(Object d, Object c) throws NullPointerException {

// EFFECTS: se d o c sono null solleva NullPointerException, //altrimenti costruisce un nuovo Env che ha il dominio del tipo di //d e il codominio del tipo di c, ed è indefinito per tutti gli //argomenti.

dom=new Vector(); cod=new Vector();

tipod=d.getClass();

tipoc=c.getClass();}

Soddisfa l’invariante perche’ tutte le var. sono inizializzate. Le altre condizioni valgono banalmente dato che i Vector sono vuoti
//metodi

public void bind (Object d, Object c) throws DuplicateException, ClassCastException, NullPointerException {

//MODIFIES: this

// EFFECTS: se d o c e’ null solleva NullPointerException, se this è già //definita per d solleva DuplicateException, se c non è dello stesso //tipo del codominio o d non è dello stesso tipo del dominio di this //solleva ClassCastException, altrimenti aggiunge a this l’associazione tra d e c

if (d==null || c==null) throw new NullPointerException(Env.bind”);

if (! (tipod.isinstance(d) && tipoc.isinstance(c) )

throw new ClassCastException(Env.bind”);

if (defined(d)) throw new DuplicateException(Env.bind”);

dom.add(d); cod.add(c) ;}
Soddisfa l’invariante perche’ i parametri vengono inseriti solo se omogenei con tipo d e tipoc, rispettivamente. Inoltre si controlla che d non fosse gia’ definito.



  1. Si fornisca specifica ed implementazione di una sottoclasse di Env, AddEnv, che definisce un tipo particolare di Env in cui gli elementi del codominio sono sottotipi omogenei dell’interfaccia Addable (riportata in appendice). La sottoclasse estende Env fornendo un metodo che restituisce la somma degli elementi del codominio (che sono immagine di elementi del dominio!)

public class AddEnv extends Env{

// OVERVIEW: un AddEnv è un tipo particolare di Env, in cui gli elementi del condominio sono sottotipi di Addable
private Addable sum; //memorizza la somma corrente

// costruttore

public AddEnv(Object d, Addable c) throws NullPointerException {

// EFFECTS: se d o c sono null solleva NullPointerException, //altrimenti costruisce un nuovo AddEnv che ha il dominio del tipo di //d e il codominio del tipo di c, ed è indefinito per tutti gli //argomenti.


super(d,c); sum=(Addable) c.zero();}
//metodi overridden (per aggiornare la somma)

public void bind (Object d, Object c) throws DuplicateException,ClassCastException, NullPointerException {

//MODIFIES: this

// EFFECTS: se d o c e’ null solleva NullPointerException, se this è già //definita per d solleva DuplicateException, se c non è dello stesso //tipo del codominio o d non è dello stesso tipo del dominio di this //solleva ClassCastException, altrimenti aggiunge a this l’associazione tra d e c


super(d,c);

sum=(Addable) sum.add( c );}

//metodi nuovi

public Addable somma(){

// EFFECTS: restituisce la somma degli elementi del codiminio

return sum;

}

}

APPENDICE:



public interface Addable{ // OVERVIEW: i sottotipi hanno associate operazione di somma e sottrazione, e zero.

public Object add(Object x) throws ClassCastException, NullPointerException {



// EFFECTS: se x è null, lancia NullPointerException, se this e x non sono sommabili solleva

// ClassCastException; altrimenti, restituisce la somma di this e x}

public Object sub(Object x) throws ClassCastException, NullPointerException {



// EFFECTS: se x è null, lancia NullPointerException, se this e x non sono sommabili solleva

// ClassCastException; altrimenti, restituisce la sottrazione di this e x}

public Object zero()



{//EFFECTS: restituisce lo zero collegato al tipo di this) }}}


Condividi con i tuoi amici:


©astratto.info 2019
invia messaggio

    Pagina principale