Introduzione allAnalisi e Design ad oggetti Luca Lista.

Slides:



Advertisements
Presentazioni simili
Il paradigma Object Oriented
Advertisements

Progettazione dei Sistemi Interattivi (A.A. 2004/05) - Lezione 2 1 Progettazione e Sviluppo di Software ad Oggetti 4 OBJECT-ORIENTED ANALYSIS Processo.
Unified Modeling Language
Recupero debito quarto anno Secondo incontro
Informatica Recupero debito quarto anno Terzo incontro.
Informatica 2 Lezione 4 Corso di laurea in matematica Informatica 2 Dott. Ing. Leonardo Vito Corso di laurea matematica indirizzo matematica per le applicazioni.
Java: programmazione concorrente con condivisione di memoria
Differenze nei vari linguaggi di Elisa Trifirò e Barbara Tacchino
Classi ed Oggetti in Java (Cenni). Richiami Ruolo delle Classi in Java Oggetti.
Le gerarchie di tipi.
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.
Introduzione al linguaggio C
Fondamenti di Informatica Prof. Cantone
©Carlo Tasso 1999 Object Oriented Programming Slide 1 OO Analysis Vs. OO Design OOA – Object Oriented Analysis. –Specifica COSA, IN QUALE CONTESTO il sistema.
1 Programmazione ad oggetti in Java E.Mumolo, DEEI
Costruzione di Interfacce Lezione 12 C++STL
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
Il linguaggio UML Luca Lista. Metodi Object Oriented –Booch Method by Grady Booch –OMT by Jim Rumbaugh –Objectory (Use Cases) by Ivar Jacobson –CRC by.
L.Lista Design P atterns Luca Lista. L.Lista Design Patterns Elementi di software OO riutilizzabile Piccoli insiemi di classi che collaborano implementando.
Struttura dei sistemi operativi (panoramica)
Fondamenti di Informatica I a.a Il linguaggio C Il controllo di flusso La selezione condizionale Listruzione switch I cicli Le istruzioni break,
© CEFRIEL Ricettario dei principali pattern GoF Docente: Gabriele Lombardi
Ciclo di vita del software
Basi di dati 2002 EER Vogliamo aumentare lespressività degli Entity Model EER: Entity Model Esteso.
1 Ereditarietà Una classe può essere derivata da una classe esistente usando la sintassi: public, protected e private specificano il tipo di accesso ai.
Le classi Definizione di classe Attributi e metodi di una classe Costruttori e distruttori Private e public Funzioni friend Il puntatore this.
La costituzione del gruppo
Modello E-R Generalizzazioni
Modello E-R Generalizzazioni
A.Natali DL Maggio1999 Oggetti Concetti fondamentali.
Introduzione alla modellazione di sistemi interattivi
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Elementi di Informatica di base
Introduzione alla programmazione Object Oriented
Sistemi e Tecnologie Informatiche Requisiti per la realizzazione di un buon programma.
Il linguaggio UML Luca Lista.
1Ingegneria Del Software L-A Progetto realizzato da: Luca Iannario, Enrico Baioni, Sara Sabioni. A.A. 2008/2009.
1Ingegneria Del Software L-A Progetto realizzato da: Luca Iannario, Enrico Baioni, Sara Sabioni. A.A. 2008/2009.
User stories Claudio Maccari Mail:
1 cin>>c8 s.r.l A.A Generalità Uno dei concetti largamente adottati negli ultimi anni dai professionisti del software in fase di sviluppo.
Esercitazioni di Ingegneria del Software con UML
Complessità di un algoritmo
Progettazione concettuale di SI basati su Web
Lezione 1 Panoramica sui paradigmi di programmazione
Diagramma delle Classi
Introduzione a Javascript
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Analisi dei requisiti Il primo passo di “qualsiasi” processo di sviluppo è la definizione dei requisiti  Definizione del Business Model  Solitamente.
Informatica 4 Funzioni. FUNZIONE: definizione MATEMATICA Relazione (o applicazione) binaria tra due insiemi A e B che associa a ogni elemento di A un.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
LABORATORIO DI INFORMATICA Ingegneria Informatica a. a
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
L.Lista, V. Innocente Design P atterns Luca Lista, Vincenzo Innocente.
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
Ripasso su Java. Introduzione Per risolvere problemi complessi, i linguaggi di programmazione forniscono costrutti per realizzare nuove funzioni che trasformino.
Progettazione di una base di dati Ciclo di vita di un sistema informativo Studio di fattibilità definisce le varie alternative possibili, i relativi costi.
UML: Introduzione Corso IS I /03 Gianna Reggio Versione 0.0.
Strategie di progetto Si possono utilizzare le strategie tipiche dello sviluppo di un processo di ingegnerizzazione (es. ingegneria del software). Strategie.
Progettare una classe 21 Febbraio La classe BankAccount Vogliamo realizzare una classe i cui oggetti sono dei semplici conti bancari. * Identifichiamo.
1 Metodologie di Programmazione = decomposizione basata su astrazioni.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
SISR-USABILITÀ VALUTAZIONE DI USABILITÀ (fonte prof. Polillo)
Unified Modeling Language. –un linguaggio (e notazione) universale, per rappresentare qualunque tipo di sistema software –uno standard OMG (Object Management.
UML Unified Modelling Language Linguaggio per la modellazione unificato.
Normalizzazione. Introduzione Nell’organizzazione tradizionale degli archivi, si verificano alcuni problemi, quali: Ridondanza dei dati (gli stessi dati.
Introduzione all’Ereditarietà Pietro Palladino. Richiami UML Classe: descrizione di un insieme di oggetti software con caratteristiche simili Definisce.
Introduzione alle Classi e agli Oggetti in Java 1.
Framework di sicurezza della piattaforma OCP (Identity & Access Management) Smart Cities and Communities and Social Innovation Bando MIUR D.D. 391/Ric.
Transcript della presentazione:

Introduzione allAnalisi e Design ad oggetti Luca Lista

Il ciclo di vita del software Requirements Analysis Design Production Testing Maintenance

Il modello Waterfall Analysis Design Production Testing Requirements

Il modello Evolutionary Requirements Analysis Design Production Testing

Waterfall vs Evolutionary Evolutionary Brevi cicli di sviluppo completi Scelte basate sulla valutazione dei rischi Integrazione continua Waterfall o Decomposizione completa del sistema dallinizio o Processo per singoli passi o Integrazione alla fine Un prodotto completo è disponibile solo alla fine Un prototipo funzionante è disponibile sin dallinizio

Analysis Comprensione e razionalizzazione dei requisiti –la formulazione dei requisiti è spesso incompleta, ambigua o imprecisa –chiarifica dei requisiti e verifica della consistenza Costruzione del modello Identificazione delle classi degli oggetti rilevanti per lapplicazione –Evitare riferimenti a strutture informatiche, come array, liste, etc. che saranno trattate più tardi Uso dellastrazione –Rimandare i dettagli a una fase successiva Identificazione delle relazioni tra classi I nomi di classi, metodi e attributi sono importanti!

Come identificare le classi Dallanalisi testuale dei requisiti, le classi possono essere identificate con i più importanti sostantivi Possono specificare sia rappresentazioni di entità fisiche (impiegato, libro, ecc.) che concetti (superficie, traiettoria, pagamento, prestito, ecc.) Gli oggetti devono avere responsabilità chiare allinterno del modello Le responsabilità devono essere equamente distribuite tra le diverse classi

Errori da evitare Eliminare classi ridondanti –duplicati di classi già definite (stesse funzionalità: investitore, compratore, venditore), classi irrilevanti (scarse funzionalità: peso, altezza, prezzo), classi di sola implementazione (elenco libri, ecc.) Evitare classi con troppe responsabilità –Meglio spezzarle in classi più piccole, con ruoli più chiari e definiti Evitare classi che siano solo contenitori di dati –Esempio: solo metodi getX(), setX() : equivale ad aver dichiarato X attributo pubblico. La responsabilità sulluso di X ce lha qualche altro oggetto!

Identificazione dei metodi e attributi I primi candidati metodi possono essere estratto dai principali verbi nella descrizione testuale dei requisiti Gli attributi rappresentano le principali proprietà degli oggetti –Utilizzare nuovi oggetti aggregati per le proprietà complesse che meritano unidentità indipendente (es.: lauto di un autista, il conto corrente bancario di un risparmiatore) –Rimandare la descrizione degli attributi necessari per dettagli di implementazione Cercare operazioni comuni a più classi e verificare se sia possibile creare una classe astratta

Rapporto tra client e server Vista del client Il client sa di cosa ha bisogno, e che vuole richiedere al server Non gli interessa come il server fa il lavoro Non gli interessa se il lavoro lo fai il server o se lo delega (es.: proxy) Vista del server Il server sa quale lavoro deve svolgere a richiesta Non gli interessa chi effettua la richiesta Se come svolgere il lavoro o a chi chiedere per svolgere le parti che non sa completare

Assegnare Responsabilità Analizzare il ruolo dei vari oggetti Concentrarsi sul comportamento e non sulla rappresentazione Definire le interfacce (le operazioni che soddisfano le responsabilità) prima Una corretta assegnazione delle responsabilità è la chiave di una buona modularità e riuso

Collaborazione tra classi Le responsabilità vanno suddivise tra i vari oggetti del sistema Non deve esistere un controllo centralizzato –Un oggetto che svolge tutte le operazioni e usa oggetti che siano solo contenitori di dati equivale a un programmare in termini di dati e funzioni! Un oggetto deve compiere le proprie responsabilità e delegare ad altri operazioni specifiche –Legge di Demeter: non usate oggetti lontani: Invece di: stockMarket.stocklist().add(stock); usare: stockMarket.add(stock);

Identificazione delle responsabilità Ogni classe deve tentate di rifiutare le responsabilità –Dovrei? (Non sono io che lo devo fare!) –Potrei? (Non ho le caratteristiche per farlo!) Cercate di fare poco lavoro –Se una classe ha dovuto accettare una responsabilità può cercare di far fare il lavoro a qualche altro oggetto Potenziate i collaboratori, non interferite

Identificazione delle relazioni Cercare collaborazioni Cercare aggregazioni Cercare generalizazioni Come un client conosce il suo service provider? Evitare le relazioni inutili e di eccedere nelle dipendenze –Ragnatele di dipendenze rendono rigido il codice!

Scelta delle possibili relazioni Logiche Generalizzazione: E un.. Aggregazione: Ha Dipendenza: Conosce Implementazione Ereditarietà Istanziazione di template Composizione by value Composizione by reference

Avere o Essere sottotipi possono essere usati ogni volta che è richiesta la classe di base. Usare ereditarietà se è richiesto il polimorfismo Mai modificare il comportamento della classe di base per motivi indotti dalle sottoclassi concrete. In C++, lereditarietà pubblica segue il Principio di Liskov:

Ereditarietà e ri-uso del codice Attenzione! Lereditarietà può essere usata per evitare di riscrivere codice che esiste già in altre classi. Questo non è OO ed è da evitare! Laggregazione spesso risponde meglio a questa esigenza. Se il rapporto fra due oggetti è del tipo: –è allora si usa lereditarietà; –ha allora si usa laggregazione.

Avere o Essere Investor : è una Strategy o ha una Strategy StockMarket : è un vector o ha un vector Auto : ha 4 Ruote o è 4 volte una Ruota (impossiblie in C++, tipico in EIFFEL)

Composizione: by value o by reference Tipi sempici ( int, double, …): by value Parte dello stato di un oggetto: by value Un oggetto viene condiviso: by reference Allocato run time: by reference Usato polimorficamente: by reference

Design Avvicinare il modello ad oggetti dellanalisi ai concetti informatici Aggiunta di nuovi oggetti interni necessari per limplementazione Espressione delle operazioni identificate in fase di analisi in termini di algoritmi Suddivisione delle operazioni complesse in operazioni più semplici –da delegare ad altri oggetti Scelta delle strutture dati

Ciclo di Design Specify Semantics Specify Semantics Identify Objects and Classes Identify Objects and Classes Specify interfaces and implementation Specify interfaces and implementation Identify Relationships Identify Relationships

Iterazioni sul Design Dopo ogni ciclo bisogna analizzare i rischi, la stabilità e la complessità delle classi Se una classe è troppo complessa conviene dividerla Ad ogni ciclo il numero di modifiche deve diminuire Architetture troppo complesse devono essere modularizzate

Produzione Codifica, implementazione del modello Non sopravvalutare questa fase: richiede minore sforzo se le fasi precedenti sono fatte bene

Test Debugging: è ovvio… il codice non deve dare errori. Use cases: specificano il comportamento del sistema in una regione. Scenari: sono esempi concreti di use cases. Per definizione se tutti gli scenari sono soddisfatti correttamente il test è positivo.

Use Cases e Scenari Uno Use Case specifica alcuni dei comportamenti richiesti al sistema Uno Scenario è una realizzazione concreta di uno use case in una particolare circostanza –Scenari secondari possono essere usati per rappresentare una variazione di un tema di uno scenario principale (what if...)

Metodi di sviluppo del software Un metodo comprende: Una notazione mezzo comune per esprimere strategie e decisioni Un processo specifica come deve avvenire lo sviluppo

Metodi Object Oriented –Booch Method by Grady Booch –OMT by Jim Rumbaugh –Objectory (Use Cases) by Ivar Jacobson –CRC by R.Wirfs-Brock Di più recente introduzione: UML –uno standard OMG (Object Management Group), dal novembre 1997 Grady Booch Jim Rumbaugh Ivar Jacobson

Un esempio concreto Requisiti: –Realizzare una simulazione di un modello di mercato azionario. Diversi investitori si scambiano titoli su un mercato azionario. Gli investitori decidono se vendere o acquistare in base a proprie strategie. –Si vuole misurare landamento dei titoli sul mercato quali sono le strategie più redditizie

Possibili candidati classi Requisiti: –Realizzare una simulazione di un modello di mercato azionario. Diversi investitori si scambiano titoli su un mercato azionario. Gli investitori decidono se vendere o acquistare in base a proprie strategie. –Si vuole misurare landamento dei titoli sul mercato quali sono le strategie più redditizie

Identifichiamo classi e oggetti I primi candidati classi possono essere presi dal vocabolario del problema che stiamo analizzando. Esempio: –Investitore, Titolo, Ordine, Strategia

Analizziamo un paio di scenari Come decidere se vendere o acquistare un titolo Come gestire gli ordini sul mercato

Decidere se vendere o acquistare un titolo Acquisire informazioni sul titolo Analizzare le prestazioni del titolo –Guadagno, perdita, storia…. Analizzare i propri guadagni o le proprie perdite Decidere in base alla strategia –Quanto acquistare/vendere –A che prezzo piazzare lordine

Gestire gli ordini Controllare gli ordini relativi a ciascun titolo Verificare se ci sono ordini di vendita e di acquisto compatibili –Lofferta di vendita deve avere un prezzo minore o uguale a quello dellofferta di acquisto Eseguire gli ordini –Possibilità di esecuzione parziale degli ordini –Gli ordini possono terminare ineseguiti al termine di una validità massima

Identifichiamo alcune relazioni Un investitore –possiede una certa quantità di titoli –ha una certa strategia di acquisto

Relazioni della classe Order In ordine è relativo a un titolo Sa da chi investitore è stato immesso Può realizzare vendita o acquisto

Che significa acquistare o vendere Un investitore: –decide la quantità e il prezzo di azioni da vendere in base alla sua strategia –crea lordine relativo al titolo da acquistare/vendere Si riserva di non spendere il capitale che può servire per eseguire un acquisto (altrimenti va in rosso…!) Si riserva di non vendere azioni già impegnate in un ordine di vendita (venderebbe le stesse azioni due volte!) –Metterlo lordine sul mercato

Come viene emesso un ordine di acquisto

Definiamo le strategie Strategie di acquisto: –Compro se il titolo sta salendo Perché credo che continuerà a salire –Compro se il titolo è sceso Perché credo che poi risalirà –Compro a caso es.: simulo il caso in cui ho avuto notizie che mi hanno convinto –Compro altre azioni di un titolo che sta perdendo Così medio il prezzo di acquisto, e più facilmente posso recuperare Strategie di vendita: –Vendo se ho guadagnato Perché così realizzo il guadagno –Vendo per non perdere ulteriormente (Stop-loss) Così non perdo ulteriormente –Vendo a caso es.: simulo il caso in cui ho bisogno di soldi

Come sono organizzate le strategie Il modello è estendibile a nuove possibili strategie che posso definire in seguito

Strategie multiple Come gestire la possibilità di seguire più possibili strategie a seconda delle circostanze? Una strategia multipla è anchessa una strategia –Astrazione!

Strategie multiple Questo modello di relazione si chiama Composite Pattern. E comune a molte circostanze nelle quale è necessario un albero di oggetti compositi

Come vengono gestiti gli ordini

Come vengono sincronizzate le operazioni Per simulare ogni tornata di acquisti e vendite: – i diversi investitori devono seguire le proprie strategie e decidere gli ordini –il mercato deve gestire gli ordini

Gestione simulata del multitasking

Come funziona il multitasking

Definizione delle implementazioni #include "Task.h" #include class Stock; class BuyStrategy; class StockMarket; class Investor : public Task { public: Investor( double capital, StockMarket* ); ~Investor(); void setBuyStrategy( BuyStrategy * buy ); void doTask(); void print(); bool buy ( Stock*, double price, long amount ); bool sell( Stock*, double price, long amount ); void reserve( double ); void release( double ); void reserve( Stock *, long ); void release( Stock *, long ); long amountAvailable( Stock * ) const; private: double capital_; double reservedCapital_; StockMarket * market_; BuyStrategy * buyStrategy_; struct stockInfo { stockInfo() : buyPrice(0), amount(0), reserved(0) {} double buyPrice; long amount; long reserved; long available() const { return amount - reserved; } }; map portfolio_; double buyPrice( Stock * ) const; long amount( Stock * ) const; long amountAvailable( Stock * ) const; };

Implementazione metodi void Investor::doTask() { if ( market_ == 0 ) return; vector ::const_iterator s; for( s = market_->begin(); s != market_->end(); s++ ) { Stock * stock = *s; double buyPrice = Investor::buyPrice( stock ); long amountAvailable = Investor::amountAvailable( stock ); double capitalAvailable = capital_- reservedCapital_; long buyAmount = buyStrategy_->buy( stock, capitalAvailable, buyPrice, amountAvailable ); double price = buyStrategy_->price(); if ( buyAmount < 0 ) { // cout symbol() // << " at " << price << endl; market_->addSell( new SellOrder( this, stock, price, -buyAmount ) ); } else if ( buyAmount > 0 ) { // cout symbol() // << " at " << price << endl; market_->addBuy( new BuyOrder( this, stock, price, buyAmount ) ); } // print(); }

Mettere tutto insieme Istanziare i titoli e il mercato Istanziare gli investitori Assegnare le strategie –i parametri sono determinati in base a numeri pseudocasuali Connettere i diversi oggetti … far partire il multitasking!

Il main program (1) StockMarket nasdaq; Stock msft( "MSoft", 4.0); nasdaq.add( &msft ); msft.setPrice( 5.0 ); vector investors; const unsigned int numberOfInvestors = 200; for( int k = 0; k < numberOfInvestors; k++ ) investors.push_back( Investor( , &nasdaq ) ); const unsigned int initialBuyers = 100; for ( int j = 0; j < initialBuyers; j ++ ) { investors[j].buy( &msft, msft.price(), ); } vector ::iterator i for( i = investors.begin(); i != investors.end(); i++ ) i->print(); for( vector ::iterator i = investors.begin(); i != investors.end(); i++ ) { CompositeBuyStrategy * strategy = new CompositeBuyStrategy; strategy->add( new StopLossStrategy ( drand48()*0.30 ) ); strategy->add( new RandomBuyStrategy ( drand48()*0.15, drand48()*0.015, drand48()*0.48 ) ); strategy->add( new RandomSellStrategy ( drand48()*0.003, drand48()*0.015, drand48()*0.48 ) ); strategy->add( new SmartBuyStrategy ( 3, drand48()*0.020, drand48()*0.7 ) ); strategy->add( new SimpleBuyStrategy ( 1, drand48()*0.015, drand48()*0.7 ) ); strategy->add( new SimpleSellStrategy ( drand48()*0.20 ) ); i->setBuyStrategy( strategy ); }

Il main program (2) TaskManager manager; for( vector ::iterator i = investors.begin(); i != investors.end(); i++ ) manager.add( &*i ); manager.add( &nasdaq ); const unsigned int numberOfTasks = numberOfInvestors + 1; const unsigned int numberOfTransactions = 5000; const unsigned long iterations = (unsigned long)( numberOfTasks ) * (unsigned long)(numberOfTransactions); for( unsigned long i = 0; i < iterations ; i++ ) manager.doTask(); for( vector ::iterator i = investors.begin(); i != investors.end(); i++ ) i->print();

Risultati… speculazione crollo Tempo ( giorni?) Quotazione ($?, ?)