Università degli Studi di Bologna Facoltà di Ingegneria Fondamenti di Informatica T2 Modulo 2 Corso di Laurea in Ingegneria Informatica Anno accademico 2008/2009 Phone Plan Si desidera modellare il funzionamento di un sistema di tariffazione telefonica In particolare, occorre progettare la porzione di sistema che modella il piano telefonico Un piano telefonico consente di calcolare il costo di una chiamata dati istanti di inizio/fine della chiamata stessa, operatore di destinazione e numero di destinazione. 2
Costo chiamata Costo chiamata Costo chiamata Phone Plan Modellare una tariffa a secondi, o una tariffa a scatti? E se le vogliamo entrambe? In realtà le tariffe sono TUTTE a scatti o, al limite, sono tempo continue quando lo scatto dura infinitamente poco (e costa infinitamente poco) Dando la possibilità di definire la durata dell intervallo/scatto in millisecondi forse ce la si cava 3 Phone Plan Durata chiamata Scatto alla risposta più primo scatto Durata chiamata Scatto alla risposta nullo Scatto alla risposta più primo scatto molto molto piccolo! Durata chiamata 4
Phone Plan Un piano telefonico è caratterizzato da: Scatto alla risposta (eventualmente a costo nullo) Durata dell intervallo di tempo standard (in millisecondi) In questo modo si possono modellare sia le tariffe a scatti, sia le tariffe a secondi Per avere una tariffa a secondi impostare l intervallo ad 1 secondo Per avere una tariffa a scatti impostare l intervallo alla durata dello scatto 5 Phone Plan Per ogni operatore di destinazione, i costi delle chiamate possono variare, quindi, per ogni operatore una giornata è suddivisa in fasce orarie (bande) ognuna dotata di ore di inizio e fine validità e costo per intervallo standard di tempo Attenzione: ogni giorno DEVE essere completamente coperto (24h) non possono esserci buchi! 6
Entità Quali sono le entità in gioco? Piano telefonico (PhonePlan) Operatore (Operator) Fascia oraria (Banda) 7 Band Modella la fascia oraria ed è caratterizzato da: Ora di inizio/fine e giorni della settimana in cui è valida Costo dell intervallo Un metodo (isinband) che consente di verificare se la fascia è applicabile per una data/ora passata come parametro Un metodo (isvalid) che consente di verificare se la fascia è valida Ora di inizio precedente l ora di fine Insieme dei giorni di applicabilità non vuoto 8
Band Per modellare ora di inizio/fine validità di una fascia oraria (Band) è eccessivo usare un Date Date è molto flessibile ma fa molto (troppo) più del necessario Ad esempio le informazioni relative a giorni, mesi, anni, non sono assolutamente necessarie Occorre un entità aggiuntiva che consenta di modellare un orario in modo semplice bastano ora e minuti Chiamiamo SimpleTime questa nuova entità 9 SimpleTime Memorizza le ore del giorno in termini di ore e minuti e permette di: Ottenere una nuova istanza di SimpleTime ottenuta aggiungendo i minuti dati al SimpleTime corrente Verificare l uguaglianza fra due SimpleTime (equals) Confrontare due SimpleTime (compareto solita semantica) Verificare la validità di un istanza (isvalid) Ora rappresentata compresa fra minimo e massimo ammissibili (quali sono?) class tlc - hours: int - minutes: int SimpleTime + SimpleTime(int, int) + gethours() : int + getminutes() : int + addminutes(int) : SimpleTime + equals(simplet ime) : boolean + compareto(simpletime) : int 10
Band Finalmente il diagramma class tlc Ba nd - combineddays: DayOfWeekEnum ([]) - starttime: SimpleTime - endtime: SimpleTime - costperinterval: double + Band(SimpleTime, SimpleTime, DayOfWeekEnum[], double) + getstarttime() : SimpleTime + getendtime() : SimpleTime + getcombineddays() : DayOfWeekEnum[] + getcostperinterval() : double + isinband(date) : boolean -endtime -starttime - hours: int - minutes: int SimpleTime + SimpleTime(int, int) + gethours() : int + getminutes() : int + addminutes(int) : SimpleTime + equals(simplet ime) : boolean + compareto(simpletime) : int 11 Operator L operatore è caratterizzato da: Nome dell operatore Insieme di fasce applicabili Consente di: Ottenere un costo per intervallo per una certa data/ora (getcostperinterval) Verificare la validità dei dati (isvalid) Le fasce devono essere valide e, nel loro insieme, devono coprire tutte le ore di tutti i giorni della settimana class tlc Ba nd Operator - name: String - bands: Band ([]) + Operator(String, Band[]) + getname() : String + getbands() : Band[] + getcostperinterva l(date) : double - combineddays: DayOfWeekEnum ([]) - starttime: SimpleTime - endtime: SimpleTime -bands - costperinterval: double + Band(SimpleTime, SimpleTime, DayOfWeekEnum[], double) + getstarttime() : SimpleTime + getendtime() : SimpleTime + getcombineddays() : DayOfWeekEnum[] + getcostperinterval() : double + isinband(date) : boolean 12
Phone Plan Il piano telefonico è caratterizzato da: Nome del piano Intervallo standard Costo dello scatto alla risposta Un insieme di operatori (tutti quelli possibili?) Consente di: Ottenere il costo di una chiamata date le sue caratteristiche: il numero chiamato, l operatore di destinazione e la data/ora di inizio Verificare la validità del piano ogni operatore deve essere valido class tlc Plan - name: String - interval: int - startcallcost: double - operators: Operator ([]) + Plan(String, int, int, Operator[]) + getname() : String + getinterval() : int + getstartcallco st() : double + getcallcost(date, Date, String, String) : double -operators Operator - name: String - bands: Band ([]) + Operator(String, Band[]) + getname() : String + getbands() : Band[] + getcostperinterva l(date) : double 13 Gli algoritmi Fondamentalmente due (il resto è struttura) Calcolo del costo di una chiamata Verifica di validità del piano telefonico Nessuno dei due è veramente complicato perché: Il modo in cui sono strutturate le entità semplifica le cose siamo SMART! 14
Calcolo costo chiamata Plan.getCallCost Input: inizio/fine chiamata, nome operatore, numero dest. Selezionare l operatore dato il suo nome Chiedere all operatore il costo per intervallo dato l istante di inizio della chiamata (Operator.getCostPerInterval) Calcolare il numero di intervalli di cui è composta la durata della chiamata Differenza in millisecondi fra data/ora di inizio e fine chiamata, diviso per la durata dell intervallo Restituire il risultato del prodotto fra numero di intervalli e costo dell intervallo (recuperato in precedenza) Ipotesi semplificativa: se una chiamata cade a cavallo di due fasce orarie, si assume valido il costo per intervallo dell istante iniziale 15 Calcolo costo chiamata Operator.getCostPerInterval Input: istante di inizio chiamata Fra tutte le bande, recuperare quella che fornisce il costo per quell istante (Band.isInBand) Dalla banda recuperata, ottenere il costo per intervallo (Band.getCostPerInterval) 16
Verifica Validità Plan.isValid Verifica che tutti gli Operator siano validi Operator.isValid Verifica che tutte le Band siano valide Verifica che, per ogni giorno della settimana, siano coperte tutte le 24 ore Come fare? 17 Operator.isValid Verificare la validità di tutte le Band in blocco è improponibile Occorre dividere il problema: 1. Valutare la validità di ogni singolo giorno della settimana (metodo statico values() di DayOfWeekEnum) Selezionare le sole Band che afferiscono al giorno in analisi 2. Valutare la copertura di tutte le 24 ore di un giorno a. Ordinare le Band selezionate in base all ora di inizio b. Verificare che la prima Band dell insieme ordinato cominci alle 00:00 e che l ultima termini alle 23:59 c. Verificare che ogni Band nell elenco ordinato, tranne la prima e l ultima, cominci un minuto dopo la fine della Band precedente 18
Esercizio per casa Cosa accade se viene rimossa l ipotesi semplificativa sul calcolo del costo della chiamata? Come cambia il codice? 19