问题标签 [multimethod]

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 投票
2 回答
1344 浏览

clojure - Clojure:不同类类型上的 defmulti

快速clojure问题,我认为这主要与语法有关。如何根据参数的特定类型签名调度多方法,例如:

我想将此扩展到任意内容,例如两个字符串后跟一个映射,映射后跟一个双精度数,两个双精度数后跟一个 IFn 等...

0 投票
3 回答
541 浏览

clojure - 您将如何在 Clojure 中为其他数据类型惯用地扩展算术函数?

所以我想用java.awt.Color一些东西,我希望能够编写这样的代码:

查看 的核心实现-,它专门讨论clojure.lang.Numbers,这对我来说意味着我没有做任何事情来“挂钩”核心实现并对其进行扩展。

在互联网上环顾四周,人们似乎做了两种不同的事情:

  • 编写他们自己的defn -函数,该函数只知道他们感兴趣的数据类型。要使用你可能最终会为命名空间添加前缀,例如:

    (= Color/BLUE (scdf.color/- Color/WHITE Color/RED Color/GREEN))

    或者,在需要数字数学时use使用命名空间并使用。clojure.core/-

  • 将一个特殊情况编码到您的-实现中,clojure.core/-当您的实现通过Number.

不幸的是,我不喜欢其中任何一个。第一个可能是最干净的,因为第二个假设您唯一关心的数学运算是它们的新数据类型和数字。

我是 Clojure 的新手,但我们不应该在这里使用协议或多方法,这样当人们创建/使用自定义类型时,他们可以“扩展”这些功能,让它们无缝工作吗?+有没有理由-不支持这个?(或者是吗?从我阅读代码来看,它们似乎不是,但也许我读错了)。

如果我想为常见的现有函数(例如其他数据类型)编写自己的扩展+,我应该怎么做才能很好地与现有函数和可能的其他数据类型一起使用?

0 投票
2 回答
175 浏览

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

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

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

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

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

我试过的

1) 配置图

这是我到目前为止所尝试的。我向crawl-forum名为configs. 这是一个如下所示的地图数据结构:

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

2) 多方法

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

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

我不喜欢的是,就像config,我必须将site-keyin 传递给crawl-forum函数,并且site-key仍然必须在内部到处传递。此外,每个defmethod人都必须将自己site-key的参数作为参数传回,但他们都不会使用它。这只是进行调度的必要参数。不过,我真的很难找到一个完整的多方法教程,所以如果有更聪明的方法可以做到这一点,请告诉我。

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

0 投票
1 回答
185 浏览

oop - 多方法与接口

是否有语言习惯性地同时使用这两个概念?如果有的话,什么时候有必要?每种方法的优缺点是什么?

问题的背景:

我是一个新手(具有一些 python 知识),试图更好地了解多方法和接口的使用方式(通常)。

我假设它们并不意味着混合:要么根据接口声明可用逻辑(并将其实现为类的方法),要么根据多方法来声明。这个对吗?

谈论一系列 OOP 概念是否有意义:

  • 一开始是幼稚的子类化(数据和逻辑(方法)和逻辑实现(方法)是紧密耦合的)
  • 然后通过接口(逻辑在接口中,数据和逻辑实现在类中)
  • 并以多方法结束(逻辑在多方法的签名中,逻辑实现是分散的,数据在类中(这只是一个具有良好句柄的数据结构))?
0 投票
1 回答
695 浏览

python - 使用 isinstance 的 Python 多方法

这篇文章中,Guido van Rossum 说这种 Python 中的多方法实现:

是“乏味”和“不是很OO”。然后,他描述了如何使用装饰器来实现多方法,我认为这些方法对于那些没有相当深入的 Python 知识的人来说是无法访问的。

我的问题:我需要编写一个多方法,关于上面的代码实际上“不是 OO”是什么?

更新:根据 Thomas Orozco 的回答,我现在意识到我实际上根本“不需要”编写多方法。

0 投票
1 回答
109 浏览

java - 为什么我的变量在方法之间没有按顺序排列?

我使用冒泡排序方法按顺序(从最小到最大)对输入数字进行排序,并且我有它自己的方法。然后,在下一个方法中(我需要按顺序排列数字)似乎忽略了我已经在前一个方法中对数字进行了排序。我没有正确调用方法还是什么?谢谢!

}

0 投票
1 回答
241 浏览

clojure - Clojure:从符号列表中定义多方法?

在我正在进行的 Clojure 练习中,我有几个多方法,所有这些都只是identity用作调度函数。例如:

由于它们都使用相同identity的分派函数,我想只迭代名称并调用defmulti每个名称,而不是重复defmulti调用。我试过这个:

但是,当我这样做时,似乎defmulti没有适当的效果,当我后来defmethod用于任何多方法名称时,我收到一个错误,例如:

是否可以遍历符号或名称列表并调用defmulti它们中的每一个,如果可以,如何完成?

0 投票
7 回答
766 浏览

c# - .Net 4.0 Optimized code for refactoring existing "if" conditions and "is" operator

I have following C# code. It works fine; but the GetDestination() method is cluttered with multiple if conditions by using is operator.

In .Net 4.0 (or greater) what is the best way to avoid these “if” conditions?

EDIT: Role is part of the business model, and the destination is purely an artifact of one particular application using that business model.

CODE

REFERENCES

  1. Dictionary<T,Delegate> with Delegates of different types: Cleaner, non string method names?
  2. Jon Skeet: Making reflection fly and exploring delegates
  3. if-else vs. switch vs. Dictionary of delegates
  4. Dictionary with delegate or switch?
  5. Expression and delegate in c#
0 投票
2 回答
193 浏览

clojure - 仅加载多方法文件

场景:我想使用多方法在多个文件之间分派和传播功能。其中一个文件只包含多方法,为了使它们可用,我必须手动加载文件。有没有办法自动加载文件,而不是显式加载它?

这是我正在做的一个简单示例:

除非我在 app.core 中明确加载,否则不会加载fruit.banana 的方法,例如将其添加到 :use 组中。这似乎违背了使用多方法的目的,因为我仍然必须明确说明实现它的所有方法。

0 投票
2 回答
2234 浏览

haskell - Clojure 中的协议和多方法在多态性方面不如 Haskell 中的类型类强大的原因是什么?

更广泛地说,这个问题是关于表达问题的各种方法。这个想法是您的程序是数据类型和对它的操作的组合。我们希望能够在不重新编译旧类的情况下添加新案例。

现在 Haskell对TypeClass的表达式问题有了一些非常棒的解决方案。特别是 - 我们可以这样做:

现在在Clojure中有多种方法- 所以你可以这样做:

同样在 Clojure 中,您有协议- 您可以使用这些协议:

现在这个人提出索赔

但是,有协议和多种方法。它们非常强大,但不如 Haskell 的类型类强大。您可以通过在协议中指定您的合同来引入类型类之类的东西。这仅在第一个参数上分派,而 Haskell 可以在整个签名上分派,包括返回值。多方法比协议更强大,但不如 Haskell 的调度强大。

我的问题是:Clojure 中的协议和多方法在多态性方面不如 Haskell 中的类型类强大的原因是什么?