Livelli di astrazione



Documenti analoghi
Introduzione a Classi e Oggetti

Parola chiave extends

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

Java: Compilatore e Interprete

Concetto di Funzione e Procedura METODI in Java

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:

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

Esempio: il conto bancario

Inizializzazione, Assegnamento e Distruzione di Classi

Implementare le classi

Classi ed Oggetti in JAVA

Funzioni in C. Violetta Lonati

La prima applicazione Java. Creazione di oggetti - 1. La prima applicazione Java: schema di esecuzione. Gianpaolo Cugola - Sistemi Informativi in Rete

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

Programmazione a Oggetti Lezione 10. Ereditarieta

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti


Esercizio 6 Realizzare una classe astratta per le Figure piane e due sottoclassi, la sottoclasse Quadrato e la sottoclasse Rettangolo.

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

Le variabili. Olga Scotti

sayhello public private protected return public class Greeter { public String sayhello() { String message = Hello, World! ; return message; } }

Test di unità con JUnit4

Oggetti Lezione 3. aspetti generali e definizione di classi I

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

Programmazione Java: Variabili membro, Metodi La parola chiave final

Object Oriented Programming

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

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

Oggetti. Oggetti e classi. Utilizzo di classi. Classe

Algoritmi di Ricerca. Esempi di programmi Java

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

Esercizi della lezione 5 di Java

costruttori e distruttori

UML Diagrammi delle classi. UML Diagramma classi 1

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

Visibilità dei Membri di una Classe

Java? Sì, grazie. Scopo del corso

Object Oriented Software Design

Soluzione dell esercizio del 2 Febbraio 2004

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

Introduzione a classi e oggetti

Corso di Informatica

Linguaggio C - Funzioni

Uno dei pregi di Java è quello di integrare la documentazione con il codice stesso Formato dei commenti:

Esercitazione n 4. Obiettivi

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

GESTIONE DEI PROCESSI

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Esercitazioni aggiuntive Martedì Laboratorio L-12

Programmazione ad oggetti

Capitolo 2. Utilizzare oggetti

Java: Compilazione e Traduzione. Fondamenti di Informatica L-B Esercitazione n 3 Introduzione a JAVA. C: Editing, compilazione, esecuzione

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

Introduzione alla programmazione in C

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

Programmazione in Java Parte I: Fondamenti

Esercizio: gestione di un conto corrente

Struttura di un programma Java

Realizzazione di una classe con un associazione

Prova di Laboratorio di Programmazione

Programmazione in Java (I modulo) Lezione 3: Prime nozioni

Corso di Informatica

Modulo 4: Ereditarietà, interfacce e clonazione

Introduzione al linguaggio C Gli array

Introduzione alla Programmazione Orientata agli Oggetti. Classi, Oggetti e Messaggi

Fasi di creazione di un programma

La struttura dati ad albero binario

dall argomento argomento della malloc()

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

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

Esercizio: la classe CashRegister

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

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

Strutturazione logica dei dati: i file

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

MECCANISMI E POLITICHE DI PROTEZIONE 13.1

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

Programmare in Java. Olga Scotti

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

Multithreading in Java. Fondamenti di Sistemi Informativi

I metodi statici -1. Variabili statiche Vogliamo assegnare a ciascuncontoun numeroidentificativo diverso. I metodi statici -2

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

Proge&are le Classi Ing. Massimo Cossen.no Sistemi Informa.vi Aziendali a.a. 2008/2009

LINGUAGGI DI PROGRAMMAZIONE

Generalizzazione di funzioni e di classi. Macro come funzioni generiche

Università degli studi di Roma Tor Vergata Ingegneria Medica Informatica I Programma del Corso

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

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

Relazioni tra oggetti e classi : Composizione. Relazioni tra oggetti e classi : esempio di Aggregazione. classe contenitore

Architettura MVC-2: i JavaBeans

Capitolo 3. Realizzare classi

Elementi di semantica operazionale

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

Definizione di classi con array di oggetti

Siti web centrati sui dati Architettura MVC-2: i JavaBeans

Il seguente Syllabus è relativo al Modulo 7, Reti informatiche, e fornisce i fondamenti per il test di tipo pratico relativo a questo modulo

Eredità in C++ Corso di Linguaggi di Programmazione ad Oggetti 1. a cura di Giancarlo Cherchi

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013

Allocazione dinamica della memoria - riepilogo

Progettazione : Design Pattern Creazionali

Transcript:

Realizzare Classi

