12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)



Documenti analoghi
13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

10 - Programmare con gli Array

15 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

14 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Funzioni in C. Violetta Lonati

Esercizi sulla definizione di classi (Fondamenti di Informatica 1 Walter Didimo) Soluzioni

Algoritmi di Ricerca. Esempi di programmi Java

Inizializzazione, Assegnamento e Distruzione di Classi

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Primo scritto 11 Gennaio 2008

Concetto di Funzione e Procedura METODI in Java

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Object Oriented Software Design

Java: Compilatore e Interprete

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a giugno 2013

Object Oriented Programming


Prossime lezioni. Dai TDA agli oggetti. Riassunto. Riassunto TDA. Oggi. Stefano Mizzaro 1

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Le variabili. Olga Scotti

Introduzione a Classi e Oggetti

esercizi Esercizi / problemi

Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a luglio 2013

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

Oggetti Lezione 3. aspetti generali e definizione di classi I

Modulo 4: Ereditarietà, interfacce e clonazione

Corso di Informatica

Sequenza alternativa degli eventi: Variazione di prezzo superiore al 20% per almeno un articolo.

Test di unità con JUnit4

UML Diagrammi delle classi. UML Diagramma classi 1

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Programmazione a oggetti e JAVA. Prof. B.Buttarazzi A.A. 2011/2012

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Esercitazioni di Progettazione del Software. Esercitazione (Prova al calcolatore del 17 settembre 2010)

Realizzazione di una classe con un associazione

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Programmazione a Oggetti Modulo B

Corso Analista Programmatore Web PHP Corso Online Analista Programmatore Web PHP

Esercizio 1: trading on-line

Esercizi della lezione 5 di Java

Sequence Diagram e Collaboration Diagram

Ottava Esercitazione. introduzione ai thread java mutua esclusione

Esercizio: gestione di un conto corrente

Informatica 3. LEZIONE 7: Fondamenti di programmazione orientata agli oggetti (1)

Programmazione A.A Programmazione Orientata agli Oggetti: Lavorare con gli oggetti ( Lezione XXVII)

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Prova di Laboratorio di Programmazione

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 21 Dicembre 2006

La selezione binaria

Allocazione dinamica della memoria - riepilogo

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A Esercitazione. Programmazione Object Oriented in Java

Traccia delle soluzioni

Programmazione in Java Parte I: Fondamenti

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

LABORATORIO DI PROGRAMMAZIONE EDIZIONE 1, TURNO B

costruttori e distruttori

Fasi del ciclo di vita del software (riassunto) Progetto: generalità. Progetto e realizzazione (riassunto)

Eclipse - Nozioni Base

Abstract Data Type (ADT)

Corso di Informatica

GESTIONE INFORMATICA DEI DATI AZIENDALI

!"#$%&&'()#*%+%+!"#$"',,'()#*%+ -")%*&'&'+'$.)+-$$%&&) !"#$%&&'(%)'*+%",#-%"#.'%&'#/0)-+#12"+3,)4+56#7+#.')8'9

Java:Struttura di Programma. Fabio Scanu a.s. 2014/2015

Introduzione. Java. Composizione. Esempio -- composizione. G. Prencipe È qualcosa che abbiamo già visto varie volte

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti

Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 17 Dicembre 2005

Il sistema monetario

Programmazione ad Oggetti: JAVA. Esercitazione

Telerilevamento e GIS Prof. Ing. Giuseppe Mussumeci

Programmazione I - Laboratorio

Programmazione II. Lezione 4. Daniele Sgandurra 30/09/2011.

Basi di dati. (Sistemi Informativi) teoria e pratica con Microsoft Access. Basi di dati. Basi di dati. Basi di dati e DBMS DBMS DBMS

2 - Introduzione al linguaggio Java

Informatica (Basi di Dati)

Introduzione alla programmazione in C

SISTEMI OPERATIVI. Prof. Enrico Terrone A. S: 2008/09

La gestione di un calcolatore. Sistemi Operativi primo modulo Introduzione. Sistema operativo (2) Sistema operativo (1)

Introduzione. Classificazione di Flynn... 2 Macchine a pipeline... 3 Macchine vettoriali e Array Processor... 4 Macchine MIMD... 6

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

20 - Input/Output su File

Fasi di creazione di un programma

Basi di dati. Concetti introduttivi ESEMPIO. INSEGNAMENTI Fisica, Analisi, Aule. Docenti. Entità Relazioni Interrogazioni. Ultima modifica: 26/02/2007

