ضع في اعتبارك نمط تصميم الزائر وأظهر أنه لا يجب استخدامه عند البرمجة على Kotlin. ستكون هناك نظرية ، وتنفيذ أضيق الحدود ، وتنفيذ الاستبدال والحجج لصالح الاستبدال ، مدعومة بالبحث العملي. لن يكون هناك مخططات للصف. يمكنك تجربة كل شيء عبر الإنترنت على play.kotlinlang.org
![](https://habrastorage.org/webt/of/hw/mz/ofhwmzd-h924ludk2tfnketjpbq.jpeg)
على بلدي أقصىجاء آخر مكان للعمل في خدمة 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() )
cat.accept( Guest() )
}
sealed class LivingCreature {
abstract fun accept(visitor: Visitor)
}
interface Visitor {
fun visit(creature : Human)
fun visit(creature : Cat)
}
class Human(val name: String): LivingCreature() {
override fun accept(visitor: Visitor) = visitor.visit(this)
}
class Cat(val colour: String): LivingCreature(){
override fun accept(visitor: Visitor) = visitor.visit(this)
}
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 بسبب خصوصية اللغة.