这种多态性的使用是误导性的,因此设计不好吗?

时间:2017-02-11 02:34:43

标签: ruby interface polymorphism duck-typing

如果我有以下ruby模块实现特定接口(在这种情况下为apply

module FooApplier
  def apply
    foo
  end
end

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

让我们假设使用FooApplier的应用程序运行得非常好,但我们也假设其他工程师没有花时间倒我代码的每一个字节。如果他们决定将.new之类的内容发送到FooApplier以某种方式引起一些微妙的错误,那么我的设计或工程师有责任做出假设并忽略阅读我的代码吗?

1 个答案:

答案 0 :(得分:2)

您的模块在这里展示的方式,它不会作为一个班级的替身。让我们先来看一堂课:

class BarApplier
  def apply
    bar
  end
end

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

除非apply当然是一个类或模块方法,否则你的问题会产生误导,因为它应该是def self.apply

但是为了回答更一般的问题,用鸭子型语言发送的消息 接口。在我看来,调用者不应该对存在的其他方法做出任何假设。在您的特定情况下,如果apply是"合同"中的唯一方法,则假设同一实体也响应new在我看来无效。