Università di Camerino Programmazione + Laboratorio AA 2012

Transcript

Università di Camerino Programmazione + Laboratorio AA 2012
Corso di Laurea in Informatica – Università di Camerino
Programmazione + Laboratorio A.A. 2012/2013
Assignment A1 di Laboratorio del 26/11/2012
Docente: Luca Tesei
Descrizione del codice da scrivere
Definire completamente una classe YouTubeVideo, contenente tutti i commenti alle parti pubbliche
in formato javadoc.
Un oggetto della classe YouTubeVideo ha, tra le altre cose:
• un utente che l'ha caricato (un nome utente univoco),
• un titolo,
• una data (e ora, fino ai minuti) di primo caricamento,
• una data (e ora, fino ai minuti) di ultima modifica (uguale alla data di caricamento se non ci
sono state modifiche),
• una lista (anche vuota) contenente i tag associati (un tag è una parola contenente solo lettere,
numeri e il carattere '-', che inizia per lettera).
Si scelgano i tipi opportuni per ogni valore (la lista di tag può essere rappresentata con una singola
stringa).
Tra gli altri modi in cui è possibile creare un oggetto YouTubeVideo, deve essere possibile crearne
uno solo con utente e titolo. In questo caso la data di caricamento corrisponde alla data e ora di
sistema nel momento in cui si crea l'oggetto (gli altri campi saranno inizializzati con valori iniziali
opportuni o con valori di default). La data e ora di sistema può essere recuperata chiamando
System.currentTimeMilliseconds() e poi i servizi offerti dalle classi
java.util.Calendar e java.util.GregorianCalendar (si consultino le API e/o si
cerchino tutorial disponibili su internet).
Deve essere anche possibile costruire uno YouTubeVideo a partire dall'utente, dal titolo, una certa
data di caricamento e una certa lista di tag.
Dato un oggetto YouTubeVideo, è possibile richiedere (tramite metodi get) l'utente, il titolo, la lista
di tag, la data di caricamento, la data di ultima modifica, il numero di visualizzazioni, il numero di
click su “mi piace”, il numero di click su “non mi piace”, il numero di commenti, il numero di voti
(da 0 a 10) ricevuti e la media dei voti ricevuti (numero in virgola mobile).
È possibile aggiornare la lista di tag tramite i metodi boolean inserisciTag(String nuovoTag) e boolean cancellaTag(String tagDaCancellare), in cui il valore di ritorno indica se
l'operazione è avvenuta con successo (true) o no (false). Un inserimento fallisce se il tag è già
presente e una cancellazione fallisce se il tag non è presente. I tag NON sono case-sensitive.
È possibile richiedere la visualizzazione del video void visualizza() (in questo caso
ovviamente la visualizzazione virtuale, il metodo deve solo ricordarsi che è stata chiesta una
visualizzazione e aggiornare quindi il numero di visulizzazioni.
Inoltre ci sono i metodi void miPiace() (aumenta il numero di “mi piace”), void nonMiPiace() (aumenta il numero dei non mi piace), boolean inserisciCommento(String commento) (il commento non va memorizzato, ma si deve
aggiornare il numero di commenti) e si deve controllare che il commento non contenga i caratteri
'#', '$', '%', '&' e ' ” '. In tal caso il commento non va inserito e viene restiuito il valore false.
È inoltre possibile aggiornare il video tramite void aggiorna(String nuovoTitolo),
oppure void aggiorna() il cui effetto è di mettere la data e ora di ultima modifica uguale alla
data e ora di sistema del momento in cui viene chiamato il metodo e di cambiare il titolo (solo nel
primo caso).
È infine possibile dare un voto con il metodo boolean vota(int voto), che aggiunge il voto
se e solo se è un numero intero da 0 a 10 (in caso contrario non lo inserisce e risponde false).
Dopo l'esecuzione di tale metodo se si richiede la media dei voti (numero in virgola mobile) si
ottiene il voto medio aggiornato con il voto appena inserito.
Si deve inoltre ridefinire il metodo equals e il metodo hashcode in accordo a criteri di uguaglianza
appropriati per oggetti YouTubeVideo (si identifichino delle variabili istanza immutabili che
identifichino univocamente nel tempo un certo YouTubeVideo).
Si deve ridefinire il metodo toString in modo da ottenere una stringa di descrizione dello
YouTubeVideo che mostri una descrizione completa dello stesso e che possa essere stampata in una
schermata formata da 80 caratteri in lunghezza e 25 caratteri in altezza:
----------------------------------------------80 caratteri-------------------------------------------------------------- …...
--- …...
…
--- 25 righe--------------------------------------------------------------------------------------------------------Successivamente alla definizione completa della classe YouTubeVideo, definire una classe Test che
esegua in sequenza i seguenti test:
1. Creare due oggetti film con i due costruttori disponibili. Stampare gli oggetti sullo schermo
nel formato definito dalla ridefinizione di toString
2. Creare due oggetti che abbiano gli stessi valori per i campi individuati come identificatori
unici dello stesso. Aggiornare uno degli oggetti tramite il metodo aggiorna(String)
cambiando il titolo. Controllare, tramite il metodo equals, che i due oggetti sono ancora
uguali.
3. Rispetto alla situazione precedente controllare che il metodo getTitolo() restituisca il nuovo
titolo sull'oggetto aggiornato.
4. Sempre rispetto alla situazione precedente controllare che il metodo hashCode() chiamato su
entrambi gli oggetti dia lo stesso numero intero.
5. Creare uno YouTubeVideo con i tag: “sport”, “MoDa”, “tv-web”. Togliere il tag “moda”,
inserire il tag “calcio”. Verificare che provando a cancellare il tag “mOdA” si ottenga come
risultato false.
6. Creare un oggetto YouTubeVideo, chiamare 10 volte il metodo visualizza(), 5 volte il
metodo miPiace(), 4 volte il metodo nonMiPiace(). Controllare che i metodi get
corrispondenti diano i numeri giusti. In questo caso fare un solo controllo per tutti i valori,
cioè stampare OK se e solo se tutti i metodi get in questione danno il valore giusto,
altrimenti stampare NonOK.
7. Creare un oggetto YouTubeVideo e inserire il commento -Ciao!-. Inserire poi il commento
-Non mi piacciono le ”- (i trattini delimitano la stringa da inserire come commento).
Controllare che nel caso del secondo commento la risposta del metodo sia false.
8. Rispetto alla situazione precendente controllare inoltre che il metodo get del numero di
commenti dia come valore 1.
9. Creare un oggetto YouTubeVideo, aggiungere prima un voto 5, poi in voto 8 e poi un voto 9.
A questo punto controllare che il metodo getMediaVoti() risponda con un valore a
virgola mobile uguale a 7.33 a meno di una costante di tolleranza per le approssimazioni
numeriche uguale a 1 x 10-2.
La classe Test deve avere un metodo main che stampa in sequenza:
Test 1:
------ stampa primo oggetto -----….
--------------------------------------------- stampa secondo oggetto -----….
---------------------------------------Test 2: OK (oppure NonOK se non è passato)
Test 3: OK (oppure NonOK se non è passato)
…..
Test 9: OK (oppure NonOK se non è passato)
Modalità di realizzazione e di consegna
Questo assignment va realizzato individualmente. Codice “troppo” simile scritto da diverse
persone potrà essere soggetto a una valutazione più bassa.
Si crei una cartella con il seguente nome “Lab1213A1CognomeNome” (ad esempio
“Lab1213A1TeseiLuca”) che contiene:
•
una sottocartella “codice” contenente YouTubeVideo.java, YouTubeVideo.class, Test.java e
Test.class
•
una sottocartella “doc” contentente i file html generati con javadoc relativi alle due classi
YouTubeVideo e Test
La cartella va poi compressa (formati accettati zip, rar, tgz) e allegata a una email dal seguente
formato:
•
from: [email protected] (se non si ha ancora l'accesso alla email
istituzionale usare un altro indirizzo email, ma mettersi al più presto in condizione di
utilizzare la email istituzionale)
•
to: [email protected]
•
oggetto: Consegna Assignment Lab1213A1
•
allegato: Lab1213A1CognomeNome.(zip | rar | tgz)
•
testo: Nome Cognome Anno di Immatricolazione (ad esempio Mario Rossi 2012/2013)
Errori nel formato della consegna comporteranno un abbassamento del voto.
L'email va spedita entro e non oltre le ore 23.59 di Domenica 9 Dicembre 2012. Farà fede la data e
l'ora della email. Email arrivate oltre la scadenza non saranno considerate e comporteranno un voto
0 per questo assignment.
Il valore percentuale di questo assignment rispetto al voto totale è 20%.