2010-11-10 57 views
2

MonkePatching一个很好的开发实践?我应该在什么时候应用monkeypatch,而不是比如说在一个分支项目上放一块宝石并修补它?Monkeypatching in Rails

+1

取决于你是否需要在接下来的5分钟补丁或者如果可以等到明天 – dstarh 2010-11-10 20:58:34

回答

3

一般来说,猴子修补绝不是一个好的做法。但是,我经常将它用于不同于应用程序的特殊情况。在其他所有情况下,我更喜欢分割宝石或插件,并将分叉的宝石安装到我的应用程序的宝石文件夹中。

我还有一些工具模块,它们将某些类的猴子修补程序注入某些标准类中,以便在不同的应用程序中重用 - 但这些仍然足够特殊以至于不会对公众有用,或者它只是不可能创造叉子。

所以最终它是一个专业化和兼容性的决定。请始终记住,猴子修补更有可能打破您可能在项目中使用的其他插件或宝石的预期行为。在更新工作应用程序生态系统中的组件(或外部支持生态系统,如Rails及其依赖项)后,这可能会变得更加迫切。

+0

但如果你是不是在公共接口反正一个新的方法猴补丁,也不会影响宝石/插件。 – alternative 2010-11-11 00:14:00

+0

@math这就是我的意思是通过升级生态系统......有一次你的新方法名称可能会成为新的gem/plugin版本的一部分......但除此之外,你当然是对的。 – hurikhan77 2010-11-11 07:54:10

2

如果您执行负责任的鸭子打孔,它可以很容易地支持作为项目特定的本地副本的宝石。这完全取决于你的勤奋记录任何解决方案的升级问题。很容易说,无论是你还是支持开发者,从现在起一年都不会肆意地替换供应商/宝石中的宝石,但它会发生。分拣项目,在当地修补它,然后提交拉取请求并让它回到主要的宝石中是最理想的情况。

你需要坚持鸭冲孔一对夫妇的规则,但如果你选择这条路线:

  • 补丁是否在公然明显的位置坐下。 lib/[gem_name] _extensions.rb应该是我第一次作为支持开发人员查看缺陷的位置。
  • 该补丁应该有大量围绕它的文档。它应该概述潜在的升级噩梦。
  • 该补丁应该在不同的模块上完成,然后将其纳入原始模块/类ActiveSupport风格。这允许支持开发人员调用problem_method.ancestors并查看正在进行的monkeypatch。

这将以一种方式来保持旧方法(用于娱乐和游戏)并允许使用problem_method.ancestors()更容易地追踪它。

#lib/mongomapper_extensions.rb 
module MongomapperExensions 
    module ProblemClassExensions 
    alias :old_problem_method :problem method 
    def problem_method 
     #guerilla code goes here! 
    end 
    end 
end 
class ProblemClass 
    include MongoMapperExtensions::ProblemClassExtensions 
end