Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Java. Programmazione orientata ad oggetti, Schemi e mappe concettuali di Informatica Giuridica

Informatica messina. Università degli studi di Messina Papardo Messina. Java

Tipologia: Schemi e mappe concettuali

2020/2021

Caricato il 01/11/2021

giohn-lafa
giohn-lafa 🇮🇹

2 documenti

1 / 8

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
PROGRAMMAZIONE 2/SISTEMI DI ELABORAZIONE Classi e oggetti Salvatore Distefano [email protected]
OOP
Il paradigma computazionale object oriented (OOP) nacque nel 1969 ad opera del norvegese Nygaard
simulazione del movimento delle navi nei fiordi
difficile simulare maree, movimenti delle navi, forme delle linee di costa con i tradizionali metodi di
programmazione
Pi5facile concepire gli elementi da modellare come oggetti dotati di dati e funzioni proprie 2
Programmazione orientata agli oggetti Concetto base : separare i dettagli secondari dell'implementazione
(ad esempio, la struttura dati impiegata) dalle proprietà fondamentali per un uso corretto (ad esempio, le
funzioni che possono avere accesso ai dati): ogni utilizzo della struttura dati così come le routine interne di
gestione avvengono attraverso un'interfaccia specifica sottostante. 3 Programmazione orientata agli oggetti
Ottimizzare la risoluzione di classi di problemi richiede la definizione di proprietà essenziali (criteri di
astrazione) che si devono implementare in una classe di problemi ben specificata (dominio del problema). 4
Programmazione orientata agli oggetti L’astrazione può essere effettuata a due livelli ASTRAZIONE SUI DATI
consiste nell'astrarre le entità (oggetti) costituenti il sistema, descritte in termini di una struttura dati e delle
operazioni possibili su di essa (encapsulation). ASTRAZIONE SUL CONTROLLO consiste nell'astrarre una data
funzionalità dai dettagli della sua implementazione (information hiding) 5 Programmazione orientata agli
oggetti Il concetto di tipo di dato in un linguaggio di programmazione tradizionale (procedurale) è quello di
insieme dei valori che può assumere una informazione (una variabile). Nella Programmazione ad oggetti, il
tipo di dati astratto (ADT) / oggetto estende questa definizione, includendo anche l'insieme di tutte e sole le
operazioni possibili su dati di quel tipo. La struttura dati è incapsulata nelle operazioni su di essa definite. 6
Programmazione orientata agli oggetti
OOP definisce un oggetto come qualsiasi cosa, reale o astratta, nella quale si possono immagazzinare dati
ed operazioni che li manipolano
Definiremo un oggetto come
una collezione di dati, detto suo stato, e
procedure in grado di alterare lo stato – Es.: ADT lista con i relativi operatori – Es.: calciatore (nome,
squadra, ruolo, posizione_in_campo, insegui_avversario, colpisci_palla, cambia_ruolo);
Gli oggetti comunicano fra loro tramite messaggi – un messaggio èla finestra con la quale un oggetto
interagisce con il mondo esterno 7 ADT: limiti
Poca Estensibilita’
Supponete di aver definito un ADT code: definire l’ADT code con priorita’ implica ridefinire TUTTE le
operazioni 8 Programmazione orientata agli oggetti
La programmazione ad oggetti consente di manipolare gruppi di variabili correlate e non singole variabili.
Le variabili vengono aggregate in oggetti.
pf3
pf4
pf5
pf8

Anteprima parziale del testo

Scarica Java. Programmazione orientata ad oggetti e più Schemi e mappe concettuali in PDF di Informatica Giuridica solo su Docsity!

