问题标签 [visitor-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
411 浏览

mysql - 在 mysql 中计算访问次数等等,有没有更好的做法或第三方软件?

假设我有一个像 quora 这样的网站,我想计算有多少访问者看到了特定页面/问题......(“这个问题被访问了 345 次”)

我知道我可以创建一个列来存储一个增加每个用户访问它的值。但是如何使用一些外部服务......也许可以更强大和可靠(过滤独特/综合浏览量等......)

有什么建议吗?

(谷歌分析 API 呢?)

谢谢!

0 投票
1 回答
482 浏览

design-patterns - 当我的 AST 只是一个数组时,我应该使用访问者吗?

我已经看到了用于遍历AST的访问者模式。accept(visitor)要使用此模式,您需要在 AST 节点对象上添加一个方法。这个方法调用visitor.visit(self)它,反过来,“处理”节点以获得所需的结果(例如,AST 的漂亮打印版本)。

请注意,您通常必须修改节点本身才能添加方法。但是,如果您的 AST 使用内置对象怎么办。Ruby 的 Ripper 库将 AST 作为数组返回。我可以添加accept如下方法:

查看 Array的文档,目前没有accept方法,所以不会有冲突。但是,这对我来说并不完全正确,尤其是当我自己编写一个库时。我不想“污染”其他人可能依赖的内置对象。

不过,这并不是 Ruby 独有的,因为我可以在 C# 中添加一个扩展方法来做类似的事情。

我的问题是:我应该在这种情况下使用访问者模式,还是应该编写一个递归函数,只接受我正在处理的数据类型并返回我想要的答案?

0 投票
3 回答
3186 浏览

c++ - 访问者或节点中的 AST 遍历?

Update接受了 Ira Baxter 的回答,因为它为我指明了正确的方向:我首先通过开始编译阶段的实现来弄清楚我真正需要什么,很快就很明显,节点内的遍历使这个方法成为不可能的方法。并非所有节点都应该被访问,其中一些节点以相反的顺序访问(例如,首先是赋值的 rhs,以便编译器可以检查类型是否与 rhs/操作符匹配)。将遍历放在访问者中使这一切变得非常容易。

在决定对应用程序中使用的迷你语言的处理进行重大重构之前,我正在玩弄 AST 等。我已经构建了一个 Lexer/Parser 并且可以很好地获得 AST。还有一个访问者,作为具体实现,我制作了一个 ASTToOriginal,它只是重新创建了原始源文件。最终会有某种编译器也实现 Vsisitor 并在运行时创建实际的 C++ 代码,所以我想从一开始就确保一切都是正确的。虽然现在一切正常,但由于遍历顺序是在访问者本身中实现的,因此存在一些类似/重复的代码。

在查找更多信息时,似乎某些实现更喜欢在访问对象本身中保持遍历顺序,以免在每个具体访问者中重复此操作。即使是 GoF 也只是以同样的方式简单地谈论这一点。所以我也想尝试这种方法,但很快就卡住了。让我解释一下。

示例源行和相应的 AST 节点:

一些代码:

实现 ASTToOriginal 非常简单:所有抽象的访问者方法只是打印出终端的名称或值成员。对于非终端,它取决于;使用默认的访问者遍历打印作业可以正常工作,因为需要有条件的额外代码:

因此可以看出,Visitor 中的条件访问方法和 ASTToOriginal 确实非常相似。然而,试图通过将遍历放入节点来解决这个问题不仅会使事情变得更糟,而且会变得一团糟。我尝试了一种使用 PreVisit 和 PostVisit 方法解决了一些问题的方法,但只是在节点中引入了越来越多的代码。它也开始看起来像我必须跟踪访问者内部的许多状态才能知道何时添加右括号等。

问题:这种方法不适合我的情况,还是我忽略了一些重要的东西?是否有共同的设计来应对这些问题?如果我还需要在不同的方向遍历怎么办?

0 投票
3 回答
1898 浏览

javascript - 跟踪访问者 JS 错误?

是否可以跟踪访问者遇到的 JS 错误?显然我们自己做测试,但有时访问者会运行某个浏览器版本,或者有一个特定的插件,这会导致 JS 错误。同样,有时 JS 中的错误会被忽视。

如果我们能以某种方式捕获这些事件,并在我们的服务器上 ajax 一个包含错误详细信息的脚本,这样我们就可以尝试解决问题,这将非常有用。

更新: 感谢您的反馈。通常在发布后我设法找到:
Logging Clientside JavaScript Errors on Server
which has the stuff on window.onerror 还有一些关于 JQuery 和 FireFox onerror 多年未修复的有趣问题...

0 投票
2 回答
1265 浏览

java - 可用的 Java(或字节码)AST 生成器,以便我可以在其结果之上运行几个访问者?

我正在寻找一种工具,它可以获取 .java 源代码文件、.class 或 .jar 并对其进行解析,生成 AST(抽象语法树),以便我可以使用它。我打算创建几个访客在其上运行。

Java中是否存在此类工具?.NET 中存在类似的东西,称为 Mono.Cecil(尽管截至今天,它似乎不支持访问者模式)。

谢谢

0 投票
2 回答
1580 浏览

c++ - C++ 避免 const 和非常量访问的代码重复

我有一个类应该为每个成员变量调用一个访问者方法。像这样的东西:

如何void accept() const在不重复代码的情况下获得具有相同代码的方法?

重复的明显解决方案是添加一个方法:

该方法正是我想要的意思,但我想避免代码重复。使用这两种方法的原因是能够通过“阅读”访问者读取变量并accept很好地使用该方法const。然后非常量accept可以用于“编写/更新”访问者。

0 投票
3 回答
249 浏览

c# - 在 C# 中使用子访问者

我正在设置一个测试组件并试图保持它的通用性。我想使用通用的访问者类,但不确定是否使用后代类。

例子:

C# 编译器使用哪些规则来确定USB_Read_Visitor代码片段将执行哪些方法?

我正在尝试排除我的测试组件的依赖关系。不幸的是,我当前的访问者类包含visit与测试组件无关的类的方法。我在努力实现不可能吗?

0 投票
1 回答
1864 浏览

session - 在 Google Analytics 的 Content Drilldown 中跟踪文件夹的会话

我们正在为我们的网站使用 GA,该网站有几千页。我被要求找出我们网站上最受欢迎的内容,这听起来很容易,直到我深入了解它。

我们有许多不同的数据库连接到该站点以获取信息。一个列出了我们的企业名录中列出的企业,另一个列出了埋在我们墓地中的人的墓地记录。另一个是属性数据。这些数据库中的每一个都包含数千条记录。

如果你正在做一些家庭研究,你可以坐下来使用墓地搜索,查找许多不同的名字、搜索记录等。在一个会话中,你可能会查看 100 条记录,但你只是一个人。在您的会话中,您可能不会访问业务目录或查找任何属性数据。

另一个访问者可能会访问并在他们的会话中搜索业务并找到信息并关闭他们的会话。如果我们有 10 个人做同样的事情并搜索业务然后离开,这意味着业务目录比公墓数据库更受欢迎,因为 11 个人(访问者/会话)使用过它,而只有一个人使用过墓地。

显然这是一个非常简单的例子,因为网站上还有其他页面只是内容。您单击链接,查看内容,也许单击另一个链接等...

如果我进行内容深入分析报告,它将显示墓地文件夹非常受欢迎,因为会话查看了 100 页。这是一种误导,因为它只是一个人。

所以.....我怎样才能根据访问者而不是网页浏览量对我现有的数据进行内容报告?理想情况下是按文件夹,因为我们的大部分内容都被分解到它自己的文件夹中。

这听起来很容易,但我似乎找不到任何关于它的信息。

谢谢!

0 投票
3 回答
1036 浏览

c++ - 如何使访问者界面适应迭代器界面?

我想知道是否有一个好的设计模式或习惯用法来实现以下内容:

您有一个仅提供访问者界面的现有类,如下所示

visit并且您希望有一个可以按如下方式使用的接口,它应该以与访问者调用其函数的顺序相同的顺序遍历树。

问题似乎是当我们刚刚调用时visit,我们失去了控制,无法暂时“回到”循环体执行一个节点的动作。这看起来应该在现实世界的程序中定期发生。知道如何解决吗?

0 投票
2 回答
2780 浏览

python - 是否可以使用 ast.NodeVisitor 访问 Python AST 中的节点两次或更改遍历顺序?

NodeVisitor 深度优先遍历 AST,并且在进入时只访问每个节点一次。因此,用它做一些严肃的事情是有问题的。是否可以更改其默认行为?