Kotlin Academy · Oppitunti

Parhaat käytännöt

Pidä operaattorit intuitiivisina

Oppitunti 4/413 vaihetta

Parhaat käytännöt 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.

Pitäkää operaattorit intuitiivisina

Ylikuormittakaa operaattori vain, kun sen merkitys on ilmeinen. Vektoreilla + on selkeä merkitys; sähköpostin lähettämistä tarkoittava + ei ole.

data class Vec(val x: Int, val y: Int) {
    operator fun plus(o: Vec) = Vec(x + o.x, y + o.y)
}

fun main() {
    println(Vec(1, 2) + Vec(3, 4))
}

Säilyttäkää odotettu semantiikka

Noudattakaa tavanomaista algebraa: a + b-lausekkeen tulisi vaikuttaa kommutatiiviselta symmetristen tyyppien yhteydessä eikä yllättää lukijaa.

data class Money(val cents: Int) {
    operator fun plus(o: Money) = Money(cents + o.cents)
}

fun main() {
    println(Money(100) + Money(50))
}

Suosikaa muuttumattomuutta

plus-operaattorien tulisi palauttaa uusi arvo sen sijaan, että ne muuttaisivat vastaanottajaa, kuten luvut toimivat.

data class Point(val x: Int) {
    operator fun plus(o: Point) = Point(x + o.x)
}

fun main() {
    val a = Point(1)
    val b = a + Point(2)
    println("${a.x} ${b.x}")
}

plus vs plusAssign

Määritelkää plus muuttumattomille arvoille ja plusAssign muokattavien säilöjen muuttamiseen paikan päällä. Välttäkää määrittelemästä molempia ristiriitaisella toiminnalla.

class Cart {
    val items = mutableListOf<String>()
    operator fun plusAssign(item: String) { items.add(item) }
}

fun main() {
    val c = Cart()
    c += "book"
    println(c.items)
}

Täsmäyttäkää paluutyypit

Palauttakaa binäärioperaattoreista sama tyyppi, jotta tuloksia voidaan ketjuttaa luontevasti.

data class N(val v: Int) {
    operator fun plus(o: N) = N(v + o.v)
}

fun main() {
    println((N(1) + N(2) + N(3)).v)
}

Älkää ylikuormittako näppäryyden vuoksi

Jos nimetty funktio on selkeämpi, käyttäkää sitä. Operaattorit on tarkoitettu aidosti numeeriseen tai säilömäiseen semantiikkaan, eivät arvoituksiin.

data class Log(val lines: List<String>) {
    fun append(line: String) = Log(lines + line)
}

fun main() {
    println(Log(emptyList()).append("start").lines)
}

Pitäkää equals ja hashCode johdonmukaisina

Jos ylikuormitatte vertailun tai yhtäsuuruuden, pitäkää equals ja hashCode synkronoituina rikkinäisten kokoelmien välttämiseksi.

data class Id(val v: Int)

fun main() {
    val set = hashSetOf(Id(1), Id(1))
    println(set.size)
}

Huomioikaa operaattorien etusijajärjestys

Ylikuormitetut operaattorit säilyttävät sisäänrakennetun etusijajärjestyksen. Suunnitelkaa toteutus niin, että luonteva etusijajärjestys tuottaa odotetut tulokset.

data class N(val v: Int) {
    operator fun plus(o: N) = N(v + o.v)
    operator fun times(o: N) = N(v * o.v)
}

fun main() {
    println((N(2) + N(3) * N(4)).v)
}

Dokumentoikaa yllättävät operaattorit

Jos operaattori tekee jotain epäintuitiivista, lisätkää kommentti tai KDoc, jotta kutsujat eivät johdu harhaan.

data class Range2(val start: Int, val end: Int) {
    // contains: is value inside the range?
    operator fun contains(v: Int) = v in start..end
}

fun main() {
    println(5 in Range2(1, 10))
}

Käyttäkää contains-funktiota in-operaatiossa

in-operaattori vastaa contains-funktiota. Määritelkää se uudelleen vain, kun jäsenyys on tyypillänne selkeästi määritelty.

class Team(val members: List<String>) {
    operator fun contains(name: String) = name in members
}

fun main() {
    val t = Team(listOf("Ann", "Bo"))
    println("Ann" in t)
}

Jos epäröitte, käyttäkää funktiota

Selkeästi nimetty metodi on lähes aina turvallisempi kuin epäselvä operaattori. Varatkaa ylikuormitus tilanteisiin, joissa se todella parantaa luettavuutta.

data class Temperature(val c: Int) {
    fun warmerThan(o: Temperature) = c > o.c
}

fun main() {
    println(Temperature(30).warmerThan(Temperature(20)))
}

Pikatarkistus

Testatkaa operaattorien ylikuormituksen parhaiden käytäntöjen ymmärtämistänne.

Kertaus

Opitte operaattorien ylikuormituksen parhaat käytännöt:

  • Ylikuormittakaa vain, kun merkitys on ilmeinen ja tavanomainen.
  • Suosikaa muuttumattomia, saman tyypin palautusarvoja ja pitäkää tulokset ketjutettavina.
  • Erottakaa plus (arvo) ja plusAssign (muuttaminen).
  • Pitäkää equals ja hashCode johdonmukaisina ja suosikaa nimettyjä funktioita, kun ne ovat selkeämpiä.
data class V(val x: Int) {
    operator fun plus(o: V) = V(x + o.x)
}

fun main() {
    println((V(2) + V(5)).x)
}
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 ”Parhaat käytännöt” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Kotlin Academy-oppimispolun 3 oppituntia, myös oppitunnin “Parhaat käytännöt”. 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 ”Parhaat käytännöt”?

Pidä operaattorit intuitiivisina 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 ”Parhaat käytännöt”-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. Operaattorifunktiot
  2. Vertailuoperaattorit
  3. Indeksointi ja kutsuminen
  4. Parhaat käytännöt
← Takaisin: Kotlin Academy