mahaoqu 最近的时间轴更新
mahaoqu's repos on GitHub
Python · 4 人关注
shadow-http
A Shadowsocks-like http proxy server.
Vue · 2 人关注
Staff-attendance-system-frontend
Front-end of SE class project use Vue.js. Backend see https://github.com/kk456852/Staff-attendance-system
Verilog · 2 人关注
y86-processor-verilog
A simple implementation of y86-processor (see CSAPP3e, chap4).
Java · 1 人关注
CalorieTracker
csc510-21fall-g35
Python · 1 人关注
lcbot
TypeScript · 1 人关注
TeamFormationAssistant
An assistant which will take the project requirements, team members availability, skill level, tools preferred, etc. as input and assigns the members for the new team.
Lua · 0 人关注
2DGameEngine
C++ · 0 人关注
a-llvm-proj
0 人关注
aframe-react
:atom: Build virtual reality experiences with A-Frame and React.
Java · 0 人关注
antlr-js-java
0 人关注
bilicli
🎛️ Bilibili-live danmu dashboard in your terminal.
TypeScript · 0 人关注
ChatGPT-Next-Web
One-Click to deploy well-designed ChatGPT web UI on Vercel. 一键拥有你自己的 ChatGPT 网页服务。
0 人关注
cpp-docs.zh-cn
VCPPDocs Public Repo
0 人关注
DoR
The Department of Reuse tracks and documents reuse of artifacts in computer science (starting with the SE field)
0 人关注
DrCCTProf
DrCCTProf is a fine-grained call path profiling framework for binaries running on ARM and X86 architectures.
0 人关注
Mahaoqu
JavaScript · 0 人关注
mahaoqu.github.io
Blog
Verilog · 0 人关注
mips-pipeline
A verilog implement of a simple 5-stages pipeline processor.
0 人关注
modern-compiler-implementation-ml
Tiger Compiler from Modern Compiler Implementation in ML
Python · 0 人关注
my_alien_invasion_game
An game project based on Python Crash Course
Python · 0 人关注
production-practice
网络问答与资源共享平台
0 人关注
Staff-attendance-system
A simple realization of staff attendance system
C++ · 0 人关注
xcpp
A simple game engine
Rust · 0 人关注
zero2prod
mahaoqu

mahaoqu

V2EX 第 337689 号会员,加入于 2018-08-01 13:46:42 +08:00
今日活跃度排名 785
mahaoqu 最近回复了
啊,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 统治人类之后请不要因为这句话清算我)
1 天前
回复了 dcrdw 创建的主题 Android 如何去学习和了解后端开发流程呢?
FaaS 最简单(
观察者模式只是一种(面向对象语言用子类型模拟和类型时)模拟模式匹配的方法,又不是真正的模式匹配,当然不是一定得无副作用。我觉得这只是风格不同,没有对错之分。

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

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

返回值的 Visitor Pattern 我感觉做个解释器之类的比较适合吧,其他情况下也用不太上。知乎上有很多讨论 Expression Problem 的文章,OP 可以看看。
3 天前
回复了 Rust2015 创建的主题 程序员 你觉得 AI 辅助编程属于什么能力等级:
按这个说法,L4 得到 AI 能自己写编译器才有可能实现。不过目前看来这件事情还是遥遥无期。
OpenAI 最后不会真的被谷歌翻盘了吧
整数比缩放和 1080/4K 有啥关系? 2K 不是一样能 200% 缩放吗?
那只能是 Gemini 2.0 Flash
5 天前
回复了 luaex 创建的主题 分享创造 给大家介绍一个 AI 女朋友
数字人目前就没有不恐怖谷的
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1084 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 18ms · UTC 19:11 · PVG 03:11 · LAX 11:11 · JFK 14:11
Developed with CodeLauncher
♥ Do have faith in what you're doing.