2017-02-11 45 views
0

如果我有(这种情况下apply)实现特定接口下面的红宝石模块这是使用多态性误导,因此设计不好吗?

module FooApplier 
    def apply 
    foo 
    end 
end 

...和所有其他的“施”的类,而不是模块,是误导其他工程师通过FooApplier接收器预计apply接口?

我们假设使用FooApplier的应用程序运行得很好,但我们还假设其他一些工程师没有花时间翻阅我代码的每个最后一个字节。如果他们决定发送类似.new的文件到FooApplier,这会导致一些微妙的错误,是我的设计上的责任,还是工程师做出假设并忽略我的代码?

回答

2

你的模块在这里呈现的方式,它不会作为班级的替身。让我们来看看一类一:

class BarApplier 
    def apply 
    bar 
    end 
end 

apply这里是一个实例方法,对BarApplier实例,以便调用,即BarApplier.new.apply。这对你的模块来说是不可能的。

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

但要回答更一般的问题,用鸭子型语言发送消息的界面。在我看来,调用者不应该假设其他方法存在。在你的具体情况下,如果apply是“合同”中唯一的方法,假设同一个实体也响应new对我来说是无效的。