如果只是添加新方法而不是改变现有的方法行为,它是否仍然被称为猴子修补?这叫什么?
示例:
String.prototype.contains = function(needle) { return false; }这可能不是最好的例子,但它显示了如何实现这一点。
发布于 2016-08-09 16:43:23
它仍然被称为猴子修补。任何对类本身的修改,如果发生在与其官方声明相去甚远的地方,都是猴子的修补。
猴子修补国际海事组织有两个主要缺陷:
Foo,您需要首先加载foo.js (或者在其中定义的模块Foo )。或者,如果您从其他地方接收到一个Foo,您就知道foo.js是在那里加载的。即使您以某种方式创建了一个Foo,而没有加载foo.js,因为其他人为您加载了它,而且其他人删除了加载foo.js的命令,当您的代码中断时,它通常很容易解决--您会得到一个错误,即Foo是一个未知的标识符,因此您可以查看它的定义并加载它。猴子打补丁可不容易。unrelated.js可以添加Foo.bar,而且您可能不用自己加载unrelated.js就可以使用它。然后有人删除了它对unrelated.js的依赖,或者您创建了一个新脚本并加载了foo.js,突然您的Foo对象不再拥有bar。在你意识到你需要加载unrelated.js之前,你要把头撞到墙上几次。我的解决方案?如果需要使用猴子补丁,请尝试将其限制为框架和基础结构代码,而不是在库或应用程序代码中使用。这大大降低了风险,因为:
P.S.:一些编译后的静态语言在C#或Rust的struct/impl分离中有一些类似猴子补丁的扩展方法。这些工具没有这些缺陷,因为您定义的方法没有成为类的一部分。它们只使用类的命名空间,并且仍然属于在其中定义的模块/作用域。
https://softwareengineering.stackexchange.com/questions/327986
复制相似问题