Kotlin Academy · leksjon

Bruksområder

Modellering av domener

Leksjon 3 av 413 trinn

Bruksområder er en gratis leksjon i Kotlin Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Kotlin Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Kotlin Academy inneholder totalt 4 leksjoner.

Modellere domenet

Value classes er svært nyttige i domene­modellering. De gjør anonyme primitive verdier om til meningsfulle, feilsikre typer uten kostnader ved kjøring.

La oss se på realistiske scenarier.

Typesikre identifikatorer

Separate ID-typer forhindrer at De sender en bruker-ID der en ordre-ID hører hjemme – en vanlig og kostbar feil.

@JvmInline
value class UserId(val value: Long)
@JvmInline
value class OrderId(val value: Long)

fun fetchUser(id: UserId) = "user " + id.value

fun main() {
    println(fetchUser(UserId(7)))
}

Måleenheter

Ved å pakke inn tall i enhetstyper unngår De å legge sammen meter og sekunder ved et uhell, samtidig som betydningen blir tydelig.

@JvmInline
value class Kilograms(val value: Double)

fun describe(weight: Kilograms) = weight.value.toString() + " kg"

fun main() {
    println(describe(Kilograms(72.5)))
}

Validerte strenger

Kombiner en value class med en init-blokk for å garantere invarianter, for eksempel at en e-postadresse ikke er tom eller bare består av mellomrom.

@JvmInline
value class Email(val value: String) {
    init {
        require(value.contains("@")) { "invalid email" }
    }
}

fun main() {
    println(Email("a@b.com").value)
}

Penger med atferd

Representer penger i den minste enheten og legg til operasjoner for å unngå feil med flyttall i valuta­beregninger.

@JvmInline
value class Cents(val value: Long) {
    operator fun plus(other: Cents) = Cents(value + other.value)
    fun format() = "$" + value / 100.0
}

fun main() {
    val total = Cents(1500) + Cents(250)
    println(total.format())
}

Selvdokumenterende API-er

En funksjonssignatur med value classes er langt tydeligere enn en med tre løse heltall.

@JvmInline
value class Width(val px: Int)
@JvmInline
value class Height(val px: Int)

fun area(w: Width, h: Height) = w.px * h.px

fun main() {
    println(area(Width(4), Height(5)))
}

Pakke inn sensitive data

En value class kan overstyre toString for å skjule hemmeligheter i logger, samtidig som råverdien fortsatt er tilgjengelig.

@JvmInline
value class Token(val value: String) {
    override fun toString() = "Token(***)"
}

fun main() {
    val t = Token("abc123")
    println(t)          // masked
    println(t.value)    // real value when needed
}

Håndheve intervaller

Bruk value classes til å samle intervallregler på ett sted, slik at ugyldige tilstander ikke kan konstrueres noe sted.

@JvmInline
value class Rating(val stars: Int) {
    init {
        require(stars in 1..5) { "stars must be 1..5" }
    }
}

fun main() {
    println(Rating(4).stars)
}

Smarte konstruktører

Kombiner en value class med en fabrikk i companion-objektet som returnerer null ved ugyldige inndata, slik at unntak unngås ved forventede feil.

@JvmInline
value class Age(val value: Int) {
    companion object {
        fun of(n: Int): Age? = if (n in 0..150) Age(n) else null
    }
}

fun main() {
    println(Age.of(30)?.value)
    println(Age.of(-5))
}

Oppsummering av mønstre

Vanlige mønstre for value classes:

  • Typesikre ID-er for å forhindre forvekslinger
  • Måleenheter
  • Validerte primitive verdier med init
  • Domenespesifikke operasjoner via operatorer
  • Maskerte sensitive verdier

Sikkerhet til lav kostnad

Fordi value classes vanligvis inline-es, får De all denne tydeligheten og sikkerheten i domenet til praktisk talt ingen kostnad ved kjøring. De er en enkel måte å gjøre ulovlige tilstander umulige å representere på.

Kort kontroll

Test forståelsen Deres av bruksområdene for value classes.

Oppsummering

De har sett praktiske bruksområder for value classes:

  • Typesikre ID-er, enheter og validerte strenger
  • Penger og domenespesifikke operasjoner
  • Maskering av hemmeligheter og smarte konstruktører

Deretter: begrensningene til value classes.

Gratis å komme i gang

Lær deg Kotlin med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
51
Leksjoner
203

Ofte stilte spørsmål

Er leksjonen «Bruksområder» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Kotlin Academy, inkludert «Bruksområder», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Kotlin Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Bruksområder»?

Modellering av domener Du øver på Kotlin Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Kotlin Academy?

Ingen tidligere erfaring er nødvendig. Kotlin Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Bruksområder»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Kotlin Academy-leksjonen?

Ja. Alle Kotlin Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Typealiaser
  2. Inline-verdi-klasser
  3. Bruksområder
  4. Begrensninger
← Tilbake til Kotlin Academy