Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 给猴子打补丁还是不给?_Oop_Language Agnostic_Monkeypatching - Fatal编程技术网

Oop 给猴子打补丁还是不给?

Oop 给猴子打补丁还是不给?,oop,language-agnostic,monkeypatching,Oop,Language Agnostic,Monkeypatching,这是一个比特定语言更一般的问题,尽管我在使用PythonnCurses模块时遇到了这个问题。我需要显示区域设置字符并将它们识别为字符,所以我只是快速地从curses模块中修补了一些函数/方法 这就是我所说的快速而丑陋的解决方案,即使它有效。而且变化相对较小,所以我希望我没有搞砸任何事情。我的计划是找到另一个解决方案,但看到它运行良好,你知道它是如何工作的,我继续处理我必须处理的其他问题,我确信如果没有错误,我将永远不会使它变得更好 不过,在我看来,更一般的问题是——显然有些语言允许我们在类中对大

这是一个比特定语言更一般的问题,尽管我在使用PythonnCurses模块时遇到了这个问题。我需要显示区域设置字符并将它们识别为字符,所以我只是快速地从curses模块中修补了一些函数/方法

这就是我所说的快速而丑陋的解决方案,即使它有效。而且变化相对较小,所以我希望我没有搞砸任何事情。我的计划是找到另一个解决方案,但看到它运行良好,你知道它是如何工作的,我继续处理我必须处理的其他问题,我确信如果没有错误,我将永远不会使它变得更好

不过,在我看来,更一般的问题是——显然有些语言允许我们在类中对大块代码进行修补。如果这是我只为自己使用的代码,或者更改很小,那么就可以了。但是,如果其他开发人员接受了我的代码,他看到我使用了一些知名的模块,那么他可以假设它可以正常工作。然后,这个方法突然表现出与它应该表现出的不同

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


编辑:对于@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/")
我会说不要

每个monkey补丁都应该是一个例外,并进行相应的标记(例如使用//HACK注释),以便于跟踪


我们都知道,让丑陋的代码留在原地是很容易的,因为它可以工作,所以为什么还要花更多的时间在它上面呢。因此,丑陋的代码将在那里存在很长一段时间。

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

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

在Ruby中,OTOH是构建在解释器中的OO,可以修改类,而不管它们是用C还是Ruby实现的。甚至对象(几乎是所有事物的基类)也可以修改。因此,在该社区,猴子补丁作为一种技术被更积极地采用。

不要! 特别是使用自由软件,你有所有的可能将你的更改放到主发行版中。但是,如果您的本地副本中有一个记录不充分的黑客,您将永远无法发布该产品,升级到下一版本的curses(任何人都可以进行安全更新)的成本将非常高

请参阅,了解在外国代码基础上可能发生的情况。这只手表真的很值钱。突然,一个肮脏的黑客变成了一个有价值的贡献

如果你真的因为任何原因无法得到上游补丁,至少创建一个本地(git)回购来跟踪上游,并将你的更改放在一个单独的分支中

最近我遇到了一个问题,我不得不接受猴子补丁作为最后手段:它是ruby代码的“到处运行”部分。由于代理必须在可能经过认证的系统上运行,因此它不需要特定的ruby版本。其中一些有bug,可以通过在运行时对select方法进行猴子补丁来解决。这些修补程序是特定于版本的、包含的,并且目标已冻结。我看不出还有其他选择。

我同意这样的观点,即猴子修补生产代码通常不是一个好主意


然而,我相信对于支持它的语言来说,猴子补丁是一个非常有价值的单元测试工具。它允许您隔离需要测试的代码片段,即使它具有复杂的依赖项,例如无法注入依赖项的系统调用。

能否请您简短地为新手解释一下“猴子补丁”?谢谢+1这是一个主观且有争议的问题,就像SORelated上的大多数好问题一样: