Sommario Sommario Protocollo Esempio 1 esempio: stack (ma non solo...) valutazione di espressioni RPN vantaggi della programmazione imperativa Astrazione sui dati (economia di risorse) stack come oggetto immutabile (link) programmazione nello stile funzionale Esempio 2 sottosequenza comune più lunga Astrazione relativa allo stato stack come oggetto che evolve (array) vantaggi della programmazione funzionale programmazione nello stile imperativo (trasparenza referenziale) Università di Udine Dipartimento di Matematica e Informatica Settembre 2005, Diapositiva 1 Sommario Settembre 2005, Diapositiva 2 Valutazione di espressioni RPN ItemSequence rpn = espressione RPN; Stack stack = pila vuota; Inoltre, primi esempi di: while ( ci sono ancora elementi di rpn ) { interfacce Item item = successivo elemento di rpn; classi astratte if ( item è un valore ) { inserisci item nello stack; } else if ( item è una operazione ) { esegui l'operazione nello stack; } } // lo stack contiene il risultato eredità polimorfismo Università di Udine Dipartimento di Matematica e Informatica Università di Udine Dipartimento di Matem atica e Informatica Settembre 2005, Diapositiva 3 Università di Udine Dipartimento di Matem atica e Informatica Settembre 2005, Diapositiva 4 Protocollo: Stack Protocollo: Stack Il tipo è caratterizzato dalle operazioni Acquisizione di informazioni Costruttore (stack vuoto) new : Stack Università di Udine Dipartimento di Matematica e Informatica Settembre 2005, Diapositiva 5 Protocollo: Stack pop : apply : Università di Udine Dipartimento di Matematica e Informatica Stack x Item Stack Stack x Oper Stack boolean size : Stack int top : Stack Item Università di Udine Dipartimento di Matematica e Informatica Settembre 2005, Diapositiva 6 Settembre 2005, Diapositiva 8 Modelli realizzativi Creazione di nuove strutture push : empty : Funzionale "puro" Stack static boolean empty( Stack stk ) Stack static int size( Stack stk ) Stack static Item top( Stack stk ) Settembre 2005, Diapositiva 7 Università di Udine Dipartimento di Matematica e Informatica Modelli realizzativi Modelli realizzativi Funzionale "puro" Funzionale "OOP" static Stack push( Item itm, Stack stk ) boolean empty() stk.empty() static Stack pop( Stack stk ) int size() stk.size() static Stack apply( Oper opr, Stack stk ) Item top() stk.top() Università di Udine Dipartimento di Matematica e Informatica Settembre 2005, Diapositiva 9 Modelli realizzativi Università di Udine Dipartimento di Matematica e Informatica Settembre 2005, Modelli realizzativi Funzionale "OOP" Imperativo "OOP" Stack push( Item itm ) stk.push(x) boolean empty() stk.empty() Stack pop() stk.pop() int size() stk.size() Stack apply( Oper opr ) stk.apply(o) Item top() stk.top() Università di Udine Dipartimento di Matematica e Informatica Diapositiva 10 Settembre 2005, Diapositiva 11 Università di Udine Dipartimento di Matematica e Informatica Settembre 2005, Diapositiva 12 Modelli realizzativi Valutazione di espressioni RPN ItemSequence rpn = espressione RPN; Stack stack = new EvalStack(); Imperativo "OOP" (oggetti che evolvono) while ( ci sono ancora elementi di rpn ) { void push( Item itm ) stk.push(x) void pop() stk.pop() void apply( Oper opr ) stk.apply(o) Università di Udine Dipartimento di Matematica e Informatica Settembre 2005, Item item = successivo elemento di rpn; if ( item è un valore ) { stack = stack.push(item); } else if ( item è una operazione ) { stack = ((EvalStack)stack).apply(item); } } // stack.top() rappresenta il risultato Diapositiva 13 Protocollo: ItemSequence Università di Udine Dipartimento di Matematica e Informatica Settembre 2005, Diapositiva 14 Valutazione di espressioni RPN ItemSequence rpn = ... ... ; Stack stack = new EvalStack(); Il protocollo puo rimanere astratto: interfaccia while ( rpn.hasMoreItems() ) { Item item = rpn.nextItem(); public abstract boolean hasMoreItems(); if ( item instanceof Value ) { stack = stack.push(item); } else if ( instanceof Operation ) { stack = (...).apply((Operation) item); } } // stack.top() rappresenta il risultato public abstract Item nextItem(); Università di Udine Dipartimento di Matematica e Informatica Settembre 2005, Diapositiva 15 Università di Udine Dipartimento di Matematica e Informatica Settembre 2005, Diapositiva 16 Sviluppo Top-down Operazioni nello stile Smalltalk ItemSequence rpn = new RPNTail(exp); Stack stack = new EvalStack(); OOP "pura" while ( rpn.hasMoreItems() ) { Item item = rpn.nextItem(); itm3 = itm1.apply( opr, itm2 ); if ( item instanceof Value ) { stack = stack.push(item); } else if ( instanceof Operation ) { stack = (...).apply((Operation) item); } } // stack.top() rappresenta il risultato Università di Udine Di parti mento di Matemati ca e Informati ca S ettembre 2005, Diaposi tiva 17 sum = first.plus( second ); Uni versità di Udine Di par ti mento di Matematica e I nformati ca Realizzazione delle classi... Settembre 20 05, Diaposi tiva 18 Esercizio Variante delle classi "Stack" e "EvalStack" tali ch e i metodi top() e pop() siano realizzati da un’unica operazione: Item pop() Università di Udine Di parti mento di Matemati ca e Informati ca S ettembre 2005, Diaposi tiva 19 Uni versità di Udine Di par ti mento di Matematica e I nformati ca Settembre 20 05, Diaposi tiva 20