430 likes | 553 Views
Programmazione orientata agli oggetti nel calcolo scientifico. Luca Lista INFN Sezione di Napoli. Meccanismo client - server. server. client. messaggio. Azione. Oggetti che già conosciamo. Menu. Messaggi : Click Doppio click Seleziona … Azioni: apri documento. Bottoni.
E N D
Programmazione orientata agli oggettinel calcolo scientifico Luca Lista INFN Sezione di Napoli
Meccanismo client - server server client messaggio Azione Luca Lista
Oggetti che già conosciamo Menu • Messaggi: • Click • Doppio click • Seleziona • … • Azioni: • apri documento • ... Bottoni Hyperlink Luca Lista
Esempio con JavaScript Codice che gestisce i messaggi agli oggetti <A HREF=“ “ onMouseOver = “ foto.src = 'foto2.jpg' “ onMouseOut = “ foto.src = 'foto1.jpg' “ ><IMG NAME= "foto" SRC = "foto1.jpg" BORDER=0 ></A> oggetto javascript.html Luca Lista
Cos’è un Oggetto? • Definizione da vocabolario: • Il confinamento di informazioni e funzionalità in oggetti permette livelli maggiori di astrazione e semplifica la gestione di sistemi complessi. “Un oggetto è un’entità che si possa immaginare dotata di determinate caratteristichee funzionalità”. Luca Lista
Incapsulamento • Interfaccia • Definizione dei messaggi (metodi) possibili • Unico punto di accesso per l’utente all’oggetto • Implementazione • Realizzazione dell’azione corrispondente a un messaggio • Nascosta all’utente • Dichiarazione di variabili private (attributi) che definiscono lo stato dell’oggetto Luca Lista
Messaggio Metodo Messaggio Metodo Metodo Messaggio Rappresentazione di un oggetto Attributo Attributo Attributo Luca Lista
Gli oggetti come modello naturale • Gli oggetti nel software possono rappresentare entità del mondo reale • Il primo uso di linguaggi a oggetti è stato fatto per effettuare simulazioni Interazioni tra diversi componenti scambio di messaggi = Luca Lista
Simulazione: un Videogioco Luca Lista Attributi
Oggetti e Classi di Oggetti Classi Istanze (Oggetti) Orco Cavaliere Luca Lista
Ereditarietà e Sottoclassi Soldato Luca Lista
Esempio: i soldati • Tutti i soldati devono rispondere allo stesso messaggio:attacca! • Il messaggio determina azioni diverse a seconda del tipo di soldato: • Un arciere: lancia una freccia. • Un fante: usa la spada. • Un cavaliere: usa la lancia. • Il giocatore comanda tutti soldati allo stesso modo. Luca Lista
Concetti base del software “OO” • Classi e oggetti • Incapsulamento • Relazione di ereditarietà • Polimorfismo Luca Lista
Classi astratte e polimorfismo • Diversi tipi di oggetti hanno comportamenti comuni che possono essere considerati in astratto: • disegna, sposta, ingrandisci, etc. Luca Lista
Vantaggi del polimorfismo • I messaggi comuni (sposta, ingrandisci, …) sono definiti in maniera astratta in nella classe di base forma • Le sottoclassi li ereditano e li implementano in modo specifico • Il programma client ignora i dettagli di implementazione e gestisce in modo omogeneo tutti i sottotipi di forma ereditarietà Luca Lista
Perché programmare a oggetti? • Programmarea oggetti… • non velocizza l’esecuzione dei programmi… • non ottimizza l’uso della memoria... E allora perchè programmare a oggetti? • Programmare a oggetti facilita la progettazione, lo sviluppo e il mantenimento di sistemi software molto complessi! Luca Lista
Vantaggi dei programmi a oggetti • La programmazione ad oggetti consente di: • Ridurre la dipendenza del codice di alto livello dalla rappresentazione dei dati • l’accesso ai dati è mediato da un’interfaccia • Riutilizzare del codice di alto livello • definendo opportune classi astratte • Sviluppare moduli indipendenti l’uno dall’altro • I clienti che dipendono da interfacce che non dipendono dalla loro implementazione • Le dipendenze da classi astratte sonopiù “leggere” Luca Lista
Difetti del software non mantenibile • Rigidità • Non può essere cambiato con faciltà • Non può essere stimato l’impatto di una modifica • Fragilità • Una modifica singola causa una cascata di modifiche successive • I bachi sorgono in aree concettualmente separate dalle aree dove sono avvenute le modifiche • Non riusabilità • Esistono molte interdipendenze, quindi non è possibile estrarre parti che potrebbero essere comuni Luca Lista
Open/Closed principle • Un buon codice deve essere: • Aperto a estensioni • Le richieste di funzionalità del software sono in continua evoluzione • Chiuso a modifiche • Modificare un codice funzionante può introdurre bachi… • La programmazione a oggetti, con il meccanismo delle classi astratte, permette di applicare questo principio Luca Lista
Il ciclo di vita del software • Requirements • Analysis • Design • Production • Testing • Maintenance Luca Lista
Evoluzione di un progetto software Modello a cascata • Decomposizione completa del sistema dall’inizio • Processo per singoli passi • Integrazione alla fine Modello evolutivo • Brevi cicli di sviluppo completi • Scelte basate sulla valutazione dei rischi • Integrazione continua Un prodotto completo è disponibile solo alla fine Un prototipo funzionante è disponibile sin dall’inizio Requirements Analysis Testing Design Production Luca Lista
Grady Booch Jim Rumbaugh Ivar Jacobson Metodi di programmazione • Metodo Booch di Grady Booch • OMTdi Jim Rumbaugh • Objectory (Use Cases) di Ivar Jacobson • CRC di Rebecca Wirfs-Brock • Notazione standard: UML • uno standard OMG (Object Management Group), dal novembre 1997 Luca Lista
Attributi e metodi, ereditarietà Privati Atributi (dati) Publici Metodi (funzioni) Ereditarietà Protetti Luca Lista
Relazioni di aggregazione By reference (condivisa) • un autista guida più automobili By value (possesso) • una automobile possiede il suo motore Cardinalità • relazione uno a uno, uno a molti Luca Lista
Relazione di dipendenza • Non c’è nessuna associazione • C’è comunque relazione di uso Luca Lista
Software per fisica delle particelle Luca Lista
Kalman.inc Filter.f PARAMETER (NPLAN = 8, + NSTOP = NPLAN-1, + NSTOP5 = 5*NPLAN ) COMMON /GCFIT/ + CSIX(6,0:NSTOP),CSIY(6,0:NSTOP) + ,CSIZ(6,0:NSTOP) + ,WW(5,5,0:NSTOP),DDT(5,5,0:NSTOP) + ,VV(5,5,0:NSTOP),SS(5,5,0:NSTOP) + ,CC(5,5,0:NSTOP) + ,CHI2,CHI2N,CHI2T,CHI2M + ,PLANI(3,4,0:NSTOP) DOUBLE PRECISION + CSIX ,CSIY ,CSIZ + ,WW ,DDT + ,VV ,SS + ,CC + ,CHI2,CHI2N,CHI2T,CHI2M SUBROUTINE FILTER(JSTOP,IFAIL) INTEGER JSTOP, IFAIL #include “Kalman.inc” DOUBLE PRECISION YDUM(5) * ** filter * CALL DVADD(25,WW(1,1,JSTOP),WW(2,1,JSTOP), + VV(1,1,JSTOP),VV(2,1,JSTOP), + CC(1,1,JSTOP),CC(2,1,JSTOP)) CALL DSINV(5,CC(1,1,JSTOP),5,IFAIL) IF ( IFAIL.NE.0 ) THEN PRINT *,'DSINV IFAIL',IFAIL,' AT PLANE ',JSTOP CALL VZERO(CC(1,1,JSTOP),50) RETURN ENDIF CALL DMMPY(5,5,VV(1,1,JSTOP),VV(1,2,JSTOP),VV(2,1,JSTOP), + CSIZ(1,JSTOP),CSIZ(2,JSTOP), + YDUM(1), YDUM(2)) CALL DMMPA(5,5,WW(1,1,JSTOP),WW(1,2,JSTOP),WW(2,1,JSTOP), + CSIY(1,JSTOP),CSIY(2,JSTOP), + YDUM(1), YDUM(2)) CALL DMMPY(5,5,CC(1,1,JSTOP),CC(1,2,JSTOP),CC(2,1,JSTOP), + YDUM(1), YDUM(2), + CSIX(1,JSTOP),CSIX(2,JSTOP)) CSIX(6,JSTOP) = CSIY(6,JSTOP) * CHI2 DO J = 1,5 DO K=1,5 CHI2 = CHI2 + + (CSIX(K,JSTOP)-CSIZ(K,JSTOP))*VV(K,J,JSTOP)* + (CSIX(J,JSTOP)-CSIZ(J,JSTOP)) + + (CSIX(K,JSTOP)-CSIY(K,JSTOP))*WW(K,J,JSTOP)* + (CSIX(J,JSTOP)-CSIY(J,JSTOP)) ENDDO ENDDO * END Dati globali Modello dei dati esplicito Sintassi oscura Tipo non controllato Luca Lista
KalmanStep.h KalmanStep.cc class KalmanStep { public: bool propagate(const KalmanStep& previous); bool filter() ; bool smooth(const KalmanStep& next); private: Vector5 csix; SimMatrix5 cc, ss, ww, vv; Vector5 csiy, csiz; Matrix5 ddt; Plane plane; double chi2; }; bool KalmanStep::filter() { bool fail = false; cc = ww+vv; cc.invert(fail); if (fail) { cc.zero(); return false;} csix = cc*(vv*csiz + ww*csiy); chi2 += (csix–csiz)*vv*(csix–csiz)+ (csix–csiy)*ww*(csix–csiy); return !fail; } Lo stesso codice in versione a oggetti Tipo daticontrollato Sintassi “naturale” Dati incapsulati Modello dei dati nascosto Luca Lista
Superfici e traiettorie • Nei rivelatori di tracciamento è necessario calcolare intersezioni tra curve (tracce) e superfici (elementi di rivelatore) Luca Lista
Intersection.cc #include “Intersection.h” #include <math.h>#include “Surface.h”#include “Trajectory.h” const int maxIterations 20 const double sMax 1.e+6 const double accuracy1.e-3 double Intersection::sIntersect(double s1, double s2) { // algoritmo diNewton-Raphson double s = s1; double maxS = max(s1, s2); double minS = min(s1, s2); double d, delta; for( int j = 0; j < maxIterations; j++ ) { Point p = _trajectory->position( s ); d = surface_->distance( p ); delta = surface_->derDist( p, trajectory_->direction( s ) ); double ds = - d / delta; double test = s + ds; Intersezione: implementazione • Implementazione dell’algoritmo // controlla che test è tra s1 e s2 if( (s1 - test) * (test - s2) < 0.0 ) { if ( s1 < s2 ) s += abs( d ); else s -= abs( d ); if( s > maxS || s < minS ) return sMax; } else s = test; if( abs(d) < accuracy ) return s; } return sMax; } PointIntersection::intersect(double s1, double s2) { return trajectory_->position(sIntersect(s1, s2)); } Luca Lista
Vantaggi del design a oggetti • Intersection usa solo: • I metodi position e direction di un’oggetto Trajectory. • I metodi distance e derDist di un oggetto Surface. • E’ possibile aggiungere una nuova classe che modellizza una nuova Trajectory o una nuova Surface • Intersectioncontinua a funzionare senza modificare una linea di codice! • E’ possibile rendere anche intersectun metodo astratto... Luca Lista
Software dell’esperimento BABAR Luca Lista
Il rivelatore di muoni di BABAR • Identifica Muoni e adroni neutri (K0L) • Rivelatore planare: • 19 o 18 piani di camere per settore • 65 (60) cm di ferro • Rivelatore interno • 2 livelli di rivelatori cilindrici • Il segnale del rivelatore consiste nell’insieme delle strip che hanno prodotto un segnale rivelabile Luca Lista
mcluster pcluster Modello a oggetti • Gli oggetti incapsulano il comportamento di: • informazioni della ricostruzione (strip, hit, cluster,…) • il modello geometrico del rivelatore (sector, layer, …) • strategie e algoritmi (clusterizer, …) • ecc. strip “hit” : 1D-cluster Luca Lista
Modello a oggetti dei cluster • Il rivelatore è segmentato in settori • 6 settori nella regione centrale • 3 settori in ciascuna delle 4 porte • 4 settori in per il rivelatore cilindrico interno • Ifr3DCluster:l’oggetto di base dei cluster planari. • Tutta l’informazione è contenuta in un singolo settore. • La geometria viene trattata in coordinate locali • IfrInner3DCluster:La lettura stereo del rivelatore cilindrico richiede una clusterizzazione speciale per ridurre le intersezioni fittizie • Ifr3DComposite:Un cluster fatto da segmenti in diversi settori. Le quantità misurate sono calcolate in modo ricorsivo • IfrAbs3D:Tutti i tipi di cluster implementano la stessa interfaccia astratta. L’utente finale non conosce i dettagli di implementazione! Luca Lista
Diagramma a classi Luca Lista
Esempio di codice in C++ IfrAbs3D* ifr; // prendi un cluster … // calcola il numero di lunghezze di interazione double l = ifr->accept( ifrVstDouble(“interactionLengths”) ); // calcola il centro di gravita’ HepPoint c = ifr->accept( ifrVstPoint(“centerOfgravity”) ); // ha hit nel barrel? bool barrel = ifr->accept(ifrVstHasBool(“hasBarrel”) ); // calcola il numero di hit in ciascun layer int n[19]; for (int layer = 1; layer <= 19; layer++) n[ layer-1 ] = ifr->accept( ifrVstInt(“hitsInLayer”, layer) ); Luca Lista
T 1..n IfrAbs3D IfrClusterVisitor accept (IfrClusterVisitor<T>&) : T operate (const Ifr3DCluster*) : T operate (const IfrInner3DCluster*) : T operate (const Ifr3DComposite*) : T operate (const Ifr2DCluster*) : T Ifr3DComposite accept (IfrClusterVisitor<T>& v) : T IfrClusterVisitor{Hep3Vector} IfrInner3DCluster accept (IfrClusterVisitor<T>& v) : T Ifr3DCluster accept (IfrClusterVisitor<T>& v) : T 2 Ifr2DCluster accept (IfrClusterVisitor<T>& v) : T IfrVstCenterOfGravity operate (const Ifr3DCluster*) : Hep3Vector { operate (const IfrInner3DCluster*) : Hep3Vector return v.operate( this ); operate (const Ifr3DComposite*) : Hep3Vector } operate (const Ifr2DCluster*) : Hep3Vector Diagramma del pattern “Visitor” Luca Lista
Il modello geometrico del rivelatore -_iterator #_parent -_component 0..1 0..1 1 1 1 1 1..* 1..* IfrDetComponent IfrDetIterator -_components 0..1 0..1 1 1 0..1 0..1 IfrDetLeaf IfrDetComposite 1 1 IfrDetector IfrSector IfrLayer IfrView IfrFec IfrSectorIterator IfrPlanarSector IfrCylindricalSector IfrLayerIterator IfrViewIterator IfrBarrelSector IfrFwdCapSector IfrBarrelView IfrInnerView IfrFecIterator IfrBwdCapSector IfrInnerSector IfrEndCapView Luca Lista
Organizzazione e dipendenze Classi astratte Implementazioni concrete Luca Lista
Linguaggi OO più usati nel calcolo scientifico • C++ • Utilizzato per applicazioni su larga scala • Comprende anche la programmazione generica (Templates) • Standard C++ Library (STL) disponibile • Java • Programmazione di Applet “portabili” • Utilizzato per il web • Le Applet sono incapsulabili in HTML • Librerie grafiche native • JavaScrips • Usato per sviluppare pagine HTML “dinamiche” • Gli oggetti sono i componenti della pagina web • Link • Immagini • Finestre • ecc. Luca Lista
Conclusioni • La programmazione a oggetti può aiutare a ridurre le dipendenze all’interno del codice e quindi lo sviluppo del programma ... • … ma va utilizzato in maniera adeguata, progettando il codice prima di implementarlo. • Attenzione:è facile scrivere un codice C++ traslitterando un codice F77, ma questo non produce grandi vantaggi! Luca Lista
Fine Luca Lista