Ruby使用Monkey Patch猴子补丁方式进行程序开发的示例

猴子补丁(Monkey Patch)是一种特殊的编程技巧。Monkey patch 可以用来在运行时动态地修改(扩展)类或模块。我们可以通过添加 Monkey Patch 来修改不满足自己需求的第三方库,也可以添加 Monkey Patch 零时修改代码中的错误。

词源
Monkey patch 最早被称作 Guerrilla patch,形容这种补丁像游击队员一样狡猾。后来因为发音相似,被称为 Gorilla patch。因为大猩猩不够可爱,后改称为 Monkey patch。

使用场景
以我的理解,Monkey patch 有两种使用场景:
紧急的安全性补丁,即 Hotfix;
修改或扩展库中的属性和方法。

例子:
alias:

class Monkey2 < Monkey
 def method2
  puts "This is method2"
 end 

 alias output method2
end 

monkey = Monkey2.new
monkey.method2
monkey.output

include:

module Helper
 def help
  puts "Help..."
 end 

 def method1
  puts "helper method1..."
 end
end 

class Monkey
 include Helper
 def method1
  puts "monkey method1..."
 end
end 

monkey = Monkey.new
monkey.help
monkey.method1#因为重名,当前类的方法优先

undef:

class Monkey
 def method1
  puts "This is method1"
 end
end  

class Monkey2 < Monkey
 def method2
  puts "This is method2"
 end
end 

monkey = Monkey2.new
monkey.method1
monkey.method2 

class Monkey2
 undef method1
 undef method2
end 

monkey.method1
monkey.method2

我们还可以使用undef_method或者remove_method实现undef <method_name>同样的功能,例子如下:

class Monkey2
 remove_method :method1
 undef_method :method2
nd

在使用猴子补丁的时候,还应注意如下事项:
1、基本上只追加功能
2、进行功能变更时要谨慎,尽可能的小规模
3、注意相互调用

(0)

相关推荐

  • android压力测试命令monkey详解

    一.Monkey 是什么?Monkey 就是SDK中附带的一个工具. 二.Monkey 测试的目的?:该工具用于进行压力测试. 然后开发人员结合monkey 打印的日志 和系统打印的日志,结局测试中出现的问题. 三.Monkey 测试的特点?Monkey 测试,所有的事件都是随机产生的,不带任何人的主观性. 四.Monkey 命令详解 1).标准的monkey 命令[adb shell] monkey [options] <eventcount> , 例如:adb shell monkey -

  • android monkey自动化测试改为java调用monkeyrunner Api

    众所周知,一般情况下我们使用android中的monkeyrunner进行自动化测试时,使用的是python语言来写测试脚本.不过,最近发现可以用java调用monkeyrunner Api,用java语言写测试脚本. 于是,就简单研究了一下.这里做一些总结.希望有对在研究的午饭可以有所用处. 开始时,搜素到一些零碎的教程,说使用java调用monkeyrunner时,需要导入android sdk  tools路径下的lib里面的4个包:ddmlib.jar,guavalib.jar,monk

  • 详解Python编程中对Monkey Patch猴子补丁开发方式的运用

    Monkey patch就是在运行时对已有的代码进行修改,达到hot patch的目的.Eventlet中大量使用了该技巧,以替换标准库中的组件,比如socket.首先来看一下最简单的monkey patch的实现. class Foo(object): def bar(self): print 'Foo.bar' def bar(self): print 'Modified bar' Foo().bar() Foo.bar = bar Foo().bar() 由于Python中的名字空间是开放

  • Android自动测试工具Monkey

    前言: 最近开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括android测试框架.CTS.Monkey.Monkeyrunner.benchmark.其它test tool等等.因接触时间很短,很多地方有不足之处,希望能和大家多多交流. 一.Monkey定义 探索软件测试工具有哪些,本文主要介绍Monkey工具.Monkey测试是Android平台自动化测试的一种手段,通过Monkey程序模拟用户触摸屏幕.滑动.按键等操作来对设备上的程序进行压力测

  • Android自动测试工具Monkey的实现方法

    1. Android Monkey 实现操作流程: 准备:在eclipse里安装Phyon插件,可以选择在线安装,也可以下载zip解压后放在eclipse安装目录的dropins下,如 : /personal/software/android_developtools/adt-bundle-mac-x86_64-20130522/eclipse/dropins/PyDev 2.8.2 插件准备就绪就重启eclipse,检验PyDev是否正常工作,然后开始MonkeyRunner测试: 第一步:

  • javascript SpiderMonkey中的函数序列化如何进行

    在Javascript中,函数可以很容易的被序列化(字符串化),也就是得到函数的源码.但其实这个操作的内部实现(引擎实现)并不是你想象的那么简单.SpiderMonkey中一共使用过两种函数序列化的技术:一种是利用反编译器(decompiler)将函数编译后的字节码反编译成源码字符串,另一种是在将函数编译成字节码之前就把函数源码压缩并存储下来,用到的时候再解压还原. 如何进行函数序列化 在SpiderMonkey中,能将函数序列化的方法或函数有三个:Function.prototype.toSt

  • 用Greasemonkey 脚本收藏网站会员信息到本地

    一.脚本功能介绍 正常情况下,如果你在会员搜索结果页通过相片看好某个会员(所谓眼缘好的会员),想快速记录下这个会员的信息并不是一件容易的事情,你也许会在会员相片上单击右键,然后把这个会员的主页地址先记下来,一个页面如果有较多看好的会员想收藏的话,你还得重复上面的操作.默认搜索结果页显示效果如下图: 安装我写的Greasemonkey脚本后,搜索结果页就会发生一点改变,"给我写信"按钮会变成"收藏"复选框,效果如下图,注意红框标识与前面图片的变化对比: 现在假设你想收

  • Ruby使用Monkey Patch猴子补丁方式进行程序开发的示例

    猴子补丁(Monkey Patch)是一种特殊的编程技巧.Monkey patch 可以用来在运行时动态地修改(扩展)类或模块.我们可以通过添加 Monkey Patch 来修改不满足自己需求的第三方库,也可以添加 Monkey Patch 零时修改代码中的错误. 词源 Monkey patch 最早被称作 Guerrilla patch,形容这种补丁像游击队员一样狡猾.后来因为发音相似,被称为 Gorilla patch.因为大猩猩不够可爱,后改称为 Monkey patch. 使用场景 以我

  • Monkey Patch猴子补丁编程方式及其在Ruby中的运用

    何谓猴子补丁(Monkey Patch)?在动态语言中,不修改源代码而对功能进行追加和变更. 使用猴子补丁的目的: 1.追加功能 2.功能变更 3.修正程序错误 4.增加钩子,在执行某个方法的同时执行一些其他的处理,如打印日志,实现AOP等, 5.缓存,在计算量很大,结算之后的结果可以反复使用的情况下,在一次计算完成之后,对方法进行替换可以提高处理速度. Ruby的类都是开放类,即在类定义之后还可以任意添加内容, 这就使得在Ruby中使用猴子补丁变得特别容易了.另外,Ruby还提供了对方法.类和

  • python 猴子补丁(monkey patch)

    写了一段时间java切回写python偶尔会出现一些小麻烦,比如:在java中自定义对象变成json串很简单,调用一个方法就行,但同样的转换在python中却不太容易实现.在寻找python自定义对象转json串的过程中,接触到了猴子补丁这个东西,感觉还有点意思:本文先实现python自定义对象转json串,再简单谈一下猴子补丁. python自定义对象转json串 python自带的json包不支持自定义对象转json串,在python中用json.dumps转自定义对象时会报异常class

  • Python猴子补丁Monkey Patch用法实例解析

    属性在运行时的动态替换,叫做猴子补丁(Monkey Patch). 为什么叫猴子补丁 属性的运行时替换和猴子也没什么关系,关于猴子补丁的由来网上查到两种说法: 1.这个词原来为Guerrilla Patch,杂牌军.游击队,说明这部分不是原装的,在英文里guerilla发音和gorllia(猩猩)相似,再后来就写了monkey(猴子). 2.还有一种解释是说由于这种方式将原来的代码弄乱了(messing with it),在英文里叫monkeying about(顽皮的),所以叫做Monkey

  • 简单聊聊Python中的鸭子类型和猴子补丁

    目录 前言 鸭子类型 猴子补丁 总结 前言 Python 开发者可能都听说过鸭子类型和猴子补丁这两个词,即使没听过,也大概率写过相关的代码,只不过并不了解其背后的技术要点是这两个词而已. 我最近在面试候选人的时候,也会问这两个概念,很多人答的也并不是很好.但是当我向他们解释完之后,普遍都会恍然大悟:“哦,是这个啊,我用过”. 所以,我决定来写一篇文章,探讨一下这两个技术. 鸭子类型 引用维基百科中的一段解释: 鸭子类型(duck typing)在程序设计中是动态类型的一种风格.在这种风格中,一个

  • Python猴子补丁知识点总结

    属性在运行时的动态替换,叫做猴子补丁(Monkey Patch). 为什么叫猴子补丁 属性的运行时替换和猴子也没什么关系,关于猴子补丁的由来网上查到两种说法: 1.这个词原来为Guerrilla Patch,杂牌军.游击队,说明这部分不是原装的,在英文里guerilla发音和gorllia(猩猩)相似,再后来就写了monkey(猴子). 2.还有一种解释是说由于这种方式将原来的代码弄乱了(messing with it),在英文里叫monkeying about(顽皮的),所以叫做Monkey

  • 生产消费者模式实现方式和线程安全问题代码示例

    生产者消费者模式的几种实现方式 拿我们生活中的例子来说,工厂生产出来的产品总是要输出到外面使用的,这就是生产与消费的概念. 在我们实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.线程.进程等). 产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者. 第一种:采用wait-notify实现生产者消费者模式 1. 一生产者与一消费者: 2. 一生产者与多消费者: 第二种: 采用阻塞队列实现生产者消费者

  • Centos中yum方式安装java的实现示例

    查看CentOS自带JDK是否已安装 [root@test ~]# yum list installed |grep java 若有自带安装的JDK,应如下操作进行卸载CentOS系统自带Java环境 [root@test ~]# java -version java version "1.7.0_181" OpenJDK Runtime Environment (rhel-2.6.14.8.el6_9-x86_64 u181-b00) OpenJDK 64-Bit Server VM

  • SpringMVC用XML方式实现AOP的方法示例

    1.首先创建web工程,之后导入Spring jar包,目录如下 2.文件代码 2.1AfterAdvice package com.niit.aop; import java.lang.reflect.Method; import org.springframework.aop.AfterReturningAdvice; /* * 后置通知 * havingClass方法执行之后才执行. * 输出日记 * */ public class AfterAdvice implements After

随机推荐