PROGRAMMAZIONE 2/SISTEMI DI ELABORAZIONE Classi e oggetti Salvatore Distefano [email protected] OOP ■ Il paradigma computazionale object oriented (OOP) nacque nel 1969 ad opera del norvegese Nygaard ■ simulazione del movimento delle navi nei fiordi ■ difficile simulare maree, movimenti delle navi, forme delle linee di costa con i tradizionali metodi di programmazione ■ Piùfacile concepire gli elementi da modellare come oggetti dotati di dati e funzioni proprie 2 Programmazione orientata agli oggetti Concetto base : separare i dettagli secondari dell'implementazione (ad esempio, la struttura dati impiegata) dalle proprietà fondamentali per un uso corretto (ad esempio, le funzioni che possono avere accesso ai dati): ogni utilizzo della struttura dati così come le routine interne di gestione avvengono attraverso un'interfaccia specifica sottostante. 3 Programmazione orientata agli oggetti Ottimizzare la risoluzione di classi di problemi richiede la definizione di proprietà essenziali (criteri di astrazione) che si devono implementare in una classe di problemi ben specificata (dominio del problema). 4 Programmazione orientata agli oggetti L’astrazione può essere effettuata a due livelli ASTRAZIONE SUI DATI consiste nell'astrarre le entità (oggetti) costituenti il sistema, descritte in termini di una struttura dati e delle operazioni possibili su di essa (encapsulation). ASTRAZIONE SUL CONTROLLO consiste nell'astrarre una data funzionalità dai dettagli della sua implementazione (information hiding) 5 Programmazione orientata agli oggetti Il concetto di tipo di dato in un linguaggio di programmazione tradizionale (procedurale) è quello di insieme dei valori che può assumere una informazione (una variabile). Nella Programmazione ad oggetti, il tipo di dati astratto (ADT) / oggetto estende questa definizione, includendo anche l'insieme di tutte e sole le operazioni possibili su dati di quel tipo. La struttura dati è incapsulata nelle operazioni su di essa definite. 6 Programmazione orientata agli oggetti ■ OOP definisce un oggetto come qualsiasi cosa, reale o astratta, nella quale si possono immagazzinare dati ed operazioni che li manipolano ■ Definiremo un oggetto come ■ una collezione di dati, detto suo stato, e ■ procedure in grado di alterare lo stato – Es.: ADT lista con i relativi operatori – Es.: calciatore (nome, squadra, ruolo, posizione_in_campo, insegui_avversario, colpisci_palla, cambia_ruolo); ■ Gli oggetti comunicano fra loro tramite messaggi – un messaggio èla finestra con la quale un oggetto interagisce con il mondo esterno 7 ADT: limiti ■ Poca Estensibilita’ ■ Supponete di aver definito un ADT code: definire l’ADT code con priorita’ implica ridefinire TUTTE le operazioni 8 Programmazione orientata agli oggetti ■ La programmazione ad oggetti consente di manipolare gruppi di variabili correlate e non singole variabili. ■ Le variabili vengono aggregate in oggetti.

