Programmazione orientata agli oggetti nel calcolo scientifico Luca Lista INFN Sezione di Napoli.
-
Upload
terenzio-franchi -
Category
Documents
-
view
217 -
download
0
Transcript of Programmazione orientata agli oggetti nel calcolo scientifico Luca Lista INFN Sezione di Napoli.
Programmazione Programmazione orientata agli oggettiorientata agli oggetti
nel calcolo scientificonel calcolo scientifico
Luca Lista
INFN Sezione di Napoli
Luca ListaPotenza, 16/5/2001
Meccanismo client - serverMeccanismo client - server
messaggiomessaggio
AzioneAzione
clientclient
serverserver
Luca ListaPotenza, 16/5/2001
OggettiOggetti che già conosciamo che già conosciamo
Bottoni
Menu
Hyperlink
• Messaggi:– Click– Doppio click– Seleziona– …
• Azioni:– apri documento– ...
Luca ListaPotenza, 16/5/2001
<A HREF=“ “ onMouseOveronMouseOver = “ foto.srcfoto.src = 'foto2.jpg' “ onMouseOutonMouseOut = “ foto.srcfoto.src = 'foto1.jpg' “ ><IMG NAME = "fotofoto" SRC = "foto1.jpg" BORDER=0 ></A>
<A HREF=“ “ onMouseOveronMouseOver = “ foto.srcfoto.src = 'foto2.jpg' “ onMouseOutonMouseOut = “ foto.srcfoto.src = 'foto1.jpg' “ ><IMG NAME = "fotofoto" SRC = "foto1.jpg" BORDER=0 ></A>
Esempio con JavaScriptEsempio con JavaScript
javascript.html
• Codice che gestisce i messaggi agli oggetti
oggettooggetto
Luca ListaPotenza, 16/5/2001
Cos’è un Cos’è un OggettoOggetto??
• 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 caratteristiche
e funzionalità”.
“Un oggetto è un’entità che si
possa immaginare dotata di
determinate caratteristiche
e funzionalità”.
Luca ListaPotenza, 16/5/2001
IncapsulamentoIncapsulamento
• 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 ListaPotenza, 16/5/2001
RappresentazioneRappresentazione di un oggetto di un oggetto
MessaggioMessaggio
Messaggio
Metodo
Metodo
MetodoAttributo
Attributo
Attributo
Luca ListaPotenza, 16/5/2001
Gli oggetti come modello naturaleGli 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
Interazioni tra diversi componenti
scambio di messaggi=
Luca ListaPotenza, 16/5/2001
Simulazione: un VideogiocoSimulazione: un Videogioco
AttributiAttributi
Luca ListaPotenza, 16/5/2001
Oggetti e Classi di OggettiOggetti e Classi di Oggetti
OrcoOrco CavaliereCavaliere
Classi
Istanze (Oggetti)
Luca ListaPotenza, 16/5/2001
Ereditarietà e SottoclassiEreditarietà e Sottoclassi
SoldatoSoldatoSoldatoSoldato
Luca ListaPotenza, 16/5/2001
• 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.
Esempio: i soldatiEsempio: i soldati
Luca ListaPotenza, 16/5/2001
Concetti base del software “OO”Concetti base del software “OO”
• Classi e oggetti
• Incapsulamento
• Relazione di ereditarietà
• Polimorfismo
Luca ListaPotenza, 16/5/2001
Classi astratte e polimorfismoClassi astratte e polimorfismo
• Diversi tipi di oggetti hanno comportamenti comuni che possono essere considerati in astratto:– disegna, sposta, ingrandisci, etc.
Luca ListaPotenza, 16/5/2001
Vantaggi del polimorfismoVantaggi del polimorfismo
• I messaggi comuni (sposta, ingrandisci, …) sono definiti in maniera astrattaastratta in nella classe di base forma
• Le sottoclassi li ereditanoereditano e li implementano in modo specifico• Il programma client ignora i dettagli di implementazione e
gestisce in modo omogeneo tutti i sottotipi di forma
Forma
sposta(x, y)ingrandisci(sx, sy)
Rettangolo
lato_xlato_y
Cerchio
raggiocentro_xcentro_y
Poligono
latonumero_laticentro_xcentro_y
Testo
testoposizione_xposizione_yfontdimensione_font
Client
ereditarietà
Luca ListaPotenza, 16/5/2001
Perché programmare aPerché programmare a oggetti oggetti??
• Programmare a 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 ListaPotenza, 16/5/2001
Vantaggi dei programmi a oggettiVantaggi 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 ListaPotenza, 16/5/2001
Difetti del software Difetti del software non mantenibilenon 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 ListaPotenza, 16/5/2001
Open/Closed principleOpen/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 ListaPotenza, 16/5/2001
Il Il ciclo di vitaciclo di vita del software del software
• Requirements• Analysis• Design• Production• Testing• Maintenance
Luca ListaPotenza, 16/5/2001
Evoluzione di un progetto softwareEvoluzione di un progetto software
Modello evolutivo
• Brevi cicli di sviluppo completi
• Scelte basate sulla valutazione dei rischi
• Integrazione continua
Modello a cascata
• Decomposizione completa del sistema dall’inizio
• Processo per singoli passi
• Integrazione alla fine
Un prodotto completo è disponibile solo alla fine
Un prototipo funzionante è disponibile sin dall’inizio
RequirementsRequirements
AnalysisAnalysis
DesignDesignProductionProduction
TestingTesting
Luca ListaPotenza, 16/5/2001
Metodi di programmazioneMetodi di programmazione
– Metodo Booch di Grady Booch
– OMT di 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
Grady Booch
Jim Rumbaugh
Ivar Jacobson
Luca ListaPotenza, 16/5/2001
Attributi e metodi, ereditarietàAttributi e metodi, ereditarietà
Plane
_distance : double_nor : Vector_origin : Point
distance()derDist()
Surface
id : int
distance()derDist()
Cylinder
Publici
Protetti
Metodi (funzioni)
Atributi (dati)Privati
Ereditarietà
Luca ListaPotenza, 16/5/2001
Relazioni di aggregazioneRelazioni di aggregazione
By reference (condivisa)• un autista guida più automobili
By value (possesso)• una automobile possiede il suo motore
Autista
Motore
Automobile
PointPolygone
1 1..*1..*1
-_pointsCardinalità• relazione uno a uno, uno a molti
Luca ListaPotenza, 16/5/2001
Relazione di dipendenzaRelazione di dipendenza
CDPlayer
play(CD& theCd)
CD
• Non c’è nessuna associazione• C’è comunque relazione di uso
Luca ListaPotenza, 16/5/2001
Software per fisica delle particelleSoftware per fisica delle particelle
Luca ListaPotenza, 16/5/2001
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
Kalman.incSUBROUTINE 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
Filter.f
Dati Dati globaliglobaliModello Modello deidei dati esplicito dati esplicito
SintassiSintassi oscura oscura
Tipo non controllatoTipo non controllato
Luca ListaPotenza, 16/5/2001
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;};
KalmanStep.hbool 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;}
KalmanStep.cc
Dati Dati incapsulatiincapsulatiModello dei dati nascostoModello dei dati nascosto
Sintassi “naturale”Sintassi “naturale”
Tipo datiTipo daticontrollatocontrollato
Lo stesso codice in versione a oggettiLo stesso codice in versione a oggetti
Luca ListaPotenza, 16/5/2001
Superfici e traiettorieSuperfici e traiettorie• Nei rivelatori di tracciamento è necessario calcolare intersezioni
tra curve (tracce) e superfici (elementi di rivelatore)
Line
SurfaceTrajectory
Helix
PolyLine
Plane Cylinder
Intersection
Luca ListaPotenza, 16/5/2001
Intersezione: implementazioneIntersezione: implementazione• Implementazione
dell’algoritmo#include “Intersection.h”#include <math.h>#include “Surface.h”#include “Trajectory.h”
const int maxIterations 20const double sMax 1.e+6const double accuracy1.e-3
double Intersection::sIntersect(double s1, double s2){ // algoritmo di Newton-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;
Intersection.cc
// 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; }
Point Intersection::intersect(double s1, double s2){ return trajectory_->position(sIntersect(s1, s2)); }
Luca ListaPotenza, 16/5/2001
Vantaggi del design a oggettiVantaggi 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
• Intersection continua a funzionare senza modificare una linea di codice!
• E’ possibile rendere anche intersect un metodo astratto...
Luca ListaPotenza, 16/5/2001
Software dell’esperimento BSoftware dell’esperimento BAABBARAR
Luca ListaPotenza, 16/5/2001
Il rivelatore di muoni di Il rivelatore di muoni di BBAABBARAR
• Identifica Muoni e adroni neutri (K0
L)• 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 ListaPotenza, 16/5/2001
Modello a oggettiModello 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.
stripstrip ““hit” : 1D-clusterhit” : 1D-cluster
clustercluster
clustercluster
Luca ListaPotenza, 16/5/2001
Modello a oggetti dei clusterModello 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:Ifr3DCluster: l’oggetto di base dei cluster planari. – Tutta l’informazione è contenuta in un singolo settore.
– La geometria viene trattata in coordinate locali
• IfrInner3DCluster:IfrInner3DCluster: La lettura stereo del rivelatore cilindrico richiede una clusterizzazione speciale per ridurre le intersezioni fittizie
• Ifr3DComposite:Ifr3DComposite: Un cluster fatto da segmenti in diversi settori. Le quantità misurate sono calcolate in modo ricorsivo
• IfrAbs3D:IfrAbs3D: Tutti i tipi di cluster implementano la stessa interfaccia astratta. L’utente finale non conosce i dettagli di implementazione!
Luca ListaPotenza, 16/5/2001
1
Ifr3DCluster IfrInner3DCluster
Ifr2DCluster
2
1
2
IfrAbs1D
2..4
1
2..4
1
1..*1 1..*1
IfrAbs3D
Ifr3DComposite
1
1..*
1
1..*
1
Ifr3DCluster IfrInner3DCluster
Ifr2DCluster
2
1
2
IfrAbs1D
2..4
1
2..4
1
1..*1 1..*1
IfrAbs3D
Ifr3DComposite
1
1..*
1
1..*
Diagramma a classiDiagramma a classi
Luca ListaPotenza, 16/5/2001
Esempio di codice in C++Esempio di codice in C++
IfrAbs3D* ifr; // prendi un cluster …
// calcola il numero di lunghezze di interazionedouble 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 layerint n[19];for (int layer = 1; layer <= 19; layer++) n[ layer-1 ] = ifr->accept( ifrVstInt(“hitsInLayer”, layer) );
Luca ListaPotenza, 16/5/2001
Diagramma del pattern “Diagramma del pattern “VisitorVisitor””
Ifr3DClusterIfr3DCluster
accept (IfrClusterVisitor<T>& v) : Taccept (IfrClusterVisitor<T>& v) : T
Ifr2DClusterIfr2DCluster
accept (IfrClusterVisitor<T>& v) : Taccept (IfrClusterVisitor<T>& v) : T
IfrAbs3DIfrAbs3D
accept (IfrClusterVisitor<T>&) : Taccept (IfrClusterVisitor<T>&) : T
Ifr3DCompositeIfr3DComposite
accept (IfrClusterVisitor<T>& v) : Taccept (IfrClusterVisitor<T>& v) : T
TT
IfrClusterVisitorIfrClusterVisitor
operate (const Ifr3DCluster*) : Toperate (const Ifr3DCluster*) : T
operate (const IfrInner3DCluster*) : Toperate (const IfrInner3DCluster*) : T
operate (const Ifr3DComposite*) : Toperate (const Ifr3DComposite*) : T
operate (const Ifr2DCluster*) : Toperate (const Ifr2DCluster*) : T
IfrInner3DClusterIfrInner3DCluster
accept (IfrClusterVisitor<T>& v) : Taccept (IfrClusterVisitor<T>& v) : T
{{
return v.operate( this ); return v.operate( this );}}
1..n1..n
IfrVstCenterOfGravityIfrVstCenterOfGravity
operate (const Ifr3DCluster*) : Hep3Vectoroperate (const Ifr3DCluster*) : Hep3Vector
operate (const IfrInner3DCluster*) : Hep3Vectoroperate (const IfrInner3DCluster*) : Hep3Vector
operate (const Ifr3DComposite*) : Hep3Vectoroperate (const Ifr3DComposite*) : Hep3Vector
operate (const Ifr2DCluster*) : Hep3Vectoroperate (const Ifr2DCluster*) : Hep3Vector
IfrClusterVisitor{Hep3Vector}IfrClusterVisitor{Hep3Vector}
22
Luca ListaPotenza, 16/5/2001
Il modello geometrico del rivelatoreIl modello geometrico del rivelatore
IfrBarrelSector
IfrPlanarSector
IfrBarrelView
IfrView
IfrBwdCapSector
IfrCylindricalSector
IfrDetLeaf
IfrEndCapView
IfrFecIteratorIfrFwdCapSector
IfrInnerSector
IfrInnerView
IfrLayer
IfrLayerIterator
IfrSectorIterator
IfrViewIterator
-_components
1..*
1
IfrDetComposite
1
#_parent
0..1-_component
0..1 1
1
IfrDetIterator
1
0..1
-_iterator
0..1
IfrSector IfrFecIfrDetector
IfrDetComponent
10..1
0..1 1
1..*
1
IfrGeomBase
IfrGeom
Luca ListaPotenza, 16/5/2001
Organizzazione e dipendenzeOrganizzazione e dipendenze
IfrVisitors
IfrData
IfrDataImp
External Clients
IfrClusterVisitor
IfrVstCenterOfGravityIfr3DCluster
IfrVst ...IfrInner3DCluster
Ifr2DCluster
IfrAbs3D
Ifr3DComposite
IfrVisitors
IfrData
IfrDataImp
External Clients
IfrClusterVisitor
IfrVstCenterOfGravityIfr3DCluster
IfrVst ...IfrInner3DCluster
Ifr2DCluster
IfrAbs3D
Ifr3DComposite
Classi astratte
Implementazioni concrete
Luca ListaPotenza, 16/5/2001
Linguaggi OO più usati nel calcolo scientificoLinguaggi 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 ListaPotenza, 16/5/2001
ConclusioniConclusioni
• 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 ListaPotenza, 16/5/2001
FineFine