Approfondimenti metodologici
Valutazione numerica oppure... ?
// parametro: ItemSequence rpn
EvalStack stack = new EvalStack();
Eredità e polimorfismo:
while ( rpn.hasMoreItems() ) {
Condivisione del codice di alto livello
Item item = rpn.nextItem();
Riutilizzo del codice
if ( item instanceof Value ) {
stack.push(item); // protocollo "imperativo"
} else if ( item instanceof Operation ) {
stack.apply( (Operation) item );
}
Modello funzionale o imperativo?
}
Università di Udine
Dipartimento di Matematica e Informatica
Settembre 2005,
Diapositiva 1
// stack.top() rappresenta il risultato
Università di Udine
Dipartimento di Matem atica e Informatica
Classe "EvalStack"
Settembre 2005,
Diapositiva 2
Classe "Datum"
public void apply( Operation opr ) {
public Value apply( Operation opr, Value itm ) {
if ( size() > 1 ) {
try {
int k = ( (Datum) itm ).n;
ArithmeticOperation arith
= (ArithmeticOperation) opr;
Value itm2 = (Value) top();
pop();
Value itm1 = (Value) top();
pop();
return new Datum( arith.exec(n,k) );
push( itm1.apply(opr,itm2) );
} catch ( ClassCastException cce ) { ... }
}
}
}
Università di Udine
Dipartimento di Matematica e Informatica
Settembre 2005,
Diapositiva 3
Università di Udine
Dipartimento di Matem atica e Informatica
Settembre 2005,
Diapositiva 4
Potenza del polimorfismo
Classe "Infix"
public class Infix implements Value {
private final String infix;
public Infix( int n )
{ ... }
public Value apply( Operation opr, Value itm ) { ... }
public String representation()
{ ... }
}
Univ ersi tà di Ud ine
Dipa rt iment o d i Ma temat ica e Inf ormat ica
Sett embre 200 5,
Diapo sitiva 5
Uni versità di Ud ine
Dip art iment o di M ate ma tica e Inf orma tica
Classe "Infix"
Sett embre 2 00 5,
Di aposit iva 6
Classe "Infix"
public Infix( int n ) {
infix = "" + n;
}
public Value apply( Operation opr, Value itm ) {
try {
String other = ( (Infix) itm ).infix;
SyntacticOperation build
= (SyntacticOperation) opr;
private Infix( String infix ) { // costruttore privato
this.infix = infix;
}
return new Infix( build.exec(infix,other) ) ;
public String representation( ) {
return infix;
}
Univ ersi tà di Ud ine
Dipa rt iment o d i Ma temat ica e Inf ormat ica
} catch ( ClassCastException cce ) { ... }
}
Sett embre 200 5,
Diapo sitiva 7
Uni versità di Ud ine
Dip art iment o di M ate ma tica e Inf orma tica
Sett embre 2 00 5,
Di aposit iva 8
Astrazione "SyntacticOperation"
Composizione sintattica
public class Cons extends SyntacticOperation {
public abstract class SyntacticOperation
implements Operation {
private final String op; // codifica ogni operazione
public Cons( String op ) { ... }
public abstract String exec( String x, String y );
}
public String exec( String x, String y ) {
return ( "(" + x + " " + op + " " + y + ")" );
}
}
Università di Udine
Dipartimento di Matematica e Informatica
Settembre 2005,
Diapositiva 9
Università di Udine
Dipartimento di Matematica e Informatica
Dove cambiano gli Item prodotti?
public class CnvTail extends StringTokenizer
implements ItemSequence {
public CnvTail( String rpn )
{ ... }
public boolean hasMoreItems()
{ ... }
public Item nextItem()
{ ... }
}
Università di Udine
Dipartimento di Matematica e Informatica
Settembre 2005,
Diapositiva 10
nextItem: Factory method
public Item nextItem() {
try {
String token = nextToken();
if ( token.equals("+") || ... ) {
return new Cons(token);
} else {
int n = Integer.parseInt(token);
return new Infix(n);
}
} catch ( Exception e ) { return null; }
}
Settembre 2005,
Diapositiva 11
Università di Udine
Dipartimento di Matematica e Informatica
Settembre 2005,
Diapositiva 12
Esercizio 2 – Polimorfismo
Esercizio 1 – Oggetti
Cartella rpn2/src (completa)
Aprire anche "Infix.java" e compilare
Aprire "Cons.java" in DrJava e compilare
>
>
>
>
>
>
>
>
minus = new Cons( "-" )
plus = new Cons( "+" )
minus.exec( "12", "7" )
plus.exec( "12", "7" )
Settembre 2005,
new
new
new
new
Cons( "-" )
Cons( "+" )
Infix(12)
Infix(7)
> ( itm12.apply(minus,itm7) ).representation()
> ( itm12.apply(plus,itm7) ).representation()
Che differenza c'è fra i casi
ArithmeticOperation e SyntacticOperation?
Si tratta ancora polimorfismo?
Università di Udine
Dipartimento di Matemati ca e Informatica
minus =
plus =
itm12 =
itm7 =
...e confrontare con la lezione precedente.
Diapositiva 13
Universi tà di Udi ne
Dipartimento di Matematica e Informatica
Esercizio 3 – Iteratore
Settembre 2005,
Diapositi va 14
Esercizio 4 – Polimorfismo
Aprire anche "CnvTail.java" e compilare
>
>
>
>
>
>
>
rpn = new CnvTail( " 12 7 - " )
( (Value) rpn.nextItem() ).representation()
( (Value) rpn.nextItem() ).representation()
rpn.hasMoreItems()
rpn.nextItem()
rpn.hasMoreItems()
...
Università di Udine
Dipartimento di Matemati ca e Informatica
Settembre 2005,
Diapositiva 15
Aprire infine "EvalRPN.java" e compilare
> EvalRPN.process( new RPNTail("12 3 4 + *") )
> EvalRPN.process( new CnvTail("12 3 4 + *") )
etc.
Universi tà di Udi ne
Dipartimento di Matematica e Informatica
Settembre 2005,
Diapositi va 16
Il codice di alto livello non cambia!
Ulteriori esercizi...
// parametro: ItemSequence rpn
EvalStack stack = new EvalStack();
while ( rpn.hasMoreItems() ) {
> java EvalRPN "7 3 * 4 12 + -"
Item item = rpn.nextItem();
> java EvalRPN "7 3 * 4 12 + -" I
if ( item instanceof Value ) {
stack.push(item);
} else if ( item instanceof Operation ) {
stack.apply( (Operation) item );
}
}
// stack.top() rappresenta il risultato
Università di Udine
Dipartimento di Matematica e Informatica
Settembre 2005,
Diapositiva 17
Nuovo problema: LCS
Università di Udine
Dipartimento di Matematica e Informatica
Settembre 2005,
Diapositiva 18
Riutilizzo della classe Stack
public static Stack lcs( Stack u, Stack v ) {
lcs( "", u ) = lcs( u, "" ) = ""
lcs( au, av ) = a lcs( u, v )
lcs( au, bv ) = lcs( au, v )
se a
b & | lcs(au,v) | >= | lcs(u,bv) |
lcs( au, bv ) = lcs( u, bv )
se a
b & | lcs(au,v) | < | lcs(u,bv) |
Università di Udine
Dipartimento di Matematica e Informatica
if ( u.empty() || v.empty() ) { // stack funzionale
return new Stack();
} else if ( (u.top()).equals(v.top()) ) {
return ( lcs(u.pop(),v.pop()) ).push( u.top() );
} else {
final Stack s1 = lcs( u, v.pop() );
final Stack s2 = lcs( u.pop(), v );
if ( s1.size() < s2.size() )
else
{ return s2; }
{ return s1; }
}
}Università di Udine
Settembre 2005,
Diapositiva 19
Dipartimento di Matematica e Informatica
Settembre 2005,
Diapositiva 20
Interfaccia "Token"
Interfaccia "Token"
Cosa è rilevante?
public interface Token extends Item {
a) stack.push(v) : Token extends Item
public boolean equals( Object other );
b) contenuto :
String toString()
c) u.equals(v) :
boolean equals( Object other )
public String toString();
}
Perché "Object" ?
Università di Udine
Dipartimento di Matemati ca e Informatica
Settembre 2005,
Diapositiva 21
Esercizio 5 – Classe "Symbol"
Universi tà di Udi ne
Dipartimento di Matematica e Informatica
Settembre 2005,
Diapositi va 22
Esercizio 6 – Funzionale
Cartella lcs1/src
Aprire "LCS.java" e compilare
Aprire "Symbol.java" e "SymbolManager"
Analizzare il codice Java e compilare
> TokenManager tkm = new SymbolManager()
> s1 = tkm.pile( "solstizio" )
> s2 = tkm.pile( "natalizio" )
> TokenManager tkm = new SymbolManager()
> s3 = LCS.lcs( s1, s2 )
>
>
>
>
> tkm.unpile( s3 )
stk = tkm.pile( "Java" )
stk.top()
stk.size()
tkm.unpile( stk )
Università di Udine
Dipartimento di Matemati ca e Informatica
etc. (attenzione all'inefficienza)
Settembre 2005,
Diapositiva 23
Universi tà di Udi ne
Dipartimento di Matematica e Informatica
Settembre 2005,
Diapositi va 24
Esercizio 7 – Stack "imperativo"
Aprire LCS e compilare
Sostituire "Stack" copiando
il file contenuto nella cartella lcs2/src
Correggere il metodo "lcs":
quali sono le difficoltà?
Chiudere LCS e compilare
Correggere "SymbolManager"
>
>
>
>
>
TokenManager tkm = new SymbolManager()
stk = tkm.pile( "Java" )
stk.top()
stk.size()
tkm.unpile( stk )
Università di Udine
Di parti mento di Matemati ca e Informati ca
S ettembre 2005,
Esercizio 8 – Stack "imperativo"
Diaposi tiva 25
Ancora polimorfismo
>
>
>
>
>
TokenManager tkm = new SymbolManager()
s1 = tkm.pile( "solstizio" )
s2 = tkm.pile( "natalizio" )
s3 = LCS.lcs( s1, s2 )
tkm.unpile( s3 )
etc. (attenzione all'inefficienza)
Uni versità di Udine
Di par ti mento di Matematica e I nformati ca
Settembre 20 05, Diaposi tiva 26
Ulteriori esercizi (polimorfismo)
Applicazione: confronto testuale di file...
> java LCS reciprocamente impertinente
Classi: "TextLine" e "TextManager"
Università di Udine
Di parti mento di Matemati ca e Informati ca
S ettembre 2005,
> java LCS Sample0 Sample4 F
Diaposi tiva 27
Uni versità di Udine
Di par ti mento di Matematica e I nformati ca
Settembre 20 05, Diaposi tiva 28