Astrazione Perdita di dettaglio Utile nella descrizione, progettazione, implementazione e utilizzo di sistemi complessi Dettagli trascurabili vengono incapsulati in sottosistemi più semplici che vengono quindi utilizzati come delle scatole nere non occorre conoscere il loro funzionamento interno basta conoscere l essenza del concetto che rappresentano e l interazione con il resto del sistema Ad esempio, un autista per usare un auto non necessita di conoscerne i dettagli ingegneristici, deve solo sapere a cosa serve e interagire con essa

Livelli di astrazione Nei sistemi complessi si hanno diversi livelli di astrazione Es. automobile: Il motore è una scatola nera per l autista I pistoni, le ventole, le centraline, etc. sono scatole nere per il meccanico L astrazione apporta semplificazione e specializzazione Migliora l efficienza

Astrazione in Software Design I linguaggi di programmazione definiscono attraverso i tipi di dati primitivi e le istruzioni un dominio su cui definire le soluzioni ai problemi Solitamente il dominio dato da un linguaggio di programmazione e il dominio del problema sono sensibilmente differenti L astrazione serve a fornire al dominio delle soluzioni concetti analoghi a quelli del dominio dei problemi Linguaggi di programmazione che facilitano le astrazioni sono auspicabili

Programmazione orientata agli oggetti Le classi e gli oggetti sono gli strumenti per realizzare le astrazioni La classe definisce/implementa un nuovo concetto (di più alto livello rispetto a quelli esistenti) Gli oggetti consentono l utilizzo dell astrazione implementata dalla classe (in un programma) Incapsulamento: per utilizzare un oggetto non è necessario conoscere la sua struttura interna

Programmazione orientata agli oggetti Definire buone astrazioni non è semplice E l aspetto più importante di una buona progettazione O.O. In una corretta progettazione (ad oggetti) prima si definiscono le classi e poi si implementano

Esempio: contapersone Un tally counter è un semplice dispositivo che mantiene un conteggio che può essere incrementato azzerato visualizzato Simulazione di un conteggio: Counter tally = new Counter(); tally.count(); tally.count(); int result = tally.getvalue(); // Sets result to 2

Realizzazione di un tally counter Ogni oggetto di tipo Counter deve mantenere un conteggio autonomo dagli altri necessita di una propria variabile value (variabile di istanza) la variabile è un dettaglio di implementazione che può essere nascosto (incapsulamento) Per garantirne la funzionalità devono poter essere invocati i seguenti metodi: count(): incrementa value reset(): azzera value getvalue(): restituisce il valore di value

In Java: public class Counter private int value; public void count() value = value + 1; public int getvalue() return value; public void reset() value = 0;

Classi Il comportamento di un oggetto è descritto da una classe Ogni classe ha Un interfaccia pubblica Un insieme di metodi (funzioni) che si possono invocare per manipolare l oggetto Es.: Rectangle(x_init,y_init,width_init,height_init) metodo dell interfaccia che crea un rettangolo (costruttore) Un implementazione nascosta Codice e variabili usati per implementare i medodi dell interfaccia e non accessibili all esterno della classe Es.: x,y,width,height

Sintassi definizione di classe accessspecifier class ClassName constructors methods fields Example: public class BankAccount public BankAccount(double initialbalance)... public void deposit(double amount)......

Definizione di una classe File BankAccount.java public class BankAccount... Nome della classe Specificatore di accesso specificatore di accesso public indica che la classe BankAccount è utilizzabile anche al di fuori del package di cui fa parte la classe una classe public deve essere contenuta in un file avente il suo stesso nome Es.: la classe BankAccount è memorizzata nel file BankAccount.java

Progettazione dell interfaccia pubblica Comportamento di un conto corrente bancario (astrazione): deposita contante preleva contante legge saldo Necessaria la memorizzazione del saldo (variabile di istanza)

Conto corrente (BankAccount): metodi Metodi della classe BankAccount: deposit withdraw getbalance Vogliamo poter eseguire le seguenti operazioni: harryschecking.deposit(2000); harryschecking.withdraw(500); System.out.println(harrysChecking.getBalance());

Definizione di un metodo public void deposit(double amount)... public void withdraw(double amount)... public double getbalance()... Sintassi accessspecifier returntype methodname(parametertype parametername,...) method body

Definizione di un metodo public void withdraw(double amount) tipo di dato restituito Nome del metodo Specificatore di accesso Corpo del metodo Elenco dei parametri Lo specificatore di accesso indica la visibilità (scope) del metodo public indica che il metodo può essere invocato anche nei metodi esterni alla classe BankAccount (e anche in quelli esterni al package a cui appartiene la classe BankAccount )

