160 likes | 295 Views
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,
E N D
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
Molti programmi hanno la necessità di elaborare informazioni relative alla data In Java esiste la classe java.util.Date Classe Date Date date = new Date(); System.out.println(date);
Metodi di Date boolean after(Date date); boolean before(date date); int compareTo(Date anotherDate); long getTime(); //millisecondi da 1-1-1970 void setTime();
Esempio In realtà, da quando è stata inserita la classe Calendar, si tratta più di una classe Time (istante di tempo) che di una classe Date. 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
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() Ordinamento totale t1.after(t2) corrisponde a t1.getTime() > t2.getTime()
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. Altre informazioni (1)
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 Altre informazioni (2)
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. Responsabilità
Struttura Calendar Date GregorianCalendar
Calendar specifica una serie di metodi “generici” (non legati a un calendario specifico) Metodi di Calendar ... 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)
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? Realizzazione: classe Day
Operazioni public int daysFrom(Day start) // numero di giorni da start ad ora public Day addDays(int days) // aggiunta di un numero di giorni
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 }
Eventuale modo ancora più neutro Utilizzo (2) 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 }
In una prima realizzazione possibile, lo stato di un oggetto viene rappresentato da variabili di istanza anno, mese, giorno Realizzazione 1 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; } ...