gpt4 book ai didi

design-patterns - 在Clojure中,如何更好地设计这段需要多态的代码?

转载 作者:行者123 更新时间:2023-12-02 02:02:18 25 4
gpt4 key购买 nike

我正在编写这个程序,它类似于在线论坛的网络爬虫。对于我抓取的每个论坛,我需要做同样的事情:

  1. 登录
  2. 找到看板
  3. 查找帖子
  4. 找到帖子的永久链接
  5. 查找发帖人的用户名
  6. 等等

现在虽然每个论坛都需要采用相同的逻辑,但每个论坛的实现方式不同。例如,每个登录表单的输入因论坛而异。一个论坛可能有一个名为“用户名”的字段,另一个可能有一个名为“用户”的字段。其中一些步骤可能有默认实现。例如,login 的默认实现是不做任何事情(因为您不必登录某些论坛就可以抓取它)。

我所做的是创建一个函数,其中包含所有这些步骤,名为 crawl-forum,但实现是抽象的并在其他地方实现。我的问题是,crawl-forum 使用这些实现的最佳方法是什么?

我尝试过的

1) 配置图

这是我到目前为止尝试过的方法。我向名为 configscrawl-forum 函数添加了一个新参数。这是一个 map 数据结构,如下所示:

{ :login login-function
:find-boards find-boards-function
...
}

调用 crawl-forum 的代码负责填充该 map 。我不喜欢的是 configs 需要在整个 crawl-forum 代码中传递。它到处都添加了一个新参数。此外,我还有一些用于处理默认实现的蹩脚的临时代码。

2) 多方法

我在 irc 上谈到了这个,有人告诉我我应该为此使用多方法,因为它确实是多态行为。它们看起来像这样:

(defn get-site-key [& args] (first args))
(defmulti login get-site-key)
(defmethod login :default [site-key cookie-store] nil)

然后客户端代码必须在外部定义自己的多重方法:

(defmethod login :forum-1 [site-key cookie-store] (do-something cookie-store))

我不喜欢的是,就像 config 一样,我必须将 site-key 传递给 crawl-forum 功能和 site-key 仍然必须在内部的任何地方传递。此外,每个 defmethod 都必须将其自己的 site-key 作为参数传回,但它们都不会 使用它。这只是进行调度的必要参数。不过,我真的很难找到一个全面的多方法教程,所以如果有更聪明的方法来做到这一点,请告诉我。

有没有更好的第三种选择?有没有更好的方法来使用多方法?告诉我,谢谢。

最佳答案

我会选择选项 1。如果传递 map 给您带来困扰,您始终可以使用动态变量。对于默认值,我建议使用合并:

(def defaults { ... })
(def site-specific (merge defaults { ...}))

关于design-patterns - 在Clojure中,如何更好地设计这段需要多态的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16698802/

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