Post on 24-Feb-2016
description
1 Incapsolamento (intro)Sandro Pedrazzini
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
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);
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();
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.
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()
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.
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
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.
10 Incapsolamento (intro)Sandro Pedrazzini
Struttura
Calendar
GregorianCalendar
Date
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)
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?
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
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 }
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 }
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; } ...