Kotlin Academy · Oppitunti

Milloin kutakin käytetään

Hyödyt ja kompromissit

Oppitunti 4/413 vaihetta

Milloin kutakin käytetään on ilmainen Kotlin Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Kotlin Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.

Kaksi työkalua, eri tehtävät

Infix-funktioissa on kyse luettavuudesta; tailrec-funktioissa on kyse turvallisesta ja tehokkaasta rekursiosta. Ne ratkaisevat toisistaan riippumattomia ongelmia.

infix fun Int.add(o: Int) = this + o

tailrec fun sum(n: Int, acc: Int = 0): Int =
    if (n == 0) acc else sum(n - 1, acc + n)

fun main() {
    println(2 add 3)
    println(sum(10))
}

Valitkaa infix sujuviin rajapintoihin

Käyttäkää infixiä, kun kutsu on luettavampi ilman pisteitä ja sulkeita, erityisesti DSL:issä ja Pairien rakentamisessa.

fun main() {
    val pair = "id" to 100
    println(pair)
}

Valitkaa tailrec syvään rekursioon

Käyttäkää tailrec-määritettä, kun rekursiivinen algoritmi voi olla niin syvä, että pino täyttyy.

tailrec fun count(n: Int, acc: Int = 0): Int =
    if (n == 0) acc else count(n - 1, acc + 1)

fun main() {
    println(count(50000))
}

Infixin kompromissit

Infix poistaa välimerkit, mikä voi heikentää epäselvää koodia lukevien ymmärrettävyyttä ja vaikeuttaa etusijajärjestyksen hahmottamista. Käyttäkää sitä vain, kun siitä on selkeää hyötyä.

infix fun Int.scaledBy(f: Int) = this * f

fun main() {
    println(5 scaledBy 3)
}

tailrecin kompromissit

Koodin muuttaminen häntärekursiiviseksi edellyttää usein akkumulaattoria, mikä voi tuntua suoraa silmukkaa mutkikkaammalta. Punnitkaa ilmaisuvoimaa ja yksinkertaisuutta.

tailrec fun product(n: Int, acc: Long = 1): Long =
    if (n <= 1) acc else product(n - 1, acc * n)

fun main() {
    println(product(6))
}

Kun silmukka on yksinkertaisempi

Jos tavallinen for- tai while-silmukka on selkeämpi kuin häntärekursio, suosikaa silmukkaa. Rekursio on työkalu, ei vaatimus.

fun sumLoop(n: Int): Int {
    var total = 0
    for (i in 1..n) total += i
    return total
}

fun main() {
    println(sumLoop(10))
}

Kun nimetty kutsu on selkeämpi

Jos infix-nimi ei ilmaise ilmeisen selkeää binaarista suhdetta, tavallinen metodikutsu välittää tarkoituksen paremmin.

data class Temp(val c: Int) {
    fun isWarmerThan(o: Temp) = c > o.c
}

fun main() {
    println(Temp(30).isWarmerThan(Temp(20)))
}

Molempien yhdistäminen

Ominaisuudet ovat toisistaan riippumattomia; sama ohjelma voi käyttää infixiä luettaviin kutsuihin ja tailreciä turvalliseen rekursioon.

infix fun Int.upto(n: Int) = (this..n).toList()

tailrec fun last(list: List<Int>): Int =
    if (list.size == 1) list[0] else last(list.drop(1))

fun main() {
    println(last(1 upto 5))
}

Luettavuuden tarkistuslista

Kysykää itseltänne: tekeekö infix kutsusta tulokkaalle selkeämmän? Estääkö tailrec todellisen pinon ylivuotoriskin? Jos ei, suosikaa tavallisia funktioita ja silmukoita.

fun main() {
    val r = (1..5).sum()
    println(r)
}

Suorituskykyä koskeva huomautus

tailrec tarjoaa silmukan kaltaisen suorituskyvyn vakion kokoisella pinolla. Infixillä ei ole ajonaikaisia kustannuksia; se on pelkästään syntaktinen ominaisuus.

tailrec fun pow(base: Int, exp: Int, acc: Long = 1): Long =
    if (exp == 0) acc else pow(base, exp - 1, acc * base)

fun main() {
    println(pow(2, 10))
}

Päätöksen yhteenveto

Infix: sujuvat yhden argumentin binäärityyliset kutsut. Tailrec: rekursio, jonka on toimittava turvallisesti suurilla syvyyksillä. Kumpikaan ei ole oletusratkaisu, vaan molemmat ovat harkittuja valintoja.

infix fun String.joinWith(o: String) = "$this-$o"

fun main() {
    println("a" joinWith "b")
}

Pikatarkistus

Testatkaa kummankin ominaisuuden käyttötarkoituksen ymmärtämistänne.

Kertaus

Opitte milloin kumpaakin käytetään:

  • Käyttäkää infix-määritettä sujuviin, luettaviin binäärityylisiin kutsuihin ja DSL:iin.
  • Käyttäkää tailrec-määritettä rekursioon, jonka on toimittava ilman pinon ylivuotoa.
  • Suosikaa tavallisia silmukoita tai nimettyjä funktioita, kun ne ovat selkeämpiä.
  • Ominaisuudet ovat toisistaan riippumattomia, ja niitä voi yhdistää.
infix fun Int.by(o: Int) = this * o
tailrec fun dec(n: Int): Int = if (n == 0) 0 else dec(n - 1)

fun main() {
    println(3 by 4)
    println(dec(1000))
}
Aloita maksutta

Opi Kotlin tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”Milloin kutakin käytetään” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Kotlin Academy-oppimispolun 3 oppituntia, myös oppitunnin “Milloin kutakin käytetään”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Milloin kutakin käytetään”?

Hyödyt ja kompromissit Harjoittelet Kotlin Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Kotlin Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Kotlin Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Milloin kutakin käytetään”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Kotlin Academy-oppitunnilla?

Kyllä. Jokainen Kotlin Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Infix-funktiot
  2. DSL-tyyppisten API:en rakentaminen
  3. tailrec-funktiot
  4. Milloin kutakin käytetään
← Takaisin: Kotlin Academy