这种多态性的使用是否具有误导性并因此导致糟糕的设计?

Is this use of polymorphism misleading and therefore bad design?

如果我有以下实现特定接口的 ruby 模块(在本例中为 apply

module FooApplier
  def apply
    foo
  end
end

...和所有其他 "Appliers" 是 类,而不是模块,是否会误导其他工程师将 FooApplier 传递给期望 apply 接口的接收者?

让我们假设使用 FooApplier 的应用程序运行得非常好,但我们也假设其他工程师没有花时间检查我代码的每个最后字节。如果他们决定向 FooApplier 发送类似 .new 的内容,这会以某种方式引起一些细微的错误,这是我设计的责任,还是工程师做出假设而忽略阅读我的代码?

您的模块在此处的显示方式无法作为 class 的 stand-in 使用。先来看一个class:

class BarApplier
  def apply
    bar
  end
end

apply 这是一个实例方法,因此可在 BarApplier 的实例上调用,即 BarApplier.new.apply。这对您的模块来说是不可能的。

当然,除非 apply 是 class 或模块方法,在这种情况下,您的问题具有误导性,因为它应该是 def self.apply.

但要回答更一般的问题,在 duck-typed 语言中发送的消息 界面。在我看来,调用者不应该对存在的其他方法做出任何假设。在您的特定情况下,如果 apply 是 "contract" 中的唯一方法,假设同一实体也响应 new 在我看来是无效的。