【问题标题】:Is this use of polymorphism misleading and therefore bad design?这种多态性的使用是否具有误导性,因此是糟糕的设计?
【发布时间】:2017-06-29 12:29:34
【问题描述】:

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

module FooApplier
  def apply
    foo
  end
end

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

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

【问题讨论】:

    标签: ruby interface polymorphism duck-typing


    【解决方案1】:

    您的模块在这里呈现的方式,它不能作为一个类的替代品。我们先来看一个类:

    class BarApplier
      def apply
        bar
      end
    end
    

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-06
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 2010-11-19
      相关资源
      最近更新 更多