■ La programmazione ad oggetti si basa sull’incapsulamento delle variabili all’interno degli oggetti e sulla creazione di codice che descrive il comportamento interno ed esterno di tali oggetti. 9 Object-oriented programming ■ Source: Simula 67 language, Oslo, mid-sixties ■ Spread very slowly in the seventies ■ Smalltalk, developed at Xerox PARC in late seventies, made O-O hip by combining it with visual technologies ■ Spread quickly in 1990s through O-O languages like Objective C, C++, Eiffel, Java, C... ■ Dominant today Programmazione orientata agli oggetti ■ L’incapsulamento è la proprietà per cui la struttura interna dell’oggetto è nascosta agli altri oggetti. ■ La comunicazione tra oggetti avviene tramite l’invio di messaggi. L’implementazione dei messaggi avviene tramite le chiamate a funzioni dei metodi degli oggetti. ■ L’incapsulamento fa sì che le operazioni dell’oggetto non possano essere in nessun modo influenzate da altri oggetti. 11 Programmazione orientata agli oggetti ■ Un oggetto è rappresentato da variabili e da comportamenti assunti, ed ha un tipo (classe) ■ Una classe rappresenta l’astrazione di oggetti aventi le stesse caratteristiche nel dominio del problema da risolvere 12 Programmazione orientata agli oggetti Le caratteristiche che definiscono una classe sono: ■ gli attributi o dati membro, che sono le variabili associate ad una classe ■ i metodi o funzioni membro, che sono le procedure o servizi che la classe mette a disposizione Le classi definiscono gli ADT e da esse si istanziano (cioè si creano) gli oggetti 13 Programmazione orientata agli oggetti 1. Identificare le classi e gli oggetti che descrivono il problema e la soluzione 2. Identificare e descrivere i dati membro di ciascun oggetto 3. Identificare ciascun membro funzione/metodo che può agire su ciascun tipo di oggetto 4. Per ciascuna funzione membro / metodo, descrivere i suoi scopi, argomenti, pre-condizioni e post-condizioni 14 Programmazione orientata agli oggetti Un linguaggio di programmazione supporta tecniche basate sugli oggetti se offre meccanismi espliciti per la definizione di entità (oggetti) che incapsulano una struttura dati nelle operazioni possibili su di essa. 15 Programmazione Object Oriented ■ Individuare oggetti, entita’ con un proprio comportamento, rilevanti per la soluzione del problema ■ Selezionare le caratteristiche interessanti da esportare (interfaccia) ■ Controllo: scambio messaggi tra oggetti 16 Programmazione Object Oriented ■ Considerare le relazione tra oggetti ■ Specializzare il comportamento di oggetti ottenendone di piu’ specifici (raffinare l'analisi)

■ Un oggetto consiste di: – Stato nascosto (variabili di istanza) – Operazioni pubbliche (metodi) – Eventuali metodi ausiliari privati ■ Meccanismo computazionale – Scambio messaggi tra oggetti – Analogia tra invocazione di metodi e chiamate di funzione 24 Tipi di dato Un tipo di dato costituisce la rappresentazione concreta di un concetto. Es.: il tipo (predefinito) float, insieme alle operazioni +, -, * , /, rappresenta una versione limitata, ma concreta, del concetto matematico di numero reale. 25 Esempio: Punto 26 Esempio: Punto Colorato 27 Non viene ridefinito il codice per getX e move Ereditarieta e sottotipaggiò ■ Interfaccia – Insieme di messaggi a cui risponde un oggetto ■ Sottotipaggio (o sostituvita’) – Relazione di inclusione tra interfacce ■ Implementazione – Rappresentazione interna di un oggetto ■ Ereditarieta’ – Relazione tra implementazioni 28 Ereditarietà ■ L’ereditarietà è il meccanismo mediante il quale una classe acquisisce tutte le caratteristiche di un’altra classe definita in precedenza ■ La classe che eredita le caratteristiche è chiamata sottoclasse ■ La classe che fornisce le proprie caratteristiche viene chiamata superclasse ■ Una sottoclasse contiene tutto ciò che si trova nella sua superclasse ■ Una classe può ereditare le proprie caratteristiche da più superclassi (ereditarietà multipla) 29 Sostitutivita (Subtyping)̀ ■ Ogni funzione sui punti puo’ essere applicata ai punti colorati ■ L’interfaccia dei punti colorati contiene l’interfaccia dei punti ■ Il tipo PuntoColorato e’ sottotipo del tipo Punto ■ Interessa il Cliente delle classi 30 Sostitutività ■ Puo’ essere indipendente dall’ereditarieta’ – esempio: un algoritmo di ordinamento chiede che i dati da ordinare rispondano ad un metodo compare() ■ Permette (con l’ereditarietà) il riuso del codice, inducendo una forma di polimorfismo 31 Polimorfismo Il polimorfismo è la capacità che hanno oggetti di classi diverse (ma correlate per il fatto di derivare da una classe base comune) di rispondere in maniera diversa ad uno stesso messaggio. Oggetto il cui tipo sia descritto da una classe A può assumere valori di un qualunque tipo descritto da una classe B sottoclasse di A (polimorfismo per inclusione); Es.: se le classi rettangolo e quadrato derivano da quadrilatero, un oggetto rettangolo è una versione più specifica di un oggetto quadrilatero, e un quadrilatero puo’ assumere la forma di quadrato e rettangolo. Il calcolo del perimetro è un’operazione che ha senso sulla classe quadrilatero, ma che assume una forma diversa per un rettangolo. 32 Polimorfismo ■ Per polimorfismo si intende la proprietàdi una entitàdi assumere forme diverse nel tempo. ■ Una entitàèpolimorfa se puòfare riferimento, nel tempo, a classi diverse.

■ Siano ad esempio a, b due oggetti appartenenti rispettivamente alle classi A, B, che prevedono entrambe una operazione m, con diverse implementazioni. Si consideri a.m() richiama m definite in A, ma se successivamente l'assegnazione: a := b ■ L'esecuzione della operazione m sull'oggetto a.m() produce l'esecuzione della implementazione di m specificata per la classe B. 33 Polimorfismo: Esempio 34 Polimorfismo: Esempio function disegnaFigura() { CASE FiguraGeometrica.Tipo Case ‘Cerchio’ FiguraGeometrica.DisegnaCerchio() Case ‘Rettangolo’ FiguraGeometrica.DisegnaRettangolo() Case ‘Linea’ FiguraGeometrica.DisegnaLinea() END CASE } 35 Polimorfismo: Esempio ■ Con l’utilizzo del polimorfismo, il tutto si riconduce ad una semplice chiamata del tipo: function Disegna( { FiguraGeometrica.disegnaFigura() } 36 Polimorfismo: estensibilita e binding dinamicò ■ Il polimorfismo supporta dunque la proprietàdi estensibilitàdi un sistema, nel senso che minimizza la quantitàdi codice che occorre modificare quando si estende il sistema, cioèsi introducono nuove classi e nuove funzionalità. ■ Meccanismi con cui viene realizzato il polimorfismo sono quelli dell’overriding e del binding dinamico. ■ Il binding dinamico (o late binding) consiste nel determinare a tempo d'esecuzione, anzichéa tempo di compilazione, il corpo del metodo da invocare su un dato oggetto. 37 Dynamic (Method) Lookup ■ Il codice eseguito per effetto di un messaggio dipende dal ricevente – esempio: il metodo disegna() esegue codici diversi su tipi diversi ■ Un metodo puo’ essere ridefinito (overridden) o specializzato (overloaded) all’ interno della stessa gerarchia 38 Dynamic Method Lookup/Overloading ■ Operatori come “+” eseguono codici diversi su tipi diversi (int, real, string), sono overloaded ■ L’overloading viene risolto staticamente (compile time) mentre il dynamic lookup dinamicamente (run time) 39 Overriding vs. Overloading ■ Overloading si verifica quando due o più metodi in una classe o in sottoclassi hanno lo stesso nome di metodo ma diversi parametri. ■ Overriding significa avere due metodi con lo stesso nome e parametri (method signature). Uno dei metodi è nella classe genitore e l'altro è nella classe figlio. L'override consente a una classe figlia di fornire un'implementazione specifica di un metodo già implementato nella classe padre. 40 Overriding vs. Overloading ■ Il tipo reale di oggetto a runtime, non il tipo della variabile di riferimento, determina quale metodo sottoposto a override viene utilizzato in fase di esecuzione. ■ Al contrario, in fase di compilazione, il tipo di riferimento determina quale metodo overload verrà utilizzato. – polimorfismo dinamico overriding – polimorfismo statico overloading ■ Override è un concetto di run-time mentre l'overloading è un concetto compile time. 41 Object Oriented Programming ■ Metodologia di Programmazione – Organizzare concetti in oggetti e classi – Costruire sistemi etensibili

■ Permettere l’aggiornamento dei data member di quell’oggetto ■ Permettere che i data member di quell’oggetto siano testati in modi diversi ■ Visualizzare i data member di quell’oggetto 49 Funzioni membro ■ I membri protetti non sono accessibili direttamente, ma possono essere raggiunti indirettamente, tramite le funzioni-membro. ■ Queste funzioni possono essere, come ogni altro membro, pubbliche o protette, ma, in ogni caso, possono accedere a qualunque altro membro della classe, anche ai membri protetti. ■ Mentre una funzione-membro protetta può essere chiamata solo da un'altra funzione-membro, una funzione-membro pubblica può anche essere chiamata dall'esterno, e pertanto costituisce il tramite fra il programma e i membri della classe (interfaccia). 50 Dichiarazione di classe (esempio) class contatore { int val; //private per default public: void reset(); void incr(); void decr(); int visual(); }; Viene creata una classe di nome contatore costituita da : un intero di nome val e un insieme di operazioni (protocollo o interfaccia) che rappresentano che cosa può fare un oggetto di questa classe (azzerarsi, incrementarsi, decrementarsi, visualizzare il valore) 51 Dichiarazione di classe (esempio) class complesso { double re, im; public: void complesso (double r, double i) { re=r; im=i;}; double reale() { return re;}; double immag() { return im;}; }; Viene creata una classe di nome complesso costituita da una variabile reale ed una immaginaria e un insieme di operazioni (protocollo o interfaccia) che rappresentano che cosa può fare un oggetto di questa classe. E’ possibile mantenere distinta la definizione delle funzioni dalla loro dichiarazione all’interno della classe. 52 Dichiarazione di classe (esempio) class complesso { double re, im; public: void iniz_compl (double r, double i); double reale() ; double immag(); }; void complesso::iniz_compl (double r, double i) { re=r; im=i;} double complesso:: reale() { return re;}; double complesso:: immag() { return im;}; Il nome della funzione deve essere preceduto dal nome della classe e dall’operatore di risolutore d’ambito o di visibilità :: 53 Dichiarazione di classe (esempio) Se, ad esempio, si volesse cambiare la realizzazione del tipo, basterebbe cambiare la parte privata della classe e la realizzazione (ma non la dichiarazione) delle funzioni membro. Poiché l’interfaccia non è cambiata, i programmi che usano la classe complesso restano immutati 54 Operazioni predefinite sulle classi Oltre alla selezione di funzioni membro e di campi dato, esistono altre funzioni predefinite sugli oggetti classe: ■ inizializzazione ■ assegnazione ad un altro oggetto ■ uso come argomento di una funzione ■ ritorno da una funzione Le operazioni di confronto non sono definite per gli oggetti classe. 55 Dichiarazione di oggetti Una volta definita la classe, si possono istanziare un numero qualunque di oggetti e questi avranno la stessa rappresentazione concreta e potranno eseguire le sole operazioni descritte nella classe. Es: contatore c1,c2; definisce due oggetti/istanze di tipo contatore ognuno dei quali ha la propria copia di val e può eseguire solo le operazioni reset(), incr(), decr(), visual(). 56 Accesso ai membri di una classe Per usare un oggetto precedentemente definito, basta scrivere il suo nome seguito dall’operatore. e dall'operazione che deve eseguire: Es. c1.reset(); Questa istruzione ha il significato di invio del messaggio all'oggetto c1 di eseguire l'operazione reset() che nel nostro caso pone a zero il campo val dell'oggetto c1. 57 Costruttori e distruttori Gli oggetti si comportano come normali variabili rispetto alla visibilità ed al ciclo di vita. In presenza della dichiarazione: contatore c1; il compilatore costruirà un oggetto c1 il cui contenuto

in questo esempio è indefinito, non essendo stato inizializzato. Analogamente all'uscita dalla funzione in cui c1 è stato dichiarato, vi sarà la sua distruzione e ciò in perfetto accordo con il ciclo di vita delle variabili locali. In entrambi i casi, il compilatore invoca un costruttore ed un distruttore di default. 58 Costruttori I costruttori (funzioni membro pubbliche di ciascuna classe) devono sottostare alle seguenti regole (rif. all’esempio della classe CPoint): – devono avere lo stesso nome della classe Es: CPoint::CPoint(); – non bisogna specificare il tipo di ritorno (neanche void); – ammettono argomenti e defaults Es: CPoint::CPoint(const float a, const float b); – possono esistere più costruttori, in overload, in una stessa classe. C++ e Java li distinguono in base alla lista degli argomenti 59 Costruttori I costruttori sono eseguiti automaticamente nel momento in cui l'oggetto è dichiarato nel programma (per questo motivo i costruttori devono essere definiti pubblici). Es. : CPoint::CPoint() { x=3.5f ; y=2.1f } … CPoint p; Nel momento in cui è eseguita l'istruzione di cui sopra: p.x=3.5f e p.y=2.1f 60 Costruttori con argomenti Nel caso in cui un costruttore ammetta argomenti, i loro valori devono essere specificati nella stessa dichiarazione dell'oggetto: Es.: CPoint(const float a, const float b) { x=a ; y=b; } CPoint p = CPoint(3.0f,1.2f); Il costruttore entra in azione quando viene allocata la memoria per l'oggetto. Es: Cpoint* ptr; (il costruttore non è ancora eseguito) ptr = new CPoint; (adesso sì) 61 Costruttori Dichiarazione e inizializzazione possono coesistere in un'unica istruzione: Cpoint* ptr = new CPoint(0.0f,0.0f); – alloca memoria per un oggetto della classe CPoint, – ne restituisce l'indirizzo, – che usa per inizializzare il puntatore ptr, – e inizializza l'oggetto eseguendo il costruttore CPoint con gli argomenti fissati ai valori 0.0f e 0.0f 62 Utilità di costruttori e distruttori Ogni oggetto ha una sua precisa connotazione, caratterizzata da proprietà e metodi. I costruttori e i distruttori (entrambi funzioni membro pubbliche di ciascuna classe) hanno un campo di applicazione molto più vasto della semplice inizializzazione o rilascio di aree di memoria: possono servire ogni qual volta un oggetto richieda ben definite operazioni iniziali e finali, incapsulate nell’oggetto stesso. 63 Librerie di classi Quando, nella dichiarazione di una classe, si lasciano solo i prototipi dei metodi, si suole dire che viene creata un'intestazione di classe. E’ buona consuetudine creare librerie di classi, separando in due gruppi distinti: le intestazioni, distribuite in header-files, il codice delle funzioni, compilate separatamente e distribuite in librerie in formato binario; Ai programmatori che utilizzano le classi non interessa sapere come sono fatte le funzioni di accesso, ma solo come usarle: separazione tra il punto di vista di chi realizza la classe ed il punto di vista di chi usa la classe. 64 Esempio Librerie di classi File contator.h class contatore { int val; public: contatore(); contatore(int); ~contatore(); void reset(); void incr(); void decr(); int visual(); }; File contator.cpp #include"contator.h" contatore::contatore() {val=0;} contatore::contatore(int a) {val=a;} contatore::~contatore() {cout<<"distruttore"< #include"contator .h" main() { contatore c 1 ; contatore c 2 (12 ) ; c 1 .inc() ; c 2 .dec() ; cout<<"c 1="<<<<"c 2="<<