BankAccount: Interfaccia Pubblica I costruttori e i metodi public di una classe formano l interfaccia pubblica della classe. public class BankAccount // Constructors public BankAccount() // body--filled in later public BankAccount(double initialbalance) // body--filled in later // Methods public void deposit(double amount)

BankAccount: Interfaccia Pubblica // body--filled in later public void withdraw(double amount) // body--filled in later public double getbalance() // body--filled in later // private fields--filled in later

Variabili di istanza Contengono il dato memorizzato nell oggetto Istanza di una classe: un oggetto della classe La definizione della classe specifica le variabili d istanza: public class BankAccount... private double balance;

Definizione di una variabile di istanza Specificatore di accesso tipo della variabile Nome della variabile Lo specificatore di accesso indica la visibilità (scope) della variabile private indica che la variabile di istanza può essere letta e modificata solo dai metodi della classe private int x ; dall esterno è possibile accedere alle variabili di istanza private solo attraverso i metodi public della classe raramente le variabili di istanza sono dichiarate public Il tipo delle variabili di istanza può essere una classe, Es.: String un array un tipo primitivo, Es.: int Tipi riferimento

Uso variabili di istanza nei metodi Il metodo deposit di BankAccount può accedere alla variabile di istanza balance (dichiarata private): public void deposit(double amount) double newbalance = balance + amount; balance = newbalance;

Accesso variabili di istanza Le variabili dichiarate private non sono visibili in altre classi: public class BankRobber public static void main(string[] args) BankAccount momssavings = new BankAccount(1000);... momssavings.balance = -1000; // ERROR Realizzazione incapsulamento: si nasconde il dato contenuto nelle variabili di istanza usando lo specificatore private e se ne fornisce l accesso solo attraverso i metodi dell interfaccia pubblica

Metodo withdraw Il metodo withdraw di BankAccount sottrae dal saldo il valore prelevato dal conto: public void withdraw(double amount) double newbalance = balance - amount; balance = newbalance;

Esecuzione metodo harryschecking.withdraw(500); Si valuta la variabile harryschecking (riferimento ad un oggetto BankAccount in memoria) Dal valore di harryschecking e l identificatore withdraw si determina l indirizzo del metodo (il codice di withdraw è contenuto nello spazio di memoria occupato dalla classe BankAccount)

Esecuzione: harryschecking.withdraw(500); public void withdraw(double amount) double newbalance = balance - amount; balance = newbalance; 1. Si assegna il parametro esplicito amount a 500 2. Si recupera il contenuto del campo balance dell oggetto la cui locazione è salvata in harryschecking 3. Si sottrae il valore amount da balance e si salva il risultato in newbalance 4. Si salva il valore di newbalance in balance, sovrascrivendo il vecchio valore

Significato di this (1) All interno di un metodo per riferirsi esplicitamente al parametro implicito si può usare la parola chiave this Il nome di una variabile di istanza all interno di un metodo di una classe si riferisce alla variabile di istanza del parametro implicito public void trasferisci(double somma, Conto conto) saldo = saldo - somma; conto.saldo = conto.saldo + somma;

Significato di this (2) A volte per chiarezza si usa this.nomemetodo o this.nomevariabile public void trasferisci(double somma, Conto conto) this.saldo = this.saldo - somma; conto.saldo = conto.saldo + somma; Altre volte è necessario public void saldonuovo(double saldo) this.saldo = saldo;

Significato di this (3) All interno di un metodo A, se un metodo B viene usato senza parametro implicito allora si assume che il parametro implicito di B è quello con cui abbiamo invocato A B deve essere un metodo invocabile sul parametro implicito di A public void trasferisci(double somma, Conto conto) preleva(somma); conto.deposita(somma); Anche in questo caso si può usare this: this.preleva(somma);

Costruttore Un costruttore inizializza le variabili di istanza Il nome del costruttore è il nome della classe public BankAccount() // body--filled in later

Costruttore Il corpo del costruttore è eseguito quando viene creato un nuovo oggetto Le istruzioni del costruttore in genere assegnano valori alle variabili di istanza Ci possono essere diversi costruttori ma tutti devono avere lo stesso nome (overloading) il compilatore li distingue dalla lista dei parametri espliciti

Nota su overloading (sovraccarico) Più metodi con lo stesso nome Consentito se i parametri li distinguono, cioè hanno firme diverse (firma = nome del metodo + lista tipi dei parametri nell ordine in cui compaiono) Il tipo restituito non conta Frequente con costruttori Devono avere lo stesso nome della classe Es.: aggiungiamo a Rectangle il costruttore public Rectangle(int x_init,int y_init) x=x_init; y=y_init; Usato anche quando dobbiamo agire diversamente a seconda del tipo passato Ad es., println della classe PrintStream

