这种多态性的使用是否具有误导性并因此导致糟糕的设计?
Is this use of polymorphism misleading and therefore bad design?
如果我有以下实现特定接口的 ruby 模块(在本例中为 apply
)
module FooApplier
def apply
foo
end
end
...和所有其他 "Appliers" 是 类,而不是模块,是否会误导其他工程师将 FooApplier
传递给期望 apply
接口的接收者?
让我们假设使用 FooApplier
的应用程序运行得非常好,但我们也假设其他工程师没有花时间检查我代码的每个最后字节。如果他们决定向 FooApplier
发送类似 .new
的内容,这会以某种方式引起一些细微的错误,这是我设计的责任,还是工程师做出假设而忽略阅读我的代码?
您的模块在此处的显示方式无法作为 class 的 stand-in 使用。先来看一个class:
class BarApplier
def apply
bar
end
end
apply
这是一个实例方法,因此可在 BarApplier
的实例上调用,即 BarApplier.new.apply
。这对您的模块来说是不可能的。
当然,除非 apply
是 class 或模块方法,在这种情况下,您的问题具有误导性,因为它应该是 def self.apply
.
但要回答更一般的问题,在 duck-typed 语言中发送的消息 是 界面。在我看来,调用者不应该对存在的其他方法做出任何假设。在您的特定情况下,如果 apply
是 "contract" 中的唯一方法,假设同一实体也响应 new
在我看来是无效的。
如果我有以下实现特定接口的 ruby 模块(在本例中为 apply
)
module FooApplier
def apply
foo
end
end
...和所有其他 "Appliers" 是 类,而不是模块,是否会误导其他工程师将 FooApplier
传递给期望 apply
接口的接收者?
让我们假设使用 FooApplier
的应用程序运行得非常好,但我们也假设其他工程师没有花时间检查我代码的每个最后字节。如果他们决定向 FooApplier
发送类似 .new
的内容,这会以某种方式引起一些细微的错误,这是我设计的责任,还是工程师做出假设而忽略阅读我的代码?
您的模块在此处的显示方式无法作为 class 的 stand-in 使用。先来看一个class:
class BarApplier
def apply
bar
end
end
apply
这是一个实例方法,因此可在 BarApplier
的实例上调用,即 BarApplier.new.apply
。这对您的模块来说是不可能的。
当然,除非 apply
是 class 或模块方法,在这种情况下,您的问题具有误导性,因为它应该是 def self.apply
.
但要回答更一般的问题,在 duck-typed 语言中发送的消息 是 界面。在我看来,调用者不应该对存在的其他方法做出任何假设。在您的特定情况下,如果 apply
是 "contract" 中的唯一方法,假设同一实体也响应 new
在我看来是无效的。