Title: Introduzione ai linguaggi compilati orientati ad oggetti
1Introduzione ai linguaggi compilati orientati
ad oggetti
- Alessandra Doria, Napoli
- Vincenzo Innocente, CERN
- Luca Lista, Napoli
2Programmazione procedurale
- Uno dei principali problemi del software è la sua
evoluzione e la sua manutenzione - specialmente in grossi progetti come un
esperimento di HEP - Esempi con linguaggi procedurali (Fortran)
- Cosa succede quando il codice viene modificato
- Dipendenze allinterno del codice
3Un esempio semplice
- Un esempio elegante copiare una sequenza di
caratteri dalla tastiera alla stampante
SUBROUTINE COPY LOGICAL READKB CHARACTER
C DO WHILE (READKB(C)) CALL
WRTPRN(C) ENDDO RETURN
- Questo codice dovrà prima o poi essere modificato
(aggiornamenti, estensioni, richieste dagli
utenti, ecc.)
4Modifiche dei requisiti
- Una modifica un po meno elegantescrivere anche
su un file
SUBROUTINE COPY(FLAG) LOGICAL READKB
INTEGER FLAG CHARACTER C DO
WHILE (READKB(C)) IF (FLAG .EQ. 1)
CALL WRTPRN(C) ELSE
CALL WRTFL(C) ENDIF ENDDO RETURN
5Evoluzione incontrollata
- Unaltra modifica per niente eleganteleggere
anche de un file
SUBROUTINE COPY(FLAG1, FLAG2) LOGICAL
READKB, READFL INTEGER FLAG1, FLAG2
LOGICAL CONT CHARACTER C 10
IF (FLAG1 .EQ. 1) THEN CONT
READKB(C) ELSE CONT READFL(C) ENDIF
IF (CONT) THEN IF (FLAG2 .EQ. 1) THEN
CALL WRTPRN(C) ELSE CALL
WRTFL(C) ENDIF GOTO 10 ENDIF RETURN
6Descrizione dei dati
- Esempio cinematica relativistica
Idea perché non usare una function?
COMMON /MYDATA/ P1(4), P2(4),
P3(4), P4(4) REAL P1(4), P2(4), P3(4), P4(4)
COSTHETA12 (P1(1)P2(1) P1(2)P2(2)
P1(3)P2(3))/... COSTHETA13
(P1(1)P3(1) P1(2)P3(2)
P1(3)P3(3))/... COSTHETA14 (P1(1)P4(1)
P1(2)P4(2) P1(3)P4(3))/...
FUNCTION COSTHETA(P1, P2) REAL P1(4),
P2(4) COSTHETA (P1(1)P2(1) P1(2)P2(2)
P1(3)P2(3))/... END
COMMON /MYDATA/ P1(4), P2(4),
P3(4), P4(4) REAL P1(4), P2(4),
P3(4), P4(4) COSTHETA12 COSTHETA(P1, P2)
COSTHETA13 COSTHETA(P1, P3) COSTHETA14
COSTHETA(P1, P4)
7Evoluzione del codice
- Se cambia il formato del common block?
COMMON /MYDATA/ P1(4), P2(4),
P3(4), P4(4)
COMMON /MYDATA/ P(4), E(4),
THETA(4), PHI(4)
- Bisogna cambiare la funzione (gli argomenti sono
diversi)
FUNCTION COSTHETA1(THETA1, THETA2,
PHI1, PHI2) COSTHETA1
SIN(THETA1)SIN(THETA2) COS(PHI1-PHI2)
COS(THETA1)COS(THETA2) END
COMMON /MYDATA/ P(4), E(4),
THETA(4), PHI(4) COSTHETA12
COSTHETA1(THETA(1),THETA(2),
PHI(1), PHI(2)) COSTHETA13
COSTHETA1(THETA(1),THETA(3),
PHI(1), PHI(3)) COSTHETA14
COSTHETA1(THETA(1),THETA(4),
PHI(1), PHI(4))
8Il concetto di dipendenza
- Nellesempio precedente il codice di analisi
(alto livello) dipende dai dettagli della
struttura dati (basso livello).
FUNCTION COSTHETA(P1, P2) REAL P1(4),
P2(4) COSTHETA (P1(1)P2(1) P1(2)P2(2)
P1(3)P2(3))/... END
COSTHETA dipende dalla struttura dei dati P1 e P2
COMMON /MYDATA/ P1(4), P2(4),
P3(4), P4(4) COSTHETA12 COSTHETA(P1,
P2) COSTHETA13 COSTHETA(P1, P3)
COSTHETA14 COSTHETA(P1, P4)
Il codice di analisi dipende dalla struttura del
common block MYDATA
9C/Object Oriented
- Riduce la dipendenza del codice di alto livello
dalla rappresentazione dei datiPermette il
riutilizzo del codice di alto livello - Nasconde i dettagli di implementazione
10Dati globali
Modello dei dati esplicito
Sintassi oscura
Tipo non controllato
11Tipo controllato o convertito
Sintassi naturale
Modello dei dati nascosto
Dati incapsulati
12Classi e oggetti
- Definizione di nuovi tipi (oltre a int, float,
double) come - numeri complessi,
- vettori,
- matrici, . . .
- ma anche
- tracce,
- superfici,
- elementi di rivelatori,
- cluster, . . .
- Gli oggetti permettono di modellare una problema
che rappresenti la realtà
13Concetti base dellOO
- Classi ed oggetti
- Incapsulamento
- Relazione di ereditarietà
- Polimorfismo
- Programmazione Generica (C)
14Classi e Oggetti
- Un esempio di programma orientato ad oggetti
un videogioco
15Soldato
Cliente
16FORTRAN vs C/C
- Sintassi F77 e C a confronto
In C/ C non è necessario un particolare formato
il codice
PROGRAM TESTC esempio di programma
... END
int main() // esempio di programma ...
return 0 // fine
spazi...
Il C/ C è case sensitive
Istruzioni separate da
INTEGER I INTEGER4 J REAL
X REAL8 D
int ilong jfloat xdouble d
17FORTRAN vs C/C
- Controllo di flusso del programma
DO I 1, 10 . . . ENDDO IF (I.EQ.10
.AND. J.GT.4 .OR. X) THEN . . . ENDIF DO
WHILE(X .NE. 5) . . . ENDDO
for ( i 1 i lt 10 i ) . . . if ( i
10 j gt 4 x ) . . . while( x ! 5
) . . .
18Puntatori
- Riferimento ad una locazione di memoria
int main() int j 12 return 0
int ptr j
include ltiostream.hgt cout ltlt ptr ltlt
endl
j 24 cout ltlt ptr ltlt endl
cout ltlt ptr ltlt endl
24
0x7b03a928
12
indirizzo di memoria
19Puntatori
include ltiostream.hgt int main() int j 12
int ptr 0 cout ltlt ptr ltlt endl // crash
! return 0
Segmentation violation (core dumped)
20Puntatori allocazione dinamica
- Riferimento ad una locazione di memoria
include ltiostream.hgt int main() int ptr
new int ptr 12 cout ltlt ptr ltlt endl
delete ptr return 0
- Attenzione
- Non usare delete fa accumulare locazioni di
memoria inutilizzate (memory leak) - Utilizzare puntatori prima del new o dopo il
delete causa il crash del programma
21Classi astratte
- Tutti oggetti nella finestra hanno comportamenti
comuni che possono essere considerati in
astratto - disegna, sposta, ingrandisci, etc.
22Cerchio
public Circle(Point2d center, double
radius) Circle() void moveAt(const
Point2d p) void moveBy(const Point2d p)
void scale(double s) void rotate(double phi)
void draw() const void cancel() const
class Circle
private Point2d center_ double
radius_
23 Quadrato
upperCorner
centerToUpperCorner_
loweCorner
24Codice Applicativo (Client)
Costruisce un vettore di puntatori a cerchi, crea
oggetti in memoria e salva i loro puntatori nel
vettore.
Itera sul vettore e invoca draw() per ogni
elemento
Come gestire cerchi e quadrati insieme?
25Polimorfismo
Tutte le Shapes hanno la stessa
interfaccia draw, pick, move, fillColor..., ma
ogni sottotipo diverso può avere la usa
personale implementazione
26Interfaccia astratta
Interfaccia di metodi puramente virtuali
27Ereditarietà e riuso del codice
Non si possono chiamare metodi virtuali in
costruttori e distruttori (troppo presto, troppo
tardi)
28Modello UML
29Programmazione generica
- Funzioni Generiche
- templateltclass Tgt
- inline T min(const T a, const T b)
- return a lt b ? ab
lt deve essere definito per T
Usa minltfloatgt
Usa minltPgt
30Programmazione generica
copy è una funzione generica di STL
Ritorna se stesso per permettere la
concatenazione di operatori
31La libreria standard std (STL)
- Contenitori generici
- vector, list, set, map, string
- Iteratori
- puntatori intelligenti nei contenitori generici
- Funzioni generiche
- copy, merge, find, sort, swap,
- agiscono su iteratori
32Un semplice vettore
33Un semplice vettore
...
0
1
2
9
34Vettore di classe astratta Shape
35Concetti Classici Riveduti
- Relazioni tra oggetti
- Decomposizione funzionale in una classe
- responsabilità dei metodi
- Decomposizione funzionale tra classi
- responsabilità delle classi
36Superfici e traiettorie
- Nel tracking spesso è necessario calcolare
intersezioni tra curve (tracce) e superfici
(elementi di detector)
37Superfici e traiettorie
- Interfaccia delle diverse Trajectory
38Superfici e traiettorie
39Superfici e traiettorie
- Interfaccia delle varie Surface
distanza (con segno) di un punto dalla superficie
40Superfici e traiettorie
- Surface è una classe astratta
41Superfici e traiettorie
- Interfaccia di Intersection
forward class declaration
42Superfici e traiettorie
- Implementazione dellalgoritmo
// controlla che test è tra s1 e s2 if(
(s1 - test) (test - s2) lt 0.0 ) if
( s1 lt s2 ) s abs( d ) else s
- abs( d ) if( s gt maxS s lt minS )
return sMax else s test
if( abs(d) lt accuracy ) return s
return sMax Point Intersectionintersect(dou
ble s1, double
s2) return trajectory_-gtposition(sInters
ect(s1, s2))
43Superfici e traiettorie
- Intersection usa solo
- I metodi position e direction di unoggetto
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 e Intersection continua a funzionare
senza modificare una linea di codice! - E possibile rendere anche Intersection
astratto...
44Open/Closed principle
- Un buon codice deve essere
- aperto ad estensioni
- chiuso a modifiche
- Modificare un codice funzionante può introdurre
bachi - LObject Oriented, con il meccanismo delle classi
virtuali, permette di applicare questo principio
45Disegno a oggettiModello di Hardware DAQ
- Costruiamo un modello del Hardware per un
sistema di acquisizione - Use Cases
- gestione delle parti (dove sono, a chi
appartengono) - simulazione (potenza dissipata, spazio occupato)
- controllo on-line (on/off, temperatura,
voltaggio) - DAQ (questi dati da dove vengono?)
- calibrazione (piedistalli, guadagni, fattori di
conversione)
46Chi sono i giocatori?
- I componenti Hardware
- Racks, crates, moduli di vario tipo e foggia
- Utenti (persone, displays, interfacce)
- conviene avere un corrispondente nel modello
- Primi candidati a classi e oggetti
47Un primo modello
48Calcolo della potenza in un rack
49La base di un modello composto
50Codice del modello composto
51Codice del modello composto
52Le classi concrete
53Aggiungiamo un inventario
54Dove si trova un componente?
- Dato un componente vogliamo sapere la sua
locazione globale - La risposta è una stringa che concatena le
locazioni locali (room, rack, crate, module) - Chi è responsabile della conoscenza della
locazione il componente o il composito? - Entrambe le soluzioni hanno pro e contro
- Una soluzione flessibile è assegnare la
locazione allassociazione di composizione
55Locazione di un componente
In C DaqComponent punterà a Location DaqComposi
te avrà un vettore di (puntatori a)
Locations Location (oltre ad un identificatore)
punterà a DaqComponent e DaqComposite Location
può essere una classe astratta e la
rappresentazione del suo identificare può così
dipendere dal tipo di composito (un intero per la
slot di un modulo in un crate, una stringa per la
posizione di un rack in una stanza)
56Stampa della locazione globale
Per ottenere una stringa che identifichi la
posizione globale, ogni componente prima invoca
la locazione del suo genitore e poi stampa la
propria locazione (delegando questultima
operazione a Location per essere indipendente
dalla rappresentazione concreta
dellidentificatore della locazione stessa)
57Conclusioni
- La programmazione C Object Oriented può
aiutare a ridurre le dipendenze allinterno del
codice e quindi lo sviluppo del programma ... - ma va utilizzato in maniera adeguata,
disegnando il codice prima di implementarlo - è facile scrivere un codice C traslitterando un
codice F77, ma questo non produce grandi
miglioramenti
58Fine