在相当大的 Ruby 应用程序中,我们遇到给定对象由以下几项标识的情况:例如名称和 ID。这些值类型中的每一个都有不同的用途,因此并不完全等价(id 和 name 在不同的地方保留)。因此,我们最终会在应用程序中传递各种值(id、名称和对象)。这种情况至少在某种程度上似乎是一个问题,因为我们已经被错误所困扰,这些错误涉及不清楚应该将什么类型传递给给定函数。实际上,我记得这些年来在许多应用程序中看到过类似的问题代码,尽管我再也没有给它一个具体的名字。
Ruby 作为一种无类型语言,不像 C++ 那样允许经典的基于类型的多态函数。作为一种解决方法,一位同事经常使用这种代码:
def initialize starting_value
if starting_post.kindof? Foo
@starting_id = get_id_from_foo starting_value
elsif starting_post.kindof? Bar
@starting_id = get_id_from_bar starting_value
else
raise "illegal type"
end
end
这段代码围绕我们的代码库(不仅仅是初始化程序)的扩散导致了我所说的“混乱多态”。它通常有效,但有时会产生非常令人费解的情况。
我对此有三个问题。
- 有没有正式的名称作为反模式?“混乱的接口?”,“混乱的多态性?” 或者是其他东西?
- 人们认为这有多糟糕?
- 有系统的方法来重构它吗?我们在普通重构中遇到的挑战是,我们创建的许多测试都使用这种松散类型,因此我们必须同时更改测试和实现,因此不会产生普通基于测试的重构的脚手架效应。我认为实际上可以“加强”这种松散的多态性,并将代码抽象为一个函数,而不是立即将其撕掉。但这会是个好主意吗?