这里的核心CS问题: Gamma等中列出的设计模式中,哪些(如果有)涵盖了monkeypatching?此外,对于哪类问题,monkeypatching和子类化是合适的吗?修补核心库类中的bug就是其中之一,还有其他的吗?我听说了很多关于在stackoverflow上进行monkeypatching的文章,你们中的大多数人似乎对此有强烈的疑虑,但作为一名程序员,我真的很喜欢封装泛型功能并将它们包含在我的rails对象模型中的能力。
以thoughtbot-曲别针为例,为什么我想要将其子类化,而不是现在存在的monkeypatch方法?
谢谢,-Eric
发布于 2009-12-04 08:01:35
我不认为monkeypatching是一个设计模式的核心类扩展,一个他们似乎忽略的语言特性。
关于其余的,看看Jeff Atwood对this article on his blog的看法。
在他(和我)的观点中,monkeypatching最大的问题是,如果它修改了现有的方法,它会使调试变得非常困难--我们人类不能像机器一样跟踪所有“到处都是的小片段”。子类建立了更清晰的分隔。
所以我个人关于monkeypatching的规则是:
现在,让我们举个例子:回形针。
据我所知,它会将方法添加到ActiveRecord类中,但不会修改现有的方法。
has_attachment指令,否则它们不会受到影响。因此,这些变化是本地化的和明显的(我实际上认为它设法改进了调试:对于我们人类来说,阅读has_attachment比阅读class MyModel < Paperclip::ActiveRecordWithAttachment更容易)。
在这种情况下,子类化也不是一个好主意,因为除了使用子类的另一个插件之外,你不能使用回形针-- rails是单继承的。
在回形针的例子中,它与附件显然是一种has_a关系,而不是is_a关系。有人可能会争辩说,这不是子类化的正确使用。
最后,我想指出的是,在某些情况下,回形针需要子类化(您必须使用子类化才能创建回形针处理器)。
https://stackoverflow.com/questions/1836520
复制相似问题