Introduzione ai linguaggi compilati orientati ad oggetti - PowerPoint PPT Presentation

About This Presentation
Title:

Introduzione ai linguaggi compilati orientati ad oggetti

Description:

Title: Nessun titolo diapositiva Author: lista Last modified by: Vincenzo Innocente Created Date: 10/20/1997 9:09:35 AM Document presentation format – PowerPoint PPT presentation

Number of Views:89
Avg rating:3.0/5.0
Slides: 59
Provided by: list79
Category:

less

Transcript and Presenter's Notes

Title: Introduzione ai linguaggi compilati orientati ad oggetti


1
Introduzione ai linguaggi compilati orientati
ad oggetti
  • Alessandra Doria, Napoli
  • Vincenzo Innocente, CERN
  • Luca Lista, Napoli

2
Programmazione 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

3
Un 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.)

4
Modifiche 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
5
Evoluzione 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
6
Descrizione 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)
7
Evoluzione 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))
  • e il codice!

8
Il 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
9
C/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

10
Dati globali
Modello dei dati esplicito
Sintassi oscura
Tipo non controllato
11
Tipo controllato o convertito
Sintassi naturale
Modello dei dati nascosto
Dati incapsulati
12
Classi 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à

13
Concetti base dellOO
  • Classi ed oggetti
  • Incapsulamento
  • Relazione di ereditarietà
  • Polimorfismo
  • Programmazione Generica (C)

14
Classi e Oggetti
  • Un esempio di programma orientato ad oggetti
    un videogioco

15
Soldato
Cliente
16
FORTRAN 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
17
FORTRAN 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
) . . .
18
Puntatori
  • 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
19
Puntatori
  • Puntatore nullo

include ltiostream.hgt int main() int j 12
int ptr 0 cout ltlt ptr ltlt endl // crash
! return 0
Segmentation violation (core dumped)
20
Puntatori 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

21
Classi astratte
  • Esempio classico Shape
  • Tutti oggetti nella finestra hanno comportamenti
    comuni che possono essere considerati in
    astratto
  • disegna, sposta, ingrandisci, etc.

22
Cerchio
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
24
Codice 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?
25
Polimorfismo
Tutte le Shapes hanno la stessa
interfaccia draw, pick, move, fillColor..., ma
ogni sottotipo diverso può avere la usa
personale implementazione
26
Interfaccia astratta
Interfaccia di metodi puramente virtuali
27
Ereditarietà e riuso del codice
Non si possono chiamare metodi virtuali in
costruttori e distruttori (troppo presto, troppo
tardi)
28
Modello UML
29
Programmazione 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
30
Programmazione generica
  • Classi Generiche

copy è una funzione generica di STL
Ritorna se stesso per permettere la
concatenazione di operatori
31
La 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

32
Un semplice vettore
33
Un semplice vettore
...
0
1
2
9
34
Vettore di classe astratta Shape
35
Concetti Classici Riveduti
  • Relazioni tra oggetti
  • Decomposizione funzionale in una classe
  • responsabilità dei metodi
  • Decomposizione funzionale tra classi
  • responsabilità delle classi

36
Superfici e traiettorie
  • Nel tracking spesso è necessario calcolare
    intersezioni tra curve (tracce) e superfici
    (elementi di detector)

37
Superfici e traiettorie
  • Interfaccia delle diverse Trajectory

38
Superfici e traiettorie
  • Implementazione

39
Superfici e traiettorie
  • Interfaccia delle varie Surface

distanza (con segno) di un punto dalla superficie
40
Superfici e traiettorie
  • Surface è una classe astratta

41
Superfici e traiettorie
  • Interfaccia di Intersection

forward class declaration
42
Superfici 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))
43
Superfici 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...

44
Open/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

45
Disegno 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)

46
Chi 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

47
Un primo modello
48
Calcolo della potenza in un rack
49
La base di un modello composto
50
Codice del modello composto
51
Codice del modello composto
52
Le classi concrete
53
Aggiungiamo un inventario
54
Dove 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

55
Locazione 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)
56
Stampa 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)
57
Conclusioni
  • 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

58
Fine
Write a Comment
User Comments (0)
About PowerShow.com