这是更普遍的问题,然后是语言特定的,虽然我在使用python ncurses模块时碰到了这个问题.我需要显示区域设置字符并将它们识别为字符,所以我很快就从curses模块中修补了一些函数/方法.
这就是我称之为快速而丑陋的解决方案,即使它有效.而且变化相对较小,所以我希望我没有搞砸任何东西.我的计划是找到另一个解决方案,但看到它的工作和运作良好,你知道它是怎么回事,我继续处理我必须处理的其他问题,我敢肯定,如果没有这个问题,我将永远不会让它更好.
然而,更普遍的问题出现在我面前 - 显然有些语言允许我们在类中修补大块代码.如果这是我自己只使用的代码,或者变化很小,那就没关系.如果其他开发人员接受我的代码会怎样,他看到我使用了一些众所周知的模块,所以他可以认为它可以像以前一样工作.然后,这种方法突然表现得与之不同.
所以,非常主观,我们应该使用猴子补丁,如果是,何时以及如何?我们该怎么记录它?
编辑:for @guerda:
Monkey-patching是在执行时动态地改变某些代码片段的行为的能力,而不需要改变代码本身.
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/")
David Schmit.. 8
别!
特别是使用免费软件,您可以获得所有可能性,以便将更改纳入主要分发.但是,如果你的本地副本中有一个文档记录很少,那么你将永远无法发布产品并升级到下一版本的curses(安全更新任何人)将是非常高的成本.
请参阅此答案,了解外国代码库中的可能性.该链接的截屏确实是值得的手表.突然间,一个肮脏的黑客变成了一个有价值的贡献.
如果由于某种原因你真的无法上传补丁,至少要创建一个本地(git)仓库来跟踪上游并在单独的分支中进行更改.
最近我遇到了一个问题,我必须接受猴子修补作为最后的手段:Puppet是一个"无处不在"的红宝石代码.由于代理必须运行 - 可能已经认证 - 系统,因此不需要特定的ruby版本.其中一些有bug可以通过运行时中的猴子修补select方法来解决.这些修补程序是特定于版本的,包含的,并且目标被冻结.我认为没有其他选择.
特别是使用免费软件,您可以获得所有可能性,以便将更改纳入主要分发.但是,如果你的本地副本中有一个文档记录很少,那么你将永远无法发布产品并升级到下一版本的curses(安全更新任何人)将是非常高的成本.
请参阅此答案,了解外国代码库中的可能性.该链接的截屏确实是值得的手表.突然间,一个肮脏的黑客变成了一个有价值的贡献.
如果由于某种原因你真的无法上传补丁,至少要创建一个本地(git)仓库来跟踪上游并在单独的分支中进行更改.
最近我遇到了一个问题,我必须接受猴子修补作为最后的手段:Puppet是一个"无处不在"的红宝石代码.由于代理必须运行 - 可能已经认证 - 系统,因此不需要特定的ruby版本.其中一些有bug可以通过运行时中的猴子修补select方法来解决.这些修补程序是特定于版本的,包含的,并且目标被冻结.我认为没有其他选择.