2009-01-06 125 views
8

这是更具体的问题,然后是语言特定的,但我在使用python ncurses模块时遇到了这个问题。我需要显示区域设置字符并将它们识别为字符,所以我只是快速地从curses模块中修改了一些函数/方法。猴子补丁或不?

这就是我称之为快速和丑陋的解决方案,即使它有效。这些变化相对较小,所以我希望我没有搞砸任何事情。我的计划是找到另一个解决方案,但看到它的工作和运作良好,你知道它是怎么回事,我去了我不得不面对的其他问题,我敢肯定,如果没有错误,我永远不会使它更好。

虽然我看到了更一般的问题 - 显然有些语言允许我们在类内部修改大块代码。如果这是我仅用于我自己的代码,或者更改很少,那没关系。如果其他开发人员需要我的代码,他会发现我使用了一些众所周知的模块,因此他可以假设它已经适用。然后,这个方法突然表现出不同,然后它应该。

所以,非常主观,我们应该使用猴子修补,如果是的话,何时以及如何?我们应该如何记录它?


编辑:用于@guerda:

猴修补是动态地改变在执行时间一些一段代码的行为,而不改变代码本身的能力。

一个小例子在Python:

import os 
def ld(name): 
    print("The directory won't be listed here, it's a feature!") 

os.listdir = ld 

# now what happens if we call os.listdir("/home/")? 
os.listdir("/home/") 
+1

您能否简要解释一下新手“猴子补丁”?谢谢! – guerda 2009-01-06 09:05:44

+2

+1这是主观的和议论性的,就像大多数好的问题上SO – 2010-02-24 21:40:52

回答

6

不要!

尤其是使用免费软件,您可以将所有可能的变化引入主发行版。但是,如果您在本地副本中存在虚弱记录的黑客攻击,则永远无法发布产品并升级到下一版本的curses(任何安全更新)都会花费很高。

请参阅this answer了解外国代码库中可能的内容。 linked screencast真的值得一看。突然间一个肮脏的黑客变成了一个宝贵的贡献。

如果无论出于何种原因,您确实无法获得上游补丁,至少需要创建一个本地(git)补丁来追踪上游并在独立分支中进行更改。

最近我遇到了一个问题,我必须接受猴子补丁作为最后的手段:Puppet是一个“无处不在”的红宝石代码。由于代理必须在潜在认证的系统上运行,因此它不需要特定的ruby版本。其中一些错误可以在运行时通过猴子修补选择方法解决。这些补丁是版本特定的,包含的,并且目标被冻结。我在那里看不到其他选择。

4

我会说没有。

每个猴子补丁都应该是一个例外,并标记(例如用// HACK注释),这样它们很容易追溯。我们都知道,将丑陋的代码留在原地很容易,因为它很有用,所以为什么还要花更多的时间。所以这个丑陋的代码将会在那里很长一段时间。

-1

一个字:oscommerce。

如果你从来没有与播放之前它与

// BOF: Fixed/added/removed bla bla bla 
... 
// EOF 

百病不提的是,整个代码库已经退化由于“放功能,不论身在何处”的心态。较新的编程概念,例如OO(想起继承和复合类)是为了解决这些非问题而设计的。使用它们!

0

我认为这个问题不能用一个明确的是 - 否/好 - 坏答案来解决 - 必须考虑语言与其实现之间的差异。

在Python中,我们需要考虑一个类是否可以被猴子修补(参见SO question的讨论),这与Python的稍微OO实现有关。所以我会保持谨慎,并倾向于在猴子补丁之前花费一些努力寻找替代品。

在Ruby中,OTOH被构建为OO到解释器中,可以修改类,而不管它们是用C还是Ruby实现的。甚至对象(几乎所有的基类)都可以修改。所以猴子补丁在这个社区中更加热情地被采用作为技术。

3

我同意David在猴子补丁生产代码通常不是一个好主意。

但是,我相信对于支持它的语言,猴子修补是一个非常有价值的单元测试工具。它允许你隔离你需要测试的代码段,即使它有复杂的依赖关系 - 例如系统调用不能被依赖注入。