تم إهمال قالب الزائر لـ Kotlin ، لكن من الجدير أن تعرف

ضع في اعتبارك نمط تصميم الزائر وأظهر أنه لا يجب استخدامه عند البرمجة على Kotlin. ستكون هناك نظرية ، وتنفيذ أضيق الحدود ، وتنفيذ الاستبدال والحجج لصالح الاستبدال ، مدعومة بالبحث العملي. لن يكون هناك مخططات للصف. يمكنك تجربة كل شيء عبر الإنترنت على play.kotlinlang.org



على بلدي أقصىجاء آخر مكان للعمل في خدمة microservice التي حولت JSON سيئة إلى أقل سوءًا. قام المطور بتثبيت آلة Finite State Machine ، وألقى قالب زائر في الأعلى. حول State Machine ليست مثيرة للاهتمام للغاية ، ولكن عندما رأيت الزائر ، قمت بالزفير - "واو!". هذا نادر جدًا ، لأنني أعتقد أن هذه التقنية نادرًا ما يمكن لأي شخص فهمها بشكل صحيح . هناك ظاهرة واضحة للفهم الكاذب - تبدو مفهومة ، لكنهم لا يرون قابليتها للتطبيق في نطاق فارغ تمامًا ومبدأ الهروب من العمل ، من غير المريح التفكير في الأمر. عادة ما يتم قبوله من قبل مطوري المترجمين وما شابه - مما يشير إلى المستوى العالي اللازم لإتقان. لكن النطاق أوسع بكثير - من الصعب ببساطة التعرف عليه.


نظرية واسعة


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 .


اتضح أنه يمكنك كتابة اختبارات أداء Kotlin و Java في JHM ، وهو ما فعلته. فاجأتني النتيجة - الإصدار مع الزائر يعمل أبطأ عدة مرات من الإصدار مع / smart cast . يمكنك رؤيته هنا:
مستودعي على GitHub


الموجودات


  • الزائر هو تمرين رائع للعقل وأنا أوصي بشدة بتجربته في مواقف غير متوقعة ، ولكن من باب الاهتمام الأكاديمي.
  • يحسّن الزائر رمز جافا المرئي ويسمح لك بالتعبير عن السلوك بشكل أكثر وضوحًا. خيار جيد للمولدات وأنماط معالج الأحداث (انظر ANTLR).
  • يفقد الزائر في سهولة القراءة والأداء للحل "الساذج" في Kotlin بسبب خصوصية اللغة.

All Articles