Milloin kutakin käytetään
Hyödyt ja kompromissit
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))
}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
- Infix-funktiot
- DSL-tyyppisten API:en rakentaminen
- tailrec-funktiot
- Milloin kutakin käytetään