首页 > 解决方案 > 可以使用 Monkey Patch Object 类创建自定义数据格式化程序吗?

问题描述

我的应用程序有各种数据格式规则,例如如果 value == "-" 然后显示 "N/A" 或者如果 value == "NULL" 然后显示 "N/A" 或者如果 value.is_a? 数字然后 value.round(2) 和各种其他此类规则。我目前有一个辅助方法,如下所示

def display_formatted
 case
  when '.'
    #...
 end
end

是否可以 MonkeyPatch 对象类来创建像这样的格式化程序

class Object
  def my_app_format
    case self
      when is_a?(Numeric)
       # some rules
      when "-"
       # some other rule
      else
        self
  end
end

目前,代码在数百个地方都充满了 display_formatted(value),我想添加不同的格式化程序,这样我就可以按如下方式在任何数据类型上使用它,并且使用纯 Ruby 而不是 Rails!

value.as_count_formatted
value.as_default_formatted
value.as_default_rounded`

在 Object 类上对其进行修补的原因是数据类型并不总是已知,因为源数据不是示意性的,因此字段可以具有数字或字符串值。

标签: ruby-on-railsruby

解决方案


是和不是。但大多没有。

正如 stefan 在评论中提到的那样,“您只是将 foo_bar(obj) 替换为 obj.foo_bar”。我同意这个评估似乎概括了你的变化。

从某种意义上说,这种改变是“可以的”,因为没有明显的理由让它有问题地改变程序行为。

但是有一个问题,monkey patching 被普遍认为是 hacky。这样做的一个重要原因是猴子补丁可以在任何地方进行,如果你不是编写它的人,可能很难追踪。更糟糕的是,如果替换现有函数,它也可能成为微妙且难以追踪的错误的来源(尽管这里不是这种情况)。

Ruby 为程序员提供了几乎无限的灵活性,但必须注意这种灵活性。

在纯粹的技术层面上(它会工作并保持正确的功能吗?)答案是肯定的。在更自以为是的层面上(这被认为是好的做法吗?)我会说不 - 这将是我的建议(不要这样做)。一般来说,最好的做法是避免猴子修补,除非有很好的理由。


推荐阅读