gpt4 book ai didi

ruby - "messy-polymorphism"反模式

转载 作者:数据小太阳 更新时间:2023-10-29 07:11:54 25 4
gpt4 key购买 nike

在相当大的 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

这种代码围绕我们的代码库(不仅仅是初始化器)的扩散导致了我所说的“困惑多态性”。它通常有效,但有时会造成非常令人费解的情况。

关于这个我有三个问题。

  • 是否有正式名称作为反模式? “困惑的界面?”,“困惑的多态性?”还是别的?
  • 人们认为这有多糟糕?
  • 是否有系统的重构方法这个?我们面临的挑战普通重构,我们创建的许多测试都使用它宽松的类型,因此我们必须改变两者测试和实现同时,所以不会有普通基于测试的脚手架效应重构。我认为实际上可以“加强”这种松散的多态性,并将代码抽象成一个函数,而不是立即将其撕掉。但是会这是个好主意吗?

最佳答案

您不能定义某种 get_id 方法,以便 id 返回自身,对象返回 id,而 name 可以做任何它需要做的事情来获取 id 吗?然后你总是可以规范化任何你知道将成为三者之一的东西。如果需要,也可以使用 get_name 和 get_object 方法。

也就是说,您已经定义了一个隐式的 ThingWhatHasAnID 接口(interface),并将其设为函数参数的鸭子类型。

除非我遗漏了什么,否则我会将这种反模式称为“错失创建抽象的机会”。

关于ruby - "messy-polymorphism"反模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/712105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com