Ruby 这种多态性的使用是否会导致误导,从而导致糟糕的设计?

Ruby 这种多态性的使用是否会导致误导,从而导致糟糕的设计?,ruby,interface,polymorphism,duck-typing,Ruby,Interface,Polymorphism,Duck Typing,如果我有以下实现特定接口的ruby模块(apply) …所有其他“应用程序”都是类而不是模块,将FooApplier传递给期望apply接口的接收器是否会误导其他工程师 让我们假设使用FooApplier的应用程序运行得非常好,但也假设其他工程师没有花时间检查我代码的每一个字节。如果他们决定向FooApplier发送类似.new的东西,这会导致一些微妙的错误,这是我的设计的责任,还是工程师做出假设而忽略阅读我的代码的责任?您的模块在这里的呈现方式,它不能作为一个类的替身。让我们先看一节课: cl

如果我有以下实现特定接口的ruby模块(
apply

…所有其他“应用程序”都是类而不是模块,将
FooApplier
传递给期望
apply
接口的接收器是否会误导其他工程师


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

您的模块在这里的呈现方式,它不能作为一个类的替身。让我们先看一节课:

class BarApplier
  def apply
    bar
  end
end
apply
这里有一个实例方法,因此可以在
BarApplier
的实例上调用,即
BarApplier.new.apply
。这对于您的模块是不可能的

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


但要回答更一般的问题,在duck类型的语言中,发送的消息是接口。在我看来,调用方不应假设存在其他方法。在您的具体情况下,如果“合同”中只有
apply
方法,假设同一实体也响应
new
,我认为这是无效的。

此处显示模块的方式,它不能作为类的替代。让我们先看一节课:

class BarApplier
  def apply
    bar
  end
end
apply
这里有一个实例方法,因此可以在
BarApplier
的实例上调用,即
BarApplier.new.apply
。这对于您的模块是不可能的

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

但要回答更一般的问题,在duck类型的语言中,发送的消息是接口。在我看来,调用方不应假设存在其他方法。在您的具体情况下,如果“合同”中只有
apply
方法,假设同一实体也响应
new
在我看来是无效的