Sintassi costruttore accessspecifier ClassName(parameterType parametername,...) constructor body Example: public BankAccount(double initialbalance)... Purpose: To define the behavior of a constructor

Implementazione Costruttori Contengono istruzioni per inizializzare le variabili di istanza public BankAccount() balance = 0; public BankAccount(double initialbalance) balance = initialbalance;

Invocazione Costruttore BankAccount harryschecking = new BankAccount(1000); Crea un nuovo oggetto di tipo BankAccount Chiama il secondo costruttore (viene passato un parametro) Assegna il parametro initialbalance a 1000 Assegna la copia del campo balance del nuovo oggetto creato con initialbalance Restituisce un riferimento ad un oggetto di tipo BankAccount (cioè la locazione di memoria dell oggetto) come valore della new-expression Salva il riferimento nella variabile harryschecking

Commenti per documentazione javadoc /** Withdraws money from the bank account. @param the amount to withdraw */ public void withdraw(double amount) // implementation filled in later /** Gets the current balance of the bank account. @return the current balance */ public double getbalance() // implementation filled in later

Commenti alla classe /** A bank account has a balance that can be changed by deposits and withdrawals. */ public class BankAccount... Fornire commenti per ogni classe ogni metodo ogni parametro esplicito ogni valore restituito da una funzione

File BankAccount.java 01: /** 02: A bank account has a balance that can be changed by 03: deposits and withdrawals. 04: */ 05: public class BankAccount 06: 07: /** 08: Constructs a bank account with a zero balance. 09: */ 10: public BankAccount() 11: 12: balance = 0; 13: 14: 15: /** 16: Constructs a bank account with a given balance. 17: @param initialbalance the initial balance 18: */

File BankAccount.java 19: public BankAccount(double initialbalance) 20: 21: balance = initialbalance; 22: 23: 24: /** 25: Deposits money into the bank account. 26: @param amount the amount to deposit 27: */ 28: public void deposit(double amount) 29: 30: double newbalance = balance + amount; 31: balance = newbalance; 32: 33: 34: /** 35: Withdraws money from the bank account. 36: @param amount the amount to withdraw

File BankAccount.java 37: */ 38: public void withdraw(double amount) 39: 40: double newbalance = balance - amount; 41: balance = newbalance; 42: 43: 44: /** 45: Gets the current balance of the bank account. 46: @return the current balance 47: */ 48: public double getbalance() 49: 50: return balance; 51: 52: 53: private double balance; 54:

Testare una classe Classe Tester: una classe con il metodo main che contiene istruzioni per testare un altra classe Solitamente consiste in: 1. costruire uno o più oggetti della classe da testare 2. invocare sugli oggetti uno o più metodi 3. stampare a video i risultati delle computazioni

File BankAccountTester.java 01: /** 02: A class to test the BankAccount class. 03: */ 04: public class BankAccountTester 05: 06: /** 07: Tests the methods of the BankAccount class. 08: @param args not used 09: */ 10: public static void main(string[] args) 11: 12: BankAccount harryschecking = new BankAccount(); 13: harryschecking.deposit(2000); 14: harryschecking.withdraw(500); 15: System.out.println(harrysChecking.getBalance()); 16: 17:

Categorie di variabili Variabili di istanza Appartengono all oggetto Esistono finché l oggetto esiste Hanno un valore iniziale di default Variabili locali Appartengono al metodo Vengono create all attivazione del metodo e cessano di esistere con esso Non hanno valore iniziale se non inizializzate Parametri formali Appartengono al metodo Vengono create all attivazione del metodo e cessano di esistere con esso Valore iniziale è il valore del parametro reale al momento dell invocazione

Progettazione ad oggetti Caratterizzazione attraverso le classi delle entità (oggetti) coinvolte nel problema da risolvere (individuazione classi) identificazione delle classi identificazione delle responsabilità (operazioni) di ogni classe individuazione delle relazioni tra le classi dipendenza (usa oggetti di altre classi) aggregazione (contiene oggetti di altre classi) ereditarietà (relazione sottoclasse/superclasse ) Realizzazione delle classi

Realizzazione di una classe 1. individuazione dei metodi dell interfaccia pubblica: determinazione delle operazioni che si vogliono eseguire su ogni oggetto della classe 2. individuazione delle variabili di istanza: determinazione dei dati da mantenere 3. individuazione dei costruttori 4. Codifica dei metodi 5. Collaudo del codice

Programmi Java Un programma Java consiste di una o più classi Per poter eseguire un programma bisogna definire una classe public che contiene un metodo main(string[ ] args)