Template Pengunjung sudah tidak digunakan lagi untuk Kotlin, tetapi perlu diketahui

Pertimbangkan pola desain Pengunjung dan tunjukkan bahwa Anda tidak boleh menggunakannya saat pemrograman di Kotlin. Akan ada teori, implementasi minimalis, implementasi penggantian dan argumen untuk penggantian, didukung oleh penelitian praktis. Tidak akan ada diagram kelas. Anda dapat mencoba semuanya secara online di play.kotlinlang.org



Pada saya ekstrim , JSON . Finite State Machine, Visitor. State Machine , Visitor, — "!". , , . — , , . — , . — .



Visitor. . , LinkedIn , , . Visitor , ( ). Hollywood Agent — " — ". - . , . Python JavaScript . "", — — , . Java .


, , ( ) . , , ( ), . — . Kotlin " " , ( , ).


— Visitor . Visitor , , . , , , , . , , , , . Visitor.



, : . sealed class , .
: .


fun main() {
    Guest().visit( Human(""))
    Guest().visit( Cat(""))
}

sealed class LivingCreature
class Human(val name: String): LivingCreature()
class Cat(val colour: String): LivingCreature()

interface Visitor {
    fun visit(creature : Human)
    fun visit(creature : Cat)
}
class Guest: Visitor {
    override fun visit(human: Human) = println("  ${human.name}")
    override fun visit(pet: Cat) = println("  (  ${pet.colour})")
}

— . , visit . , Human Cat LivingCreature. :


fun main() {
    val human: LivingCreature = Human("")
    val cat  : LivingCreature = Cat("")
    Guest().visit( human) 
    Guest().visit( cat )
}

sealed class LivingCreature
class Human(val name: String): LivingCreature()
class Cat(val colour: String): LivingCreature()

interface Visitor {
    fun visit(creature : Human)
    fun visit(creature : Cat)
}
class Guest: Visitor {
    override fun visit(human: Human) = println("  ${human.name}")
    override fun visit(pet: Cat) = println("  (  ${pet.colour})")
}

, visit(LivingCreature). , , — , , . , , .


Visitor. , , — Human Cat, , Guest (Visitor) . LivingCreature Visitor visit, .


fun main() {
    val human: LivingCreature = Human("")
    val cat  : LivingCreature = Cat("")
    human.accept( Guest() ) //   LivingCreature.accept( Visitor ),         
    cat.accept( Guest() ) // 
}

sealed class LivingCreature {
    abstract fun accept(visitor: Visitor) //    inline fun -     
}
interface Visitor {
    fun visit(creature : Human)
    fun visit(creature : Cat)
}
class Human(val name: String): LivingCreature() {
    override fun accept(visitor: Visitor) = visitor.visit(this) //    Human,    visit(Human)  -
}
class Cat(val colour: String): LivingCreature(){
    override fun accept(visitor: Visitor) = visitor.visit(this) //    Cat,    visit(Cat)  -
}

class Guest : Visitor{
    override fun visit(creature : Human) = println("  ${creature.name}")
    override fun visit(creature : Cat) = println("  (  ${creature.colour})")
}

inline fun , - .
visit , — ( ) . accept, — . Visitor.


— . . — accept. , . , — . Visitor.


, Visitor — , - .


" "?


LivingCreature Visitor.visit(LivingCreature)?


fun main() {
    val human: LivingCreature = Human("")
    val cat  : LivingCreature = Cat("")
    Guest().visit(human )
    Guest().visit( cat )
}

sealed class LivingCreature 
interface Visitor {
    fun visit(creature: LivingCreature)
}
class Human(val name: String): LivingCreature()
class Cat(val colour: String): LivingCreature()

class Guest : Visitor{
    override fun visit(creature : LivingCreature) = when(creature) {
        is Human -> println( "  ${creature.name}")
        is Cat -> println( "  (  ${creature.colour} ) ")
    }
}

, , . . ? , Java instanceof , , , JVM — Java. - — ++. "" . - , instanceof , JVM. , JVM .


Ternyata Anda dapat menulis tes kinerja Kotlin dan Java di JHM , yang saya lakukan. Hasilnya mengejutkan saya - versi dengan Pengunjung berfungsi berkali-kali lebih lambat daripada versi dengan ketika / pemain cerdas . Anda dapat melihatnya di sini:
repositori saya di GitHub


temuan


  • Pengunjung adalah latihan yang bagus untuk pikiran dan saya akan sangat merekomendasikan mencobanya dalam situasi yang tidak terduga, tetapi karena minat akademis.
  • Pengunjung meningkatkan kode Java visual dan memungkinkan Anda untuk mengekspresikan perilaku lebih jelas. Pilihan yang baik untuk generator, pola penangan kejadian (lihat ANTLR).
  • Pengunjung kehilangan keterbacaan dan kinerja karena solusi "naif" di Kotlin karena kekhasan bahasa.

All Articles