Programmazione
orientata agli oggetti
nel calcolo scientifico
Luca Lista
INFN Sezione di Napoli
Meccanismo client - server
server
client
messaggio
Azione
Potenza, 16/5/2001
Luca Lista
Oggetti che già conosciamo
Menu
Bottoni
Hyperlink
•
•
Messaggi:
– Click
– Doppio click
– Seleziona
– …
Azioni:
– apri documento
– ...
Potenza, 16/5/2001
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"
oggetto
BORDER=0
></A>
javascript.html
Potenza, 16/5/2001
Luca Lista
Cos’è un Oggetto?
• Definizione da vocabolario:
“Un oggetto è un’entità che si
possa immaginare dotata di
determinate caratteristiche
e funzionalità”.
• Il confinamento di informazioni e funzionalità in
oggetti permette livelli maggiori di astrazione e
semplifica la gestione di sistemi complessi.
Potenza, 16/5/2001
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
Potenza, 16/5/2001
Luca Lista
Rappresentazione di un oggetto
Attributo
Attributo
Attributo
Potenza, 16/5/2001
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
Potenza, 16/5/2001
Luca Lista
Simulazione: un Videogioco
Potenza, 16/5/2001
Attributi
Luca Lista
Oggetti e Classi di Oggetti
Classi
Istanze (Oggetti)
Orco
Potenza, 16/5/2001
Cavaliere
Luca Lista
Ereditarietà e Sottoclassi
Soldato
Potenza, 16/5/2001
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.
Potenza, 16/5/2001
Luca Lista
Concetti base del software “OO”
•
•
•
•
Classi e oggetti
Incapsulamento
Relazione di ereditarietà
Polimorfismo
Potenza, 16/5/2001
Luca Lista
Classi astratte e polimorfismo
• Diversi tipi di oggetti hanno comportamenti comuni che
possono essere considerati in astratto:
– disegna, sposta, ingrandisci, etc.
Potenza, 16/5/2001
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à
Potenza, 16/5/2001
Luca Lista
Perché programmare a 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!
Potenza, 16/5/2001
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 sono
più “leggere”
Potenza, 16/5/2001
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
Potenza, 16/5/2001
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
Potenza, 16/5/2001
Luca Lista
Il ciclo di vita del software
•
•
•
•
•
•
Requirements
Analysis
Design
Production
Testing
Maintenance
Potenza, 16/5/2001
Luca Lista
Evoluzione di un progetto software
Modello a cascata
Modello evolutivo
•
•
•
•
•
Decomposizione completa del
sistema dall’inizio
Processo per singoli passi
Integrazione alla fine
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
Production
Potenza, 16/5/2001
Luca Lista
Design
Metodi di programmazione
– Metodo Booch
di Grady Booch
– OMT
di Jim Rumbaugh
– Objectory (Use Cases)
di Ivar Jacobson
– CRC
di Rebecca Wirfs-Brock
Grady Booch
Jim Rumbaugh
• Notazione standard: UML
– uno standard OMG (Object
Management Group),
dal novembre 1997
Potenza, 16/5/2001
Luca Lista
Ivar Jacobson
Attributi e metodi, ereditarietà
Privati
Atributi (dati)
Publici
Metodi (funzioni)
Ereditarietà
Protetti
Potenza, 16/5/2001
Luca Lista
Relazioni di aggregazione
Autista
By reference (condivisa)
• un autista guida più automobili
Automobile
By value (possesso)
• una automobile possiede
il suo motore
Motore
-_points
Polygone
1
Potenza, 16/5/2001
1..*
Point
Cardinalità
• relazione uno a uno,
uno a molti
Luca Lista
Relazione di dipendenza
• Non c’è nessuna associazione
• C’è comunque relazione di uso
Potenza, 16/5/2001
Luca Lista
Software per fisica delle particelle
Potenza, 16/5/2001
Luca Lista
Kalman.inc
+
+
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
Dati globali
Modello dei dati esplicito
Sintassi oscura
Tipo non controllato
Potenza, 16/5/2001
Filter.f
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
Luca Lista
Lo stesso codice in versione a oggetti
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;
bool KalmanStep::filter()
Tipo dati
{
controllato
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;
}
Vector5 csiy, csiz;
Matrix5 ddt;
Plane plane;
double chi2;
Sintassi “naturale”
};
Dati incapsulati
Modello dei dati nascosto
Potenza, 16/5/2001
Luca Lista
Superfici e traiettorie
• Nei rivelatori di tracciamento è necessario calcolare intersezioni
tra curve (tracce) e superfici (elementi di rivelatore)
Intersection
Trajectory
Surface
Line
Plane
PolyLine
Cylinder
Helix
Potenza, 16/5/2001
Luca Lista
Intersezione: implementazione
Intersection.cc
#include
#include
#include
#include
“Intersection.h”
<math.h>
“Surface.h”
“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 di Newton-Raphson
double s = s1;
double maxS = max(s1, s2);
double minS = min(s1, s2);
• 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;
double d, delta;
}
for( int j = 0; j < maxIterations; j++ )
{
Point Intersection::intersect(double s1,
Point p = _trajectory->position( s );
double s2)
d = surface_->distance( p );
{
delta = surface_->derDist( p,
return
trajectory_->direction( s ) );
trajectory_->position(sIntersect(s1, s2));
double ds = - d / delta;
}
double test = s + ds;
Potenza, 16/5/2001
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
• Intersection continua a funzionare senza
modificare una linea di codice!
• E’ possibile rendere anche intersect
un metodo astratto...
Potenza, 16/5/2001
Luca Lista
Software dell’esperimento BABAR
Potenza, 16/5/2001
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
Potenza, 16/5/2001
Luca Lista
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.
m cluster
strip
“hit” : 1D-cluster
p cluster
Potenza, 16/5/2001
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!
Potenza, 16/5/2001
Luca Lista
Diagramma a classi
1..*
IfrAbs3D
1
Ifr3DCluster
IfrInner3DCluster
1
1
2..4
2
Ifr2DCluster
Potenza, 16/5/2001
1
1..*
IfrAbs1D
Luca Lista
Ifr3DComposite
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) );
Potenza, 16/5/2001
Luca Lista
Diagramma del pattern “Visitor”
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
operate (const Ifr3DComposite*) : Hep3Vector
operate (const Ifr2DCluster*) : Hep3Vector
{
return v.operate( this );
}
Potenza, 16/5/2001
Luca Lista
Il modello geometrico del rivelatore
-_iterator
#_parent
-_component
0..1
1..*
IfrGeomBase
1
1
IfrDetComponent
-_components
IfrDetIterator
0..1
1
0..1
IfrDetLeaf
IfrDetComposite
1
IfrDetector
IfrGeom
IfrSector
IfrPlanarSector
IfrLayer
IfrView
IfrFec
IfrSectorIterator
IfrCylindricalSector
IfrLayerIterator
IfrViewIterator
IfrBarrelSector
IfrFwdCapSector
IfrBarrelView
IfrInnerView
IfrFecIterator
IfrBwdCapSector
Potenza, 16/5/2001
IfrInnerSector
Luca Lista
IfrEndCapView
Organizzazione e dipendenze
IfrData
Classi astratte
External Clients
IfrAbs3D
IfrClusterVisitor
Implementazioni concrete
IfrDataImp
IfrVisitors
Ifr3DCluster
Ifr3DComposite
IfrVstCenterOfGravity
Ifr2DCluster
IfrVst ...
IfrInner3DCluster
Potenza, 16/5/2001
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
•
•
•
•
Potenza, 16/5/2001
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!
Potenza, 16/5/2001
Luca Lista
Fine
Potenza, 16/5/2001
Luca Lista
Scarica

Luca Lista - INFN Sezione di Napoli