Approfondimento Incapsolamento ( introduzione )

16
1 Incapsolamento (intro) Sandro Pedrazzini Approfondiment o Incapsolamento (introduzione)

description

Approfondimento Incapsolamento ( introduzione ). Motivazione. Importanza dell’incapsulamento nella programmazione OO Ruolo degli elementi “interface” Qualit à delle classi e delle interfacce Non solo le relazioni tra classi sono importanti nello sviluppo, - PowerPoint PPT Presentation

Transcript of Approfondimento Incapsolamento ( introduzione )

Page 1: Approfondimento Incapsolamento ( introduzione )

1 Incapsolamento (intro)Sandro Pedrazzini

Approfondimento

Incapsolamento(introduzione)

Page 2: Approfondimento Incapsolamento ( introduzione )

2 Incapsolamento (intro)Sandro Pedrazzini

Motivazione

Importanza dell’incapsulamento nella programmazione OO

Ruolo degli elementi “interface”

Qualità delle classi e delle interfacce

Non solo le relazioni tra classi sono importanti nello sviluppo, ma anche la buona manufattura di ogni singola classe

Classi utili e riutilizzabili

Page 3: Approfondimento Incapsolamento ( introduzione )

3 Incapsolamento (intro)Sandro Pedrazzini

Classe Date

• Molti programmi hanno la necessità di elaborare informazioni relative alla data

• In Java esiste la classe java.util.Date

Date date = new Date();

System.out.println(date);

Page 4: Approfondimento Incapsolamento ( introduzione )

4 Incapsolamento (intro)Sandro Pedrazzini

Metodi di Date

boolean after(Date date);

boolean before(date date);

int compareTo(Date anotherDate);

long getTime(); //millisecondi da 1-1-1970

void setTime();

Page 5: Approfondimento Incapsolamento ( introduzione )

5 Incapsolamento (intro)Sandro Pedrazzini

Esempio

Date date = Calendar.getInstance().getTime();

date.setTime(0); System.out.println(date); //01-01-1970

date.setTime(-864000000); //valore “long” System.out.println(date); //22-12-1969

date.setTime(864000000); System.out.println(date); //11-01-1970

In realtà, da quando è stata inserita la classe Calendar, si tratta più di una classe Time (istante di tempo) che di una classe Date.

Page 6: Approfondimento Incapsolamento ( introduzione )

6 Incapsolamento (intro)Sandro Pedrazzini

Ordinamento totale

• Con due oggetti di tipo Date è possibile chiedersi quale dei due preceda l’altro

• Gli istanti di tempo sono dotati di ordinamento totale, implementati dai metodi after() e before()

t1.after(t2)

corrisponde a

t1.getTime() > t2.getTime()

Page 7: Approfondimento Incapsolamento ( introduzione )

7 Incapsolamento (intro)Sandro Pedrazzini

Altre informazioni (1)

• Date non permette però di ottenere informazioni relative al mese, anno di appartenenza, ecc. (in realtà lo permetteva, ma i metodo sono ora dichiarati “deprecated”).

• La responsabilità di determinare queste informazioni è affidata alla classe GregorianCalendar (calendario introdotto da Papa Gregorio XIII nel 1582 con la correzione dell’algoritmo sugli anni bisestili, già comunque presenti nella forma più semplice nel calendario giuliano derivante da Giulio Cesare).

• La classe GregorianCalendar conosce i dettagli e le complicazioni (30 giorni ha novembre, ...) dei nostri calendari.

Page 8: Approfondimento Incapsolamento ( introduzione )

8 Incapsolamento (intro)Sandro Pedrazzini

Altre informazioni (2)

• Il fatto di separare le informazioni di GregorianCalendar da Date (che rappresenta in effetti unicamente un istante di tempo) è un buon esempio di progettazione, perché esistono molte descrizioni di tempo:

– Calendario Gregoriano: 3 febbraio 2001– Calendario della Rivoluzione francese: Année 209 de la République, Mois de

Pluviôse, 2 Jour du Quintidi– Calendario Maya: 12.19.7.17.1

Page 9: Approfondimento Incapsolamento ( introduzione )

9 Incapsolamento (intro)Sandro Pedrazzini

Responsabilità

• La responsabilità che spetta a GregorianCalendar è quella di assegnare descrizioni agli istanti di tempo.

• Un istante di tempo è “neutro”, mentre la sua descrizione può essere fatta in vari modi (ad esempio attraverso una nuova classe MayanCalendar).

• È questo il motivo per cui, almeno nelle intenzioni, è utile avere una classe astratta Calendar, da cui classi concrete come GregorianCalendar possano ereditare.

Page 10: Approfondimento Incapsolamento ( introduzione )

10 Incapsolamento (intro)Sandro Pedrazzini

Struttura

Calendar

GregorianCalendar

Date

Page 11: Approfondimento Incapsolamento ( introduzione )

11 Incapsolamento (intro)Sandro Pedrazzini

Metodi di Calendar

• Calendar specifica una serie di metodi “generici” (non legati a un calendario specifico)

...public int get (int field)public void set(int field, int value)public void add(int field, int increment)

public Date getTime()public void setTime(Date date)

Page 12: Approfondimento Incapsolamento ( introduzione )

12 Incapsolamento (intro)Sandro Pedrazzini

Realizzazione: classe Day

• Realizzazione di una classe Day del calendario gregoriano

• Un oggetto di tipo Day rappresenta un giorno

• Evitiamo di rendere espliciti dettagli di implementazione, come ”inizio dei tempi” (epoch, 1 gennaio 1970), utilizzato da Date

• Prevede metodi di utilità quali:

– Quanto manca alla fine dell’anno?– Quale giorno sarà tra 50 giorni? – Quanti giorni ci sono dalla data X alla data Y?

Page 13: Approfondimento Incapsolamento ( introduzione )

13 Incapsolamento (intro)Sandro Pedrazzini

Operazioni

public int daysFrom(Day start)// numero di giorni da start ad ora

public Day addDays(int days)// aggiunta di un numero di giorni

Page 14: Approfondimento Incapsolamento ( introduzione )

14 Incapsolamento (intro)Sandro Pedrazzini

Utilizzo

public static void main(String[] args){ Day today = Calendar.getInstance().getTime(); Day later = today.addDays(999);

System.out.println(later.getYear() + "-" + later.getMonth() + "-" + later.getDate());

System.out.println(later.daysFrom(today)); // 999 }

Page 15: Approfondimento Incapsolamento ( introduzione )

15 Incapsolamento (intro)Sandro Pedrazzini

Utilizzo (2)

• Eventuale modo ancora più neutro

public static void main(String[] args){ Day today = Calendar.getInstance().getTime(); Day later = today.addDays(999);

System.out.println(later.get(“year”) + "-" + later.get(“month”) + "-" + later.get(“day”));

System.out.println(later.daysFrom(today)); // 999 }

Page 16: Approfondimento Incapsolamento ( introduzione )

16 Incapsolamento (intro)Sandro Pedrazzini

Realizzazione 1

• In una prima realizzazione possibile, lo stato di un oggetto viene rappresentato da variabili di istanza anno, mese, giorno

public class Day{ private int fYear; private int fMonth; private int fDay;

public Day(int year, int month, int day){ fYear = year; fMonth = month; fDay = day; }

public int getDay(){ return fDay; } ...