2010-11-10 58 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