Llicència
Pots copiar i redistribuir aquest material seguint la llicència Attribution-NonCommercial-ShareAlike 4.0 International CC BY-NC-SA 4.0, indicant-ne autors originals, l'origen (aquesta web), sense fins comercials i mantenint-ne aquesta la llicència
Autors:
Projecte de disseny modular: FilmITB
Sumari
Objectiu
Implementarem un programa per gestionar una plataforma de pel·lícules anomenada FilmITB
El programa tindrà una "interfície d'usuari" (a través de la línia de comandes), que mostrarà un menú en el que l'usuari triarà les diferent accions que permetran executar el nostre programa.
Les diferents tasques que FilmITB durà a terme són:
- La gestió de pel·lícules (afegir, mostrar-les totes, eliminar, modificar, mostrar els likes)
- La gestió d'usuaris (crear, mostrar, mostrar-los tots, modificar, eliminar, canviar d'usuari, mostrar dades estadístiques)
- Les interaccions dels usuaris amb les pel·lícules (veure pel·lícula, mostrar pel·lícules vistes, fer likes, mostrar pel·lícules preferides i recomanacions)
En aquesta pràctica s'avaluaran els continguts de la UF2-M03 i UF2-M05
Metodologia de treball
- El projecte es fa en equip (2 persones)
- Crea un nou projecte, anomenat projecte-uf2-cognomAlumne1nom-cognomAlumne2nom on cognom1nom i cognom2nom fan referència al primer cognom i el nom de cada integrant del grup, en ordre alfabètic.
- Es treballarà amb un projecte compartit de GIT
- Cal fer una petita tasca de disseny i pensar quines classes i arxius tindrem. Per cada classe o arxiu haurem de pensar quins atributs o propietats hi haurà i de quines funcionalitats constarà.
- Agruparem les classes en packages: el package model inclourà la lògica de negoci, el package ui inclourà les classes que interactuen amb l'usuari (lectura de dades i mostrar dades)
- També caldrà fer una divisió de tasques entre els membres de l'equip i una programació en funció de la previsió del temps.
- Pararem especial atenció a la modularitat i al desgranament de cada tasca en funcions, seguirem el principis següents:
- The single-responsibility principle: Cada funció té una única responsabilitat i totes les funció d'una classe han d'estar alineades per gestionar tasques comunes
- Reuse of code
- Separation of concerns
- Tot el codi que no formi part de la interfície gràfica ha d'estar testejat per tests unitaris amb una cobertura del 100%.
Menús
Welcome to FilmItb:
1: User
2: Films
3: Search
0: Exit
Cada una d'aquestes opcions ha de mostrar un altre submenú, amb les opcions de cada apartat.
Users:
1: Add user
2: Show my user
3: View users
4: Update user
5: Delete user
6: Change User
7: Show statistics
0: Return to main menu
Films:
1: Add film
2: Show films
3: Delete films
4: Watch films
5: View watched films
6: Add film to favorites
7: Show favorites
8: Show likes per film
0: Return to main menu
Search methods:
1: By title
2: By director
3: By main actor
4: By genere
5: By length
6: Not watched
7: Recomended
0: Return to main menu
Package ui
Class AppState
No tindrem variables globals, com ara currentUser, si no que considerarem que aquest tipus de variables formaran part de l'estat de l'aplicació i estaran dins de la classe AppState.
Class UI
Conté el main on es declara l'únic scanner del projecte. El mètode main només farà una única acció, cridar al mètode start() de la classe UI.
El mètode start ha de fer les inicialitzacions necessàries, mostrar el menú i llegir l'opció escollida.
Class UserUI, FilmUI, SearchUi
Aquestes classes seran les responsables de mostrar el submenú i recollir la opció del submenú.
Implementarem un mètode per cada opció del menú, aquests mètodes mostraran la informació a l'usuari i la recolliran les dades, però en cap cas manipularan les dades (no en faran gestions ni càlculs)
Exemple:
private fun addFavorites() {
println("Enter a favorite film")
val title = sc.nextLine()
filmItb.addFavorite(title, currentUser!!)
}
- tindrà un mètode setCurrentUser, que farà de login o bé modificarà el current user. Serà útil que tan bon punt comenci el programa s'executi aquest mètode, així totes les funcions que necessitin estar associades a l'usuari actual no generaran error
Package model
Class Film, User
Aquestes són les classes que ens permetran crear pel·lícules i usuaris
Aquestes classes fonamentals és possible que pràcticament no tinguin mètodes.
Consta de la constructora de la classe. Serà necessari que indiquis que són data classes, això ens permetrà accedir als diferents paràmetres i altres avantatges que veurem més endavant.
FilmItb
Tindrà la llista de pel·lícules i la llista d'usuaris. Pràcticament aquí hi trobarem tots els mètodes que operen amb les dades (la lògica de negoci).
Tindrem una única instància d'aquesta classe, que l'afegirem a l'appState
Creativitat (ampliació)
Show statistics (Users)
Aquí sou vosaltres qui heu de decidir les dades que voldreu mostrar. Heu d'intentar que sigui informació útil i interessant. Volem que FilmITB sigui usable i per tant no desenvoluparem un apartat per no ser consultat.
Recomended (Search)
Heu de dissenyar i implementar un algorisme per recomanar pel·lícules, és una de les funcions més importants, ja que sabem que l'usuari no vol perdre temps cercant què mirar i també sabem que si l'usuari mira pel·lícules que no li agraden, estarà poc satisfet i acabarà abandonant la nostre plataforma.
Per tant cal dissenyar un algorisme que retorni un llistat de pel·lícules que li agradin a l'usuari.
Joc de proves
Per tal de que pugueu testejar la vostra aplicació us proporcionem un joc de proves.
El joc de proves complet conté l'entrada i la sortida, el que no és complet només conté les entrades.
Podeu redirigir l'entrada de dades de la vostra pràctica per a què la llegeixi de l'arxiu. Per fer-ho heu de modificar "run configurations"
Al costat del menú de play on indica la classe de la qual es farà el run desplegueu el menú indicat amb la fletxeta. Clickeu a edit configurations i seleccioneu "redirect input from" i selecciona la ruta del joc de proves (només entrada, no el complet)
Joc Film Complet
Joc Film Proves
Joc Search Complet
Joc Search Proves
Joc d'Usuaris Complet
Joc d'Usuaris Proves
Tingueu en compte que aquest joc de proves és bàsic i no estan testejades totes les opcions, ni es contemplen tots els casos.
Test unitari
Cada una de les classes i funcions ha de tenir els testos unitaris pertinents i heu d'aconseguir tenir un 100% de coverage de tot el codi que no formi part de la interfície gràfica (package ui). Recordeu que fer els testos durant el desenvolupament us pot ser molt útil, no els deixeu pel final.
Aquesta part de la pràctica servirà per evaluar la UF2-M05.
Càlcul de la nota
Es valoraran els següents apartats que tindran la següent ponderació:
- Menús 2p
- Model 0.5p
- Operacions CRUD 2.5p
- Search 2p
- Estadístiques 1.5p
- Recomanador 1.5p
Per tenir la màxima puntuació en els diferents apartats és valorarà:
- El funcionament correcte i eficient
- Estructura modular correcta
- Organització en classes (anàlisi descendent)
- Organització en funcions
- Realització correcta de les crides a funcions i la seva parametrització.
- Àmbit de les variables
- Nomenclatura adecuada de variables i funcions
- Claredat del codi
- Treball en equip
- En les ampliacions es valorarà la innovació i creativitat de la solució així com també els ítems anteriors