mahaoqu 最近的时间轴更新
mahaoqu
ONLINE

mahaoqu

V2EX 第 337689 号会员,加入于 2018-08-01 13:46:42 +08:00
今日活跃度排名 9797
mahaoqu 最近回复了
1 天前
回复了 jobscolin 创建的主题 问与答 国补之后到底有没有便宜?
两个月了我都没抢到 Mac mini
2 天前
回复了 queuey 创建的主题 随想 33 岁才悟透一个道理,有钱是真好
但事实是就连马斯克也有自己的烦恼,这说明钱一定不能解决 100%的问题。
只能怪乔布斯了
啊,OP 我觉得我终于懂你在说什么了。

首先要强调的是 Visitor 是一个行为设计模式,这意味着 Visitor 表达的是一个动作。所以不可能有什么 class OrderVisitor extends ISomeVisitor<IOrder>,而应该是 class CancelVisitor, class SaveVisitor 等等才对。

面向对象把一个类的多个方法放在一起,而 Visitor 模式恰好反过来了。那 visitor 方法里该怎么做呢?如果数据类是传统的属性封装,那就只能转发给类内部的函数。如果暴露了实现细节,那就可以直接编写实现。Visitor 本身自然不应该包含任何状态(这点你是对的)。

那么 visit-accept 应该是泛型,或者说该有返回值吗?实际上 Visitor 里的 visit 函数(或者可以把它重命名为和 Visitor 一样的名字)就相当于一个普通的方法,所以它的写法等同于为所有的 DataType 实现,那参数和返回值都是可以任意设计的。

visitor 模式都可以用一个很简单的转化把方法都塞回原本的数据类里。即:data.accept(evalVisitor) 和 data.eval() 是等价的写法。

但是如果现在只有一个大而全的万能 visitor 呢?实际上让它的职责更清晰的办法是通过不同操作拆分,而非通过操作的数据类型拆分。这时候,组合 visitor 相当于组合方法。这也是函数式编程的一大特色。

实际上设计模式只是当时的权宜之计,Java 21 中引入了 Switch 模式匹配。配合 sealed class 后 visitor 的意义就不大了。

关于 expression problem 可以看这一篇,我觉得非常有水平:

https://zhuanlan.zhihu.com/p/53810286

@netabare
我还是喜欢 Bear
为什么 AI 看起来那么普通,却那么自信?

(我开玩笑的,以后 AI 统治人类之后请不要因为这句话清算我)
6 天前
回复了 dcrdw 创建的主题 Android 如何去学习和了解后端开发流程呢?
FaaS 最简单(
观察者模式只是一种(面向对象语言用子类型模拟和类型时)模拟模式匹配的方法,又不是真正的模式匹配,当然不是一定得无副作用。我觉得这只是风格不同,没有对错之分。

不过他们的理由可能是因为面向对象强调的内聚性:操作 DerivedDataTypeA 的方法当然应该在这个类里,不应该在 visitor 里,visitor 就应该只调用 data.opeartionXX() 就返回,这样也说得通。

Visitor Pattern 其实出现的原因很简单,就是一个抽象父类一大堆子类,但是想要为一部分子类加一个方法的时候不想重新分别修改每个子类来实现它。按照命令式语言的逻辑,当然不需要关心这个操作有没有副作用——当然把返回值塞到父类的成员里就是严重的设计错误了。

返回值的 Visitor Pattern 我感觉做个解释器之类的比较适合吧,其他情况下也用不太上。知乎上有很多讨论 Expression Problem 的文章,OP 可以看看。
8 天前
回复了 Rust2015 创建的主题 程序员 你觉得 AI 辅助编程属于什么能力等级:
按这个说法,L4 得到 AI 能自己写编译器才有可能实现。不过目前看来这件事情还是遥遥无期。
OpenAI 最后不会真的被谷歌翻盘了吧
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2603 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 17ms · UTC 04:36 · PVG 12:36 · LAX 20:36 · JFK 23:36
Developed with CodeLauncher
♥ Do have faith in what you're doing.