如果我有以下ruby模块实现特定接口(在这种情况下为apply
)
module FooApplier
def apply
foo
end
end
...而所有其他“Appliers”都是类,而不是模块,是否会误导其他工程师将FooApplier
传递给期望apply
接口的接收者?
让我们假设使用FooApplier
的应用程序运行得非常好,但我们也假设其他工程师没有花时间倒我代码的每一个字节。如果他们决定将.new
之类的内容发送到FooApplier
以某种方式引起一些微妙的错误,那么我的设计或工程师有责任做出假设并忽略阅读我的代码吗?
答案 0 :(得分:2)
您的模块在这里展示的方式,它不会作为一个班级的替身。让我们先来看一堂课:
class BarApplier
def apply
bar
end
end
apply
这是一个实例方法,因此可以在BarApplier
的实例上调用,即BarApplier.new.apply
。这对您的模块来说是不可能的。
除非apply
当然是一个类或模块方法,否则你的问题会产生误导,因为它应该是def self.apply
。
但是为了回答更一般的问题,用鸭子型语言发送的消息 接口。在我看来,调用者不应该对存在的其他方法做出任何假设。在您的特定情况下,如果apply
是"合同"中的唯一方法,则假设同一实体也响应new
在我看来无效。