【发布时间】:2009-05-18 21:21:45
【问题描述】:
我是一名 Ruby 程序员。对我来说,monkeypatching 是在运行时更改外部项目中的类或模块方法。我感兴趣的是,您有什么机制可以保护您免受某些对该功能的滥用。接下来是我遇到的一些场景,monkeypatching 让我很痛苦。
虽然我根本不了解 Smalltalk,但这种语言早在 Ruby 之前就已经存在了。我做了一些研究,看看 Smalltalk 是否以及如何解决其中的一些问题,但在 Google 上没有找到太多。所以我在这里,询问 Smalltalkers 是否可以分享他们的智慧。
场景 A:错误修复冲突
项目 A 和 B 依赖于项目 C。项目 C 有一个错误。项目 A 和 B 版本包含对项目 C 的修复。
如果你的代码使用项目 A 和 B,你怎么知道补丁不会冲突?
场景 B:过时的错误修复
项目 C 发布其项目的固定次要版本。
如果您加载项目 A,是否仍会应用补丁,但可能会损坏?我很想知道是否存在某种机制,例如,如果代码已修复,则不加载补丁。
场景 C:冲突扩展
项目 A 和 B 使用项目 C 的类 Foo。两者都向 Foo 添加了一个实用方法,例如 #toDate。 A 的 toDate 版本返回日期字符串,B 的版本返回 Date 对象。
如果您加载两个项目(使用 C dep),是否有一种机制可以警告/防止冲突?或者您是否必须等到运行时由于方法中的错误期望而引发错误?
关于问题更新
阅读答案后,我意识到我的问题过于笼统和模糊。所以这里是它的重写版本。
【问题讨论】:
-
monkeypatch 真的是个问题吗?
-
您对猴子补丁的批评似乎离题太远了。与初始类设计相比,monkeypatching 中没有任何内在的东西会导致抽象泄漏。它本身也不比其他代码更“粗糙”。将一个对象拆分为不同的文件是正确的,尽管有些人认为拥有可管理的模块是一件好事——事实上,在 Objective-C 中对相关功能进行分组被认为是一种很好的做法。也许您的问题更多是与编码器有关,而不是语言功能。
-
在任何情况下,将事物拆分为单独文件的整个概念都是错误的。 smalltalk 不会那样做。
-
@CookieOfFortune & @Chuck:我的问题应该更具体,谢谢指出。
标签: ruby smalltalk monkeypatching