gpt4 book ai didi

design-patterns - 在 Kotlin 中实现访问者模式的最佳方式

转载 作者:行者123 更新时间:2023-12-04 17:46:12 24 4
gpt4 key购买 nike

是否有实现 visitor pattern 的任何技巧或常用方法?在 Kotlin ?任何对初学者来说可能不明显的东西,但会导致更简洁或有组织的代码。

编辑澄清:我有一个 AST其中包含许多(~30)类型的节点。目前每个类都实现了自己的 print()方法,我想将其分解为一个单独的 Printer 类。有了访问者模式,添加其他 AST 遍历类会更清晰,其中将有几个。

最佳答案

阅读 this answer对于 Java 8,它所说的一切也适用于 Kotlin:

The additions made to the Java language do not render every old concept outdated. In fact, the Visitor pattern is very good at supporting adding of new operations.



这适用于 Kotlin。像 Java 8 一样,它有 Lambdas , SAM conversions , 和 interfaces that allow default implementations .

一个变化是如果你在做类实例类型检查,而不是使用一个大的 if每个声明 instanceof检查,使用 when expression在 Kotlin :

在同一个 Stackoverflow 页面的不同答案中,它谈到了正在使用的 Lambdas 并显示 if Java 中的语句决定调用哪个 lambda。而不是他们的 Java sample :

if (animal instanceof Cat) {
catAction.accept((Cat) animal);
} else if (animal instanceof Dog) {
dogAction.accept((Dog) animal);
} else if (animal instanceof Fish) {
fishAction.accept((Fish) animal);
} else if (animal instanceof Bird) {
birdAction.accept((Bird) animal);
} else {
throw new AssertionError(animal.getClass());
}

使用这个 Kotlin:
when (animal) {
is Cat -> catAction.accept(animal)
is Dog -> dogAction.accept(animal)
is Fish -> fishAction.accept(animal)
is Bird -> birdAction.accept(animal)
else -> throw AssertionError(animal.javaClass)
}

在 Kotlin 中你不需要转换,因为 smart cast当编译器看到 is 时自动生成检查实例类型。

同样在 Kotlin 中你可以使用 Sealed Classes在层次结构中表示您可能的选项,然后编译器可以确定您是否已经用尽了所有情况,这意味着您不需要 elsewhen陈述。

否则,该页面上的内容以及同一问题的其他常见答案对 Kotlin 来说都是很好的信息。我认为在 Java 8、Scala 或 Kotlin 中看到实际文字访问者模式并不常见,而是使用 lambda 和/或模式匹配进行一些变体。

其他相关文章:
  • Visitor pattern with Java 8 default methods (Kotlin 也有)
  • Visitor pattern vs. lambda abstractions in Java 8 (Kotlin 也有 lambdas)
  • Visitor Pattern Java 8 Lambda implementation (Kotlin 也有 lambda,记得使用 when 而不是大的 if)
  • 关于design-patterns - 在 Kotlin 中实现访问者模式的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33602705/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com