Esercitazione del 2 marzo 2007 Oggetti Oggetti Servono

  • Slides: 30
Download presentation
Esercitazione del 2 marzo 2007 Oggetti

Esercitazione del 2 marzo 2007 Oggetti

Oggetti • Servono per definire nuovi tipi di dato collezioni di dati + relative

Oggetti • Servono per definire nuovi tipi di dato collezioni di dati + relative operazioni

Esempio tipico • Vogliamo realizzare una classe Bank. Account i cui oggetti sono dei

Esempio tipico • Vogliamo realizzare una classe Bank. Account i cui oggetti sono dei semplici conti bancari. • Vogliamo le seguenti operazioni q depositare denaro q prelevare denaro q chiedere il saldo corrente

Come si procede? • Variabili d’istanza per rappresentare lo stato degli oggetti • Metodi

Come si procede? • Variabili d’istanza per rappresentare lo stato degli oggetti • Metodi d’istanza per modellare le operazioni richieste • Costruttore (o costruttori) per creare un nuovo oggetto della classe ed inizializzare le variabili

Una possibile implementazione public class Bank. Account{ //OVERVIEW: un Bank. Account memorizza // informazioni

Una possibile implementazione public class Bank. Account{ //OVERVIEW: un Bank. Account memorizza // informazioni sul saldo di un conto corrente private int balance; //il saldo corrente // costruttore public Bank. Account(int initial){ //EFFECTS: crea un nuovo Bank. Account con saldo //this balance=initial; }

Una possibile implementazione // metodi public void deposit(int amount) { //EFFECTS: aggiunge amount a

Una possibile implementazione // metodi public void deposit(int amount) { //EFFECTS: aggiunge amount a this balance = balance + amount; } public void withdraw(int amount) { //EFFECTS: aggiunge amount a this balance = balance - amount; } public double get. Balance() { //EFFECTS: restituisce il saldo di this return balance; } }

Creare oggetti • Gli oggetti istanze della classe si creano tramite new • Hanno

Creare oggetti • Gli oggetti istanze della classe si creano tramite new • Hanno il tipo nome della classe Bank. Account p 1= new Bank. Account(1000);

Come si usano? • Si usano tramite le operazioni definite dai metodi d’istanza (interfaccia

Come si usano? • Si usano tramite le operazioni definite dai metodi d’istanza (interfaccia pubblica) Bank. Account p 1= new Bank. Account(1000); Bank. Account p 2= new Bank. Account(2000); p 1. deposit(p 2. getbalance()); p 2. withdraw(p 2. getbalance()); • Trasferisce tutti i soldi di p 2 in p 1!

Attenzione • Se la variabile d’istanza balance fosse public Bank. Account p 1= new

Attenzione • Se la variabile d’istanza balance fosse public Bank. Account p 1= new Bank. Account(1000); Bank. Account p 2= new Bank. Account(2000); p 1. balance= p 1. balance + p 2. balance; p 2. balance=0; Soluzione sbagliata!

Perche’ ? • Il codice che usa Bank. Account dipende dalla sua implementazione (accede

Perche’ ? • Il codice che usa Bank. Account dipende dalla sua implementazione (accede a balance) • Se dovessimo modificare l’implementazione dovremmo modificare di conseguenza tutti i moduli che lo usano • E’ impossibile garantire proprieta’ della variabile balance per costruzione (p. e. che sia sempre in attivo)

Per contro • Il codice che usa solo l’ interfaccia pubblica Bank. Account p

Per contro • Il codice che usa solo l’ interfaccia pubblica Bank. Account p 1= new Bank. Account(1000); Bank. Account p 2= new Bank. Account(2000); p 1. deposit(p 2. getbalance()); p 2. withdraw(p 2. getbalance()); E’ indipendente dall’implementazione!

Suggerimento • Per forzare questo stile di programmazione • E’ necessario implementare lo stato

Suggerimento • Per forzare questo stile di programmazione • E’ necessario implementare lo stato interno tramite variabili d’istanza private

Richiami sulla semantica • Qual’e il valore di una variabile di tipo oggetto ?

Richiami sulla semantica • Qual’e il valore di una variabile di tipo oggetto ? Bank. Account p 1= new Bank. Account(1000); Bank. Account p 2= new Bank. Account(2000); • Gli oggetti possono essere condivisi a causa dell’assegamento e/o del passaggio dei parametri

Assegnamento Bank. Account p 1= new Bank. Account(1000); Bank. Account p 2= new Bank.

Assegnamento Bank. Account p 1= new Bank. Account(1000); Bank. Account p 2= new Bank. Account(2000); p 1=p 2; p 2. deposit(3000); • Qual’e’ il valore di p 1. getbalance()

Problemi con l’uguaglianza • Supponiamo di volere confrontare due oggetti • E’ corretto usare

Problemi con l’uguaglianza • Supponiamo di volere confrontare due oggetti • E’ corretto usare l’operatore ==? Bank. Account p 1= new Bank. Account(1000); Bank. Account p 2= new Bank. Account(1000); if (p 1==p 2) {…. } ; • Quale e’ il risultato?

Conclusione • L’operatore == non e’ adatto per confrontare oggetti • E’ necessario introdurre

Conclusione • L’operatore == non e’ adatto per confrontare oggetti • E’ necessario introdurre un opportuno metodo d’istanza di confronto che confronta lo stato interno (e non il riferimento)

Primo esercizio • Modificare Bank. Account in modo che - lo stato interno memorizzi

Primo esercizio • Modificare Bank. Account in modo che - lo stato interno memorizzi anche il nome del titolare (String) -il saldo sia sempre attivo (per costruzione)

Metodi aggiuntivi • un metodo d’istanza booleano equals che prende come parametro un oggetto

Metodi aggiuntivi • un metodo d’istanza booleano equals che prende come parametro un oggetto di tipo Bank. Account e verifica se e’ “uguale” a this • un metodo d’istanza nome che restituisce il nome di this

Inoltre • Deve essere modificato il costruttore • Deve essere modificato il metodo per

Inoltre • Deve essere modificato il costruttore • Deve essere modificato il metodo per il prelievo in modo da garantire che il saldo sia attivo • Deve essere modificato il metodo per il deposito in modo da garantire che il valore depositato sia maggiore di zero

Suggerimento • Partire dalla specifica (interfaccia pubblica) modificando la descrizione di cosa devono fare

Suggerimento • Partire dalla specifica (interfaccia pubblica) modificando la descrizione di cosa devono fare i metodi • Poi implementare lo stato (tramite variabili d’istanza) ed i metodi

Implementazione • Le variabili d’istanza che implementano lo stato devono essere private • Altrimenti

Implementazione • Le variabili d’istanza che implementano lo stato devono essere private • Altrimenti non si puo’ garantire che il saldo sia attivo per costruzione

Secondo Esercizio • Vogliamo realizzare un tipo di dato Banca • Memorizza informazioni su

Secondo Esercizio • Vogliamo realizzare un tipo di dato Banca • Memorizza informazioni su un insieme di conti correnti (oggetti di tipo Bank. Account) • Vogliamo che tutti i conti correnti appartengano ad un cliente diverso (abbiano un nome diverso)

Costruttore • Vogliamo un costruttore che, preso un parametro numero di tipo int, crea

Costruttore • Vogliamo un costruttore che, preso un parametro numero di tipo int, crea un oggetto di tipo Banca di dimensione numero • La dimensione stabilisce quanti correnti possono essere memorizzati ed e’ fissa • La Banca creata e’ vuota (nessun Bank. Account)

Metodi d’istanza: operazioni • remove prende un parametro p di tipo Bank. Account •

Metodi d’istanza: operazioni • remove prende un parametro p di tipo Bank. Account • se p compare in this lo rimuove, altrimenti non fa nulla

Metodi d’istanza: operazioni • insert prende un parametro p di tipo Bank. Account •

Metodi d’istanza: operazioni • insert prende un parametro p di tipo Bank. Account • aggiunge p a this (se puo’) e restituisce true • altrimenti restituisce false (per segnalare che c’e’ un problema)

Condizioni per l’inserimento di p • Esistono ancora delle posizioni libere nella Banca (la

Condizioni per l’inserimento di p • Esistono ancora delle posizioni libere nella Banca (la dimensione e’ fissa!) • Non compare gia’ in this un Bank. Account con nome uguale a quello di p (per costruzione)

Metodi d’istanza: operazioni • cerca prende un parametro n tipo String • se in

Metodi d’istanza: operazioni • cerca prende un parametro n tipo String • se in this compare un conto con nome n restituisce il suo saldo corrente • altrimenti restituisce il valore -1

Metodi d’istanza: operazioni • to. String senza parametri • restituisce una stringa che descrive

Metodi d’istanza: operazioni • to. String senza parametri • restituisce una stringa che descrive lo stato interno della banca (per testing) Ex: (nome: Fra, saldo: 1000), …… (nome: Elodie, saldo: 1300),

Come procedere? • Scrivere la specifica (classe con intestazione metodi + descrizione) • Scegliere

Come procedere? • Scrivere la specifica (classe con intestazione metodi + descrizione) • Scegliere le variabili d’istanza (private) ed implementare i metodi di conseguenza • Quale struttura dati per memorizzare un insieme di oggetti di dimensione fissa?

Passo successivo (a casa) • Modificare l’implementazione di Banca (non la specifica) • I

Passo successivo (a casa) • Modificare l’implementazione di Banca (non la specifica) • I conti correnti siano memorizzati in modo ordinato (per costruzione) • Ordinamento: in base al nome del titolare (usando l’ordinamento lessicografico tra stringhe) • Quali metodi DEVONO essere modificati in modo da garantire la proprieta’? • Quali metodi POSSONO essere modificati per migliorarne l’efficienza?