Struttura di un programma Java

23 - Graphical User Interface GUI (Cenni)

Outline. Programmazione ad oggetti in Java. La programmazione ad oggetti Classi e istanze Associazioni fra classi Incapsulamento Costruttori

Programmazione a Oggetti Lezione 10. Ereditarieta

Università degli Studi di Cassino Corso di Fondamenti di Informatica Puntatori. Anno Accademico 2010/2011 Francesco Tortorella

Introduzione alle basi di dati. Gestione delle informazioni. Gestione delle informazioni. Sistema informatico

Sistemi Operativi MECCANISMI E POLITICHE DI PROTEZIONE. D. Talia - UNICAL. Sistemi Operativi 13.1

MECCANISMI E POLITICHE DI PROTEZIONE 13.1

Introduzione alle tecnologie informatiche. Strumenti mentali per il futuro

Tipi di Dato Ricorsivi

Transcript:

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP) Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it Corso di Laurea Magistrale in Informatica Umanistica A.A. 2013/2014 Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 1 / 26

Sommario 1 Programmazione Orientata agli Oggetti: concetti 2 Programmazione Orientata agli Oggetti: highlights Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 2 / 26

Programmazione imperativa (1) Abbiamo visto come programmare utilizzando i seguenti tipi di dati: Tipi di dato primitivi (int, double, char, boolean, ecc...) Le stringhe Gli array I programmi fatti fino ad ora consistevano di una sequenza di comandi strutture di controllo (cicli, scelte condizionali, ecc...) ed eventualmente metodi ausiliari che consentivano di manipolare i dati per calcolare il risultato voluto. Questo modo di programmare prende il nome di PROGRAMMAZIONE IMPERATIVA (nota: imperativa in quanto basata su comandi) Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 3 / 26

Programmazione imperativa (2) Nella programmazione imperativa: Un programma prevede uno stato globale costituito dai valori delle sue variabili I comandi del programma modificano lo stato fino a raggiungere uno stato finale (che include il risultato) Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 4 / 26

Programmazione imperativa (3) Ad esempio, il seguente programma (che calcola il prodotto di x e y): int x=10, y=3, p =0; for ( int i =0; i<y; i ++) p+=x; ha la seguente dinamica: Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 5 / 26

Programmazione orientata agli oggetti (1) Sebbene sia possibile scrivere programmi interessanti con i tipi di dato visti fino ad ora, spesso i programmi hanno bisogno di manipolare strutture dati che rappresentano più fedelmente le entità del mondo reale. Ad esempio, immaginate di dover scrivere programmi per la gestione di... Conti bancari: ogni conto bancario ha un proprio saldo, un proprio intestatario, una propria lista di movimenti, ecc... Dipendenti: ogni dipendente di un azienda ha una propria matricola, un proprio stipendio, un proprio orario di lavoro, ecc... Parchi macchine: ogni automobile ha la propria targa, il proprio contachilometri, il proprio storico delle manutenzioni, ecc... Rettangoli: ogni rettangolo ha la propria base, altezza e posizione nel piano. Scrivere un programma di questo tipo usando solo interi, array e strighe può diventare abbastanza complicato... Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 6 / 26

Programmazione orientata agli oggetti (2) Notate che ogni entità del mondo reale (e.g. il conto bancario) prevede un proprio stato interno (e.g. saldo, ecc...) e delle proprie funzionalità (e.g. versamento, prelievo, ecc...) Per questo motivo un linguaggio di programmazione ORIENTATO AGLI OGGETTI (tipo Java) fornisce meccanismi per definire nuovi tipi di dato basati sul concetto di classe Una classe definisce un insieme di oggetti (conti bancari, dipendenti, automobili, rettangoli, ecc...). Un oggetto è una struttura dotata di: proprie variabili (che rappresentano il suo stato) propri metodi (che realizzano le sue funzionalità) Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 7 / 26

Primo esempio di programmazione con oggetti (1) Scriviamo un programma che usa un conto corrente Consiste di due classi: UsaConto che contiene il main del programma ContoCorrente che descrive gli oggetti che rappresentano i conti correnti public class UsaConto { public static void main ( String [] args ) { // crea un nuovo conto corrente inizializzato con 1000 euro ContoCorrente cc = new ContoCorrente (1000); // versa 700 euro cc. versa (700); // fa un po di prelievi, controllando prima il saldo if ( cc. saldo >200) cc. preleva (200); if ( cc. saldo >200) cc. preleva (900); System. out. println (" Saldo finale : " + cc. saldo ); Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 8 / 26

Primo esempio di programmazione con oggetti (2) public class ContoCorrente { // variabile che memorizza lo stato del conto public double saldo ; // costruttore della classe public ContoCorrente ( double saldoiniziale ) { saldo = saldoiniziale ; // metodo per il versamento di somme public void versa ( double somma ) { saldo += somma ; // metodo per il prelievo di somme public void preleva ( double somma ) { saldo -= somma ; Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 9 / 26

Primo esempio di programmazione con oggetti (3) Osservazioni: La classe UsaConto non è molto diversa dai programmi che abbiamo scritto fino ad ora... In UsaConto: cc.versa() è una invocazione di un metodo, cc.saldo è una lettura di una variabile In ContoCorrente: non c è il main (ce n e uno solo per tutto il programma) c è una variabile (saldo) che rappresenta lo stato del conto ci sono due metodi (versa() e preleva()) che descrivono le funzionalità del conto c e un metodo speciale (ContoCorrente()) che inizializza il conto il metodo ContoCorrente() è detto costruttore e viene richiamato quando si usa il comano new (non prevede tipo di ritorno) i metodi e la variabile sono pubblici (public) quindi possono essere usati anche da altre classi (e.g. UsaConto) nei metodi non si usa il modificatore static (capiremo più avanti perché) Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 10 / 26

Primo esempio di programmazione con oggetti (4) Vediamo ora come gestire più conti correnti public class UsaDueConti { public static void main ( String [] args ) { // crea un nuovo conto corrente inizializzato con 1000 euro ContoCorrente conto1 = new ContoCorrente (1000); // crea un nuovo conto corrente inizializzato con 200 euro ContoCorrente conto2 = new ContoCorrente (200); // preleva 700 euro dal primo conto... conto1. preleva (700); //... e li versa nel secondo conto2. versa (700); System. out. println (" Saldo primo conto : " + conto1. saldo ); System. out. println (" Saldo secondo conto : " + conto2. saldo ); Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 11 / 26

L esecuzione di un programma a oggetti (1) In un programma basato su oggetti, lo stato non è più uno stato unico globale (come nel caso della programmazione imperativa) ma è composto da tutti gli stati interni di tutti gli oggetti attivi Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 12 / 26

L esecuzione di un programma a oggetti (2) Per descrivere l esecuzione di un programma a oggetti ci si può concentrare sulle invocazioni di metodi dei vari oggetti trascurando i dettagli della loro implementazione (i singoli comandi che contengono) Un diagramma come questo fa capire che il metodo pagastipendio() di della classe Dipendente richiama il metodo versa() di ContoCorrente Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 13 / 26

OOP e Ingengeria del Software La programmazione orientata agli oggetti semplifica la realizzazione di programmi complessi: 1. Si identificano le varie entità da rappresentare tramite classi e oggetti 2. Si specificano le variabili e i metodi di ogni classe accessibili dalle altre classi (ossia l interfaccia pubblica della classe) 3. Si implementano le varie classi separatamente, concentrandosi su una per volta 4. Le varie classi possono essere implementate da persone diverse indipendentemente La disciplina che si occupa di organizzare questo lavoro è l Ingengeria del Software Definisce notazioni (diagrammi), metodologie e procedure che rendono il processo di sviluppo di software complessi più efficiente e affidabile. Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 14 / 26

Sommario 1 Programmazione Orientata agli Oggetti: concetti 2 Programmazione Orientata agli Oggetti: highlights Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 15 / 26

OOP Highlights (1) Riprendiamo l esempio del conto corrente: public class ContoCorrente { public double saldo ; public ContoCorrente ( double saldoiniziale ) { saldo = saldoiniziale ; public void versa ( double somma ) { saldo += somma ; public void preleva ( double somma ) { saldo -= somma ; Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 16 / 26

OOP Highlights (2) Riprendiamo anche il primo main che abbiamo considerato: public class UsaConto { public static void main ( String [] args ) { // crea un nuovo conto corrente inizializzato con 1000 euro ContoCorrente cc = new ContoCorrente (1000); // versa 700 euro cc. versa (700); // fa un po di prelievi, controllando prima il saldo if ( cc. saldo >200) cc. preleva (200); if ( cc. saldo >200) cc. preleva (900); System. out. println (" Saldo finale : " + cc. saldo ); Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 17 / 26

OOP Highlights (3) Arricchiamo un po il comportamento dei metodi: Tracciamo i movimenti stampando dei messaggi public class ContoCorrente { public double saldo ; public ContoCorrente ( double saldoiniziale ) { saldo = saldoiniziale ; public void versa ( double somma ) { saldo += somma ; System. out. println (" Versati : " + somma + " euro "); public void preleva ( double somma ) { saldo -= somma ; System. out. println (" Prelevati : " + somma + " euro "); Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 18 / 26

OOP Highlights (4) Abbiamo modificato la classe... dobbiamo mettere mano anche al main (e/o alle altre classi che la usano)? NO! Highlight: se non modifichiamo l interfaccia pubblica (nomi dei metodi, parametri, valori di ritorno) possiamo modificare la classe senza compromettere il resto del programma Più facile fare manutenzione e aggiornamenti a parti del programma! Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 19 / 26

OOP Highlights (5) Modifiche all interfaccia pubblica richiedono invece di modificare anche i chiamanti (in questo caso il main) Esempio: consentiamo il prelievo solo se c e la disponibilità public class ContoCorrente { public double saldo ; public ContoCorrente ( double saldoiniziale ) { saldo = saldoiniziale ; public void versa ( double somma ) { saldo += somma ; System. out. println (" Versati : " + somma + " euro "); // restituisce false se non ci sono abbastanza soldi public boolean preleva ( double somma ) { if ( saldo < somma ) return false ; else { saldo -= somma ; System. out. println (" Prelevati : " + somma + " euro "); return true ; Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 20 / 26

OOP Highlights (6) Modifichiamo di conseguenza il main: public class UsaConto { public static void main ( String [] args ) { // crea un nuovo conto corrente inizializzato con 1000 euro ContoCorrente cc = new ContoCorrente (1000); // versa 700 euro cc. versa (700); // fa un po di prelievi, controllando prima il saldo. // posso tenere conto o meno del risultato ( true / false ) if (cc. preleva (200)) System. out. println (" Fallito "); cc. preleva (900); System. out. println (" Saldo finale : " + cc. saldo ); Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 21 / 26

OOP Highlights (7) Prima abbiamo aggiunto la stampa dei messaggi per tracciare le operazioni sul conto... ma chi vieta all utilizzatore di questa classe di modificare a mano il saldo? cc. saldo =10000000; Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 22 / 26

OOP Highlights (8) Il saldo è pubblico (public) se vogliamo evitare che sia modificabile dall esterno della classe lo dobbiamo trasformare in privato (private) public class ContoCorrente { // ora e visibile solo all interno di questa classe private double saldo ; public ContoCorrente ( double saldoiniziale ) { saldo = saldoiniziale ; public void versa ( double somma ) { saldo += somma ; System. out. println (" Versati : " + somma + " euro "); public boolean preleva ( double somma ) { if ( saldo < somma ) return false ; else { saldo -= somma ; System. out. println (" Prelevati : " + somma + " euro "); return true ; Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 23 / 26

OOP Highlights (9) Ora siamo sicuri che le modifiche al saldo avverranno solo tramite i metodi Idee? Ma... come farà il main a stampare il saldo? Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 24 / 26

OOP Highlights (10) Soluzione: Aggiungiamo un metodo public class ContoCorrente { private double saldo ; public ContoCorrente ( double saldoiniziale ) { saldo = saldoiniziale ; public void versa ( double somma ) { saldo += somma ; System. out. println (" Versati : " + somma + " euro "); public boolean preleva ( double somma ) { if ( saldo < somma ) return false ; else { saldo -= somma ; System. out. println (" Prelevati : " + somma + " euro "); return true ; // restituisce il saldo a chi ne ha bisogno public double ottienisaldo () { return saldo ;

OOP Highlights (11) Il metodo che abbiamo aggiunto consente di accedere al saldo solo in lettura In questo modo il valore del saldo è sempre sotto controllo dei metodi Highlight: la proprietà per cui i dati che rappresentano lo stato interno di un oggetto possono essere accessibili solo tramite i metodi dell oggetto stesso è detta INCAPSULAMENTO L incapsulamento consente di gestire un oggetto come una scatola nera (black box). Dall esterno si sa cosa fa un oggetto, ma non come lo fa... Paolo Milazzo (Università di Pisa) Programmazione - Intro OOP A.A. 2013/2014 26 / 26