ruby-on-rails - 可以使用 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 类上对其进行修补的原因是数据类型并不总是已知,因为源数据不是示意性的,因此字段可以具有数字或字符串值。
解决方案
是和不是。但大多没有。
正如 stefan 在评论中提到的那样,“您只是将 foo_bar(obj) 替换为 obj.foo_bar”。我同意这个评估似乎概括了你的变化。
从某种意义上说,这种改变是“可以的”,因为没有明显的理由让它有问题地改变程序行为。
但是有一个问题,monkey patching 被普遍认为是 hacky。这样做的一个重要原因是猴子补丁可以在任何地方进行,如果你不是编写它的人,可能很难追踪。更糟糕的是,如果替换现有函数,它也可能成为微妙且难以追踪的错误的来源(尽管这里不是这种情况)。
Ruby 为程序员提供了几乎无限的灵活性,但必须注意这种灵活性。
在纯粹的技术层面上(它会工作并保持正确的功能吗?)答案是肯定的。在更自以为是的层面上(这被认为是好的做法吗?)我会说不 - 这将是我的建议(不要这样做)。一般来说,最好的做法是避免猴子修补,除非有很好的理由。
推荐阅读
- c# - 如何在 ASP.net MVC 中将 aspx 页面设置为主页?
- c# - discord.net 中的 [Summary("")] 用于什么?
- java - 立即更新 Kafka 偏移量
- azure - 是否可以使用 azure powershell 在 azure 中查看日志警报?
- linux - 复制路径中的文本(Bash)
- tsql - 需要按数量值为临时表分配值
- sql - 如何在 CASE When 语句中检查 varchar 变量是否为数字
- c# - 针对不同类型实体的可扩展审批工作流程的系统设计
- c# - 在 Visual Studio 2017 中设置默认 C# 构建语言版本
- shiny - 是否可以在降价文档中仅嵌入闪亮的应用程序输出?