Unes dades (o "data") és un conjunt de valors que estan relacionats i que es gestionen com un conjunt.
Introducció
…
Crea un projecte data amb Amper.
Dades
Unes dades són un conjunt de valors que ens interessa tractar i que agrupem en una estructura de dades.
Un exemple és id, name i married que agrupem en l’estructura Person
Aquesta estructura es pot implementar en Kotlin mitjançant un data class.
Modifica el fitxer src/main.kt
data class Person(
val id: Long,
val name: String,
val married: Boolean,
)
fun main() {
}Una estructura de dades sempre ha de ser immutable: totes les propietats de la classe són val.
A continuació crea algunes “dades”:
fun
val david val esther
}Executa l’aplicació:
.\amper runPots veure que un data class té algunes implementacions molt útils.
Person(id=2, name=Esther, married=true)Quan fas un “print” d’un objecte, aquest et mostra totes les propietats amb el seu valor:
Si comparo dues persones amb les mateixes propietats, el resultat és true.
Crea el fitxer test/DatTest.kt
import kotlin.test.Test
import kotlin.test.assertEquals
class DataTest {
@Test
fun testPerson() {
assertEquals(Person(1, "David", false), Person(1, "David", false))
}
}Si executo la tasca test tot es correcte 👌
.\amper test
BUILD SUCCESSFUL in 1sCom que les dades són inmutables, per modificar unes dades has de crear un objecte nou.
Amb un data class pots utilizar les dades antigues per crear dades noves indicant només la nova informació:
fun
val esther
val estherDivorced
}Amb la funció require dic a l’aplicació que el que dic és true o l’aplicació ha de petar amb un “Failed requirement” 💣🔥 !!.
Modificar el fitxer main.kt …
fun
val esther
}I equivoca’t:
.\amper runDoncs si … 🙄
Exception in thread "main" java.lang.IllegalArgumentException: Failed requirement.
at MainKt.main(main.kt:30)
at MainKt.main(main.kt)
ERROR: Task ':data:runJvm' failed: Process exited with exit code 1L’Esther encara no s’ha divorciat 😒 🤨 🥳
Mermaid
Mermaid ens permet crear el nostre diagrama de classes.
Instal.la el plugin Mermaid:
- Ctrl + Alt + S per obrir el menú “Settings”
- Selecciona Plugins
- Busca “Mermaid” i instal.la
Crea el fitxer REAMDE.md.
A Gitlab tens un exemple d’un diagrama de classes fet amb Mermaid.
Crea el diagrama de la classe Person:
Show solution
Composició
Un objecte pot estar composat d’altres objectes definits per altres classes.
Per exemple, una persona pot tenir una adreça:
En Kotlin tots són objectes!
Per tant, com que Long, String, etc. són objectes, no hi diferència entre els teus objectes i els objectes predefinits per Kotlin.
Modifica el fitxer main.kt:
val street: String,
val city: String,
val zipcode: String,
val country: String ,
)
val id: Long,
val name: String,
val address: Address,
)
fun }Crea el test corresponent:
Show solution
fun
val david
}
}Activitats
1. Modifica el fitxer README.md amb aquest nou disseny:
Show solution
classDiagram
class User {
id: Long
name: String
}
class Message {
id: Long
time: LocalTime
text: String
}
Message --> User : from
Message --> "1..*" User : to2. Modifica el fitxer main.kt amb les classes corresponents:
Show solution
val id: Long,
val name: String,
)
val id: Long,
val time: LocalTime,
val text: String,
val from: User,
val to: ,
)3. Modifica el fitxer DataTest.kt amb el test corresponent
Show solution
fun
val message 23, LocalTime., "Ens veiem a les 12",
from ,
to )
}
}Propietat derivada
Hi ha molts objectes que tenen propietats que es deriven d’altres propietats.
Per exemple, un rectangle té dos propietats bàsiques width i length.
Però també té altres propietats que es deriven d’aquestes propietats bàsiques, com poden ser area i perimeter.
fun
val r
val area
val perimeter
}Aquestes propietats derivades es poden definir a la declaració de la classe.
Per exemple, podem definir la propietat derivada area:
val area }
fun
val r
val perimeter
}Si fas un print de l’objecte r pots veure que no apareix la propietat derivada area:
Activitats
1.- Afegeix la propietat derivada perimeter a la classe Rectangle.
Show solution
val area val perimeter }
fun
val r
}2.- Defineix una classe Circle amb les propietats derivades més importants.
Show solution
val area val circumference val diameter }
fun
val c
fun Double.
}3.- A continuació tens el diagrama de la classe Patient d’un Hospital:
La classe Patient té els atributs derivats name i age:
nameés el nom complet i es deriva degivenNameifamilyName.ageés calcula en funció debirthDatei la data actual.
Modifica els fitxers README.md, main.kt i DataTest.kt:
README.md
Show solution
main.kt
Show solution
import java.time.LocalDate
class Patient (
val id: Long,
val givenName: String,
val familyName: String,
val birthDate: LocalDate,
val addmitted: LocalDate,
) {
val name get() = "${this.givenName} ${this.familyName}"
val age get() = LocalDate.now().year - this.birthDate.year
}
fun main() {
}DataTest.kt
Show solution
import java.time.LocalDate
import kotlin.test.*
class DataTest {
@Test
fun testPatient() {
val esther = Patient(
2, "Esther", "Parra",
LocalDate.of(1973, 1, 9), LocalDate.of(2024, 7, 6)
)
assertEquals(esther.age, 51)
}
}5- A continuació tens el diagrama de classes del prèstec d’un llibre d’una Biblioteca:
La classe BookBorrow té els atributs derivats dueData i isOverdue:
-
dueDataés la data de venciment de la devolució del llibre i es calcula en funció de la data del préstec i el període de préstec. -
overdueindica si el prèstec a vençut i és calcula en funció dedueDatei la data actual.
Modifica els fitxers README.md, main.kt i DataTest.kt:
README.md
Show solution
main.kt
Show solution
val id: Long,
val title: String,
val author: String
)
val id: Long,
val book: Book
)
val id: Long,
val date: LocalDate,
val loadPeriod: Long,
val copy: BookCopy)
val dueDate val isOverdue }
fun DataTest.kt
Show solution
fun
val borrow 1, LocalDate., 40,
)
}
}Herència
TODO
Activitat (Client)
1. Crea aquest diagrama:
Show solution
class Client {
id: Long
name: String
}2.- Crea el model de dades en el fitxer main.kt:
Show solution
val id: Long,
val name: String,
)
fun 3.- Crea els tests corresponents en el fitxer DataTest.kt:
Show solution
fun val david
}
}4.- Modifica el fitxer main.kt per tal que demani el nom a l’usuari i crei un nou usuari:
Show solution
val id: Long,
val name: String,
)
fun
val name val client
}Activitat (Sky)
Has de dissenyar el model de dades d’una aplicació que controla els vols d’avions dins del Cel Únic Europeu (Single European Sky, SES).
L’aplicació ha de tenir la informació dels diferents vols, on en cada vol consta l’aeroport d’origen i destí, data prevista d’enlairament i aterratge, avió que farà el vol, companyia aèrea, etc.
1.- Crea el diagrama de dades:
Show solution
2.- L’usuari ha de poder consultar els vols que tenen origen en un aeroport.
3. Crea un executable amb `amper package“:
El resultat està a la carpeta build/tasks.
java -jar .\build\tasks\_data_executableJarJvm\data-jvm-executable.jar