【问题标题】:Looking for a concrete example of what's wrong with monkey patching?寻找猴子修补有什么问题的具体示例?
【发布时间】:2009-03-30 21:42:03
【问题描述】:

我听到了很多关于猴子补丁如何如此酷或者猴子补丁是地球上最糟糕的事情的声音。我的想法是,如果您编写一些代码然后其他人更改其功能以执行其他操作,这并不好。但我正在寻找一个具体的例子来说明这可能会真正伤害到你。我的意思是,我一直在编写代码,然后我的同事对其进行更改。那么,monkey patching 与此有何不同? 可能发生的最坏情况是什么

【问题讨论】:

    标签: language-agnostic monkeypatching


    【解决方案1】:

    编程已经从需要了解全局状态才能了解本地行为的编码实践缓慢而稳定地转变。一些例子:

    • Gotos 使推理控制流变得更加困难,因为您可能需要查看 远处的代码,看看你如何到达特定的行。
    • 全局变量也不受欢迎,因为程序的任何部分都可以更改影响任何其他部分的状态。
    • 支持函数式编程,因为这意味着您无需担心函数之外的任何状态即可了解其行为方式。

    猴子补丁意味着如果不查看程序中的所有其他代码行,就无法知道一行代码的作用。快速完成某事可能很有用,但它会使大型程序无法理解。既然这么多大程序都是从小程序开始的,猴子补丁可能是你想改掉的一个习惯。

    【讨论】:

      【解决方案2】:

      Monkey 修补会从对象的其余部分和对象的文档中隐藏对对象的更改。使用该对象非常容易,检查它的文档以确保它符合您的预期,然后发现它并不能完全按照这种方式工作。

      如果您从事的项目会出现开发人员流失,这尤其糟糕,您需要更多地担心如何让新开发人员跟上您的代码库的速度。新开发人员不会意识到补丁的细微差别,因此您将很难从中获得好的代码。

      至于可能发生的最坏情况,如果您的应用出现错误,可能发生的最坏情况是什么?有人会因为一件设备功能不正确而死吗?您是否会通过向他们发送错误的账单或向他们的帐户收取过多费用来破坏他们的信用评级?

      【讨论】:

        【解决方案3】:

        这取决于环境,即您是否与其他人共享代码。不过,考虑一下可以在 Smalltalk 中完成的事情:更改 + 运算符的含义。如果我引入一个+ 函数,例如,减去一个参数,事情将会以华丽而出乎意料的方式中断。

        【讨论】:

        • 所以,如果我共享代码,比如在一个开源项目中,那么我可以给其他人带来问题,是吗?如果我编写一个人们使用的库,将他们的 + 运算符更改为像减号运算符一样,那几乎就像编码病毒一样。但你是说如果我一个人使用代码可能没问题。
        • 哦,我会走得更远。这只是你必须非常谨慎的事情。例如,添加方法比修改现有方法的行为要好。但是 Rails 在 Ruby 中很好地使用了它,例如。参见 InfoQ:infoq.com/articles/ruby-open-classes-monkeypatching
        • 即使自己工作,这也是一种非常糟糕的做法。你永远不知道什么时候你可能会在一段时间后回到那个代码,并且可能会忘记你的初衷。
        • 并非总是如此,但必须遵守纪律。这你应该三思而后行的事情。如果没有更多。
        • infoq 的文章很棒。正是我需要的。谢谢。
        【解决方案4】:

        嗯,这真的取决于你的意思......

        写一些代码不好 然后其他人改变了它 做其他事情的功能

        有什么要求?现在和以前都一样。如果需求发生了变化并且生成的代码集必须更改,这称为维护或增强。我很少能在现实世界中遇到“猴子补丁”有效的一段代码,尽管它也严重依赖于谁编写了代码,多久以前等等。太多的变量无法给出真正有效的答案.简而言之,如果您需要做的就是在客户想要的时候为他们提供他们想要的东西,那么这可能是一个很好的“哦,最好这样做”。这完全取决于您的观众。

        【讨论】:

          猜你喜欢
          • 2017-06-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-20
          • 2012-03-13
          • 2013-12-26
          • 2012-06-14
          • 2012-03-29
          • 2016-10-30
          相关资源
          最近更新 更多