Metodologie di programmazione



Scaricare 29.03 Kb.
26.01.2018
Dimensione del file29.03 Kb.

METODOLOGIE DI PROGRAMMAZIONE
Secondo Esercizio

Si consideri la seguente classe astratta che definisce il tipo di dato astratto

“lista di oggetti omogenei”
public abstract class List{

//OVERVIEW: un List è una lista non modificabile di

//Objects omogenei. Elemento tipico [x1,...,xn]
public abstract Object first () throws EmptyException;

// EFFECTS: se this è vuoto solleva EmptyException, //altrimenti ritorna il primo elemento di this
public abstract List rest() throws EmptyException;

//EFFECTS: se this è vuoto solleva EmptyException,

//altrimenti ritorna la lista ottenuta da this

// togliendo il primo elemento
public abstract List addEl(Object x) throws

NullPointerException, ClassCastException;



// EFFECTS: se x e’ null solleva NullPointerException,

// se x non e’ omogeneo con gli altri elementi di this

// solleva ClassCastException, altrimenti restituisce

// la lista ottenuta aggiungendo x alla fine di this
public abstract List concatenate(List x) throws

NullPointerException, ClassCastException;



// EFFECTS: se x e’ null solleva NullPointerException,

// se gli elementi di x non sono omogenei con gli

// elementi di this solleva ClassCastException,

// altrimenti restituisce la lista

// ottenuta concatenando x alla fine di this

public abstract boolean search(Object x);



//EFFECTS: restituisce true se x occorre in this, false

// altrimenti

}
a) [6 punti] Si forniscano le specifiche di due sottoclassi concrete EmptyList e FullList,

che definiscono liste vuote e non vuote, rispettivamente.

public class EmptyList extends List{



//OVERVIEW: un EmptyList è una lista vuota
public EmptyList(){

//EFFECTS: inizializza this alla lista vuota}


public Object first () throws EmptyException{

// EFFECTS: solleva EmptyException}

public List rest() throws EmptyException{



//EFFECTS: solleva EmptyException}
public List addEl(Object x) throws

NullPointerException{



// EFFECTS: se x e’ null solleva NullPointerException,

//, altrimenti restituisce

// la lista ottenuta aggiungendo x alla fine di this}
public List concatenate(List x) throws

NullPointerException {



// EFFECTS: se x e’ null solleva NullPointerException,

// altrimenti restituisce la lista

// ottenuta concatenando x alla fine di this
public boolean search(Object x);

//EFFECTS: restituisce false

public class FullList extends List{



//OVERVIEW: un List è una lista non modificabile di

//Objects omogenei.

//Elemento tipico [x1,...,xn] con n>0
public FullList(Object x)

throws NullPointerException{

//EFFECTS: se x e’ null solleva NullPointerException, //altrimenti inizializza this alla lista che contiene x}

public Object first (){



// EFFECTS: ritorna il primo elemento di this}
public List rest(){

//EFFECTS: ritorna la lista ottenuta da this

// togliendo il primo elemento}
…resto uguale alla superclasse
}

b) [4 punti] Per EmptyList si dia la rappresentazione con relativa funzione di

astrazione ed invariante. Si implementino il costruttore ed il metodo addEl.
Non ci sono variabili e neanche invariante.
Funzione di astrazione: alpha( c)=[]
public EmptyList(){

//EFFECTS: inizializza this alla lista vuota

}

public List addEl(Object x) throws



NullPointerException{

// EFFECTS: se x e’ null solleva NullPointerException,

//, altrimenti restituisce

// la lista ottenuta aggiungendo x alla fine di this

return new FullList(x);}

c) [8 punti] Per FullList si dia la rappresentazione con relativa funzione di astrazione ed

invariante. Si implementino il costruttore ed i metodi addEl,concatenate.

Si provi che il metodo concatenate preserva l’invariante e soddisfa la

specifica.

Rappresentazione: private Object val;

private Class tipo;

private List next;


Funzione di astrazione: alpha( c)= c.val + alpha(c.next)
Invariante: I( c)= c.val!=null & c.next !=null &

c.tipo!=null & I(c.next) &

c.tipo.isinstance(c.val)&

(c.next instanceof FullList =

c.tipo=c.next.tipo)

public FullList(Object x)

throws NullPointerException{

//EFFECTS: se x e’ null solleva NullPointerException, //altrimenti inizializza this alla lista che contiene x

if (x==null) throw

new NullPointerexception(“FullList”);

val=x; tipo=x.getClass();

next=new EmptyList();


}

public abstract List addEl(Object x) throws

NullPointerException, ClassCastException{

// EFFECTS: se x e’ null solleva NullPointerException,

// se x non e’ omogeneo con gli altri elementi di this

// solleva ClassCastException, altrimenti restituisce

// la lista ottenuta aggiungendo x alla fine di this
if (x==null) throw

new NullPointerexception(“FullList”);



if (!tipo.isinstance(x)) throw

new ClassCastException(“FullList”);

List newnext=next.addEl(x);

List n=new FullList(val);

n.next =newnext;

return n;}

public abstract List concatenate(List x) throws

NullPointerException, ClassCastException{



// EFFECTS: se x e’ null solleva NullPointerException,

// se gli elementi di x non sono omogenei con gli

// elementi di this solleva ClassCastException,

// altrimenti restituisce la lista

// ottenuta concatenando x alla fine di this
if (x==null) throw

new NullPointerexception(“FullList”);



if (!tipo.isinstance(x.tipo)) throw

new ClassCastException(“FullList”);

List result=this;

List nodo=x;

try

{ while (true)



{Object el=nodo.val;

result=result.addEl(el);

nodo=nodo.next;}}

catch (EmptyException e)



{}

return result;}




}



©astratto.info 2017
invia messaggio

    Pagina principale