рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛ рдХреЛрдЯрд▓рд┐рди рдХреЗ рд▓рд┐рдП рдкрджрд╛рд╡рдирдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд╛рдирдиреЗ рд▓рд╛рдпрдХ рд╣реИ

рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдФрд░ рджрд┐рдЦрд╛рдПрдВ рдХрд┐ рдЖрдкрдХреЛ рдХреЛрдЯрд▓рд┐рди рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реЛрдЧрд╛, рдПрдХ рдиреНрдпреВрдирддрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рддрд░реНрдХ, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрд╕рдВрдзрд╛рди рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рддред рдХреЛрдИ рд╡рд░реНрдЧ рдЖрд░реЗрдЦ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЖрдк play.kotlinlang.org рдкрд░ рдСрдирд▓рд╛рдЗрди рд╕рдм рдХреБрдЫ рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ



рдореБрдЭ рдкрд░ рдЪрд░рдо , 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 .


рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЖрдк рдЬреЗрдПрдЪрдПрдо рдореЗрдВ рдХреЛрдЯрд▓рд┐рди рдФрд░ рдЬрд╛рд╡рд╛ рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ , рдЬреЛ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ рдерд╛ред рдкрд░рд┐рдгрд╛рдо рдиреЗ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░ рджрд┐рдпрд╛ - рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг рд╡рд░реНрдЬрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдИ рдЧреБрдирд╛ рдзреАрдорд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм / рд╕реНрдорд╛рд░реНрдЯ рдХрд╛рд╕реНрдЯ рдХреЗ рд╕рд╛рде ред рдЖрдк рдЗрд╕реЗ рдпрд╣рд╛рдБ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
GitHub рдкрд░ рдореЗрд░рд╛ рднрдВрдбрд╛рд░


рдЬрд╛рдБрдЪ - рдкрд░рд┐рдгрд╛рдо


  • рдЖрдЧрдВрддреБрдХ рдорди рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рд╛рди рдЕрднреНрдпрд╛рд╕ рд╣реИ рдФрд░ рдореИрдВ рдЕрддреНрдпрдзрд┐рдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдХрд╛рджрдорд┐рдХ рд░реБрдЪрд┐ рд╕реЗ рдмрд╛рд╣рд░ред
  • рд╡рд┐рдЬрд╝рд┐рдЯрд░ рджреГрд╢реНрдп рдЬрд╛рд╡рд╛ рдХреЛрдб рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЬрдирд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк, рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдкреИрдЯрд░реНрди (ANTLR рджреЗрдЦреЗрдВ)ред
  • рдЖрдЧрдВрддреБрдХ рднрд╛рд╖рд╛ рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдХреЗ рдХрд╛рд░рдг рдХреЛрдЯрд▓рд┐рди рдкрд░ "рднреЛрд▓реЗ" рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдкрдардиреАрдпрддрд╛ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЦреЛ рджреЗрддрд╛ рд╣реИред

All Articles