【问题标题】:Do any "major" frameworks make use of monkey-patching/open classes是否有任何“主要”框架使用猴子补丁/开放类
【发布时间】:2010-10-27 14:54:09
【问题描述】:

我很好奇在诸如语言之类的语言中使用称为开放课程或猴子补丁的功能。 Ruby、Python、Groovy 等。此功能允许您在运行时对现有类或对象进行修改(如添加或替换方法)。

有谁知道主要框架(例如 Rails/Grails/Zope)是否(广泛)利用这个机会为开发人员提供服务?如果有,请举例说明。

【问题讨论】:

    标签: language-agnostic


    【解决方案1】:

    它在 Java 平台上的一个使用示例(因为您提到了 Groovy)是加载时编织,例如 AspectJ 和 JVM 插装。但是,在这种特殊情况下,您可以选择使用编译时编织。有趣的是,我最近的一个 SO 问题与使用这种加载时编织的问题有关,其中一些建议将编译时作为唯一可靠的选项。

    使用加载时(运行时)编织为开发人员提供有用服务的 AspectJ 示例是 Spring 的 @Configuration 注释,它允许您对未由 Spring 的 BeanFactory 实例化的对象使用依赖注入。

    您特别提到了修改方法(或其工作方式),并且使用的一个示例是在发送到处理程序(某些控制器方法或 doPost 等)之前拦截 http 请求并检查查看用户是否有权访问该资源。然后,您的方面可能会决定过早地返回带有重定向登录的响应。虽然不修改方法本身的内容,但您仍在修改方法的工作方式,即更改它本来会给出的返回值。

    【讨论】:

      【解决方案2】:

      .Net 通过扩展方法允许它。

      具体来说,Linq 严重依赖于 IEnumerable 接口上的猴子补丁扩展方法。

      【讨论】:

      • 我知道,但这并不是我在这里真正要问的。
      • 也许如果我缩小范围:在 .Net 中,特别是 linq,大量使用猴子修补到 IEnumerable 接口上的扩展方法,以便“为 deloper[原文] 提供服务”
      • 不过,我不知道这是否真的符合猴子修补的条件,因为没有对原始类/接口进行任何更改。 (感谢指出错字,顺便说一句:))
      【解决方案3】:

      Rails 做到了(恕我直言)荒谬的程度。

      【讨论】:

        猜你喜欢
        • 2012-12-11
        • 2010-09-29
        • 2011-04-15
        • 2011-01-14
        • 2012-08-19
        • 2016-09-01
        • 2012-09-16
        • 2012-12-18
        • 2020-01-09
        相关资源
        最近更新 更多