麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Ruby > 正文

Monkey Patch猴子補(bǔ)丁編程方式及其在Ruby中的運(yùn)用

2020-10-29 19:35:04
字體:
供稿:網(wǎng)友

何謂猴子補(bǔ)?。∕onkey Patch)?在動(dòng)態(tài)語言中,不修改源代碼而對(duì)功能進(jìn)行追加和變更。

使用猴子補(bǔ)丁的目的:
1、追加功能
2、功能變更
3、修正程序錯(cuò)誤
4、增加鉤子,在執(zhí)行某個(gè)方法的同時(shí)執(zhí)行一些其他的處理,如打印日志,實(shí)現(xiàn)AOP等,
5、緩存,在計(jì)算量很大,結(jié)算之后的結(jié)果可以反復(fù)使用的情況下,在一次計(jì)算完成之后,對(duì)方法進(jìn)行替換可以提高處理速度。

Ruby的類都是開放類,即在類定義之后還可以任意添加內(nèi)容, 這就使得在Ruby中使用猴子補(bǔ)丁變得特別容易了。另外,Ruby還提供了對(duì)方法、類和模塊的進(jìn)行操作的功能,讓我們使用猴子補(bǔ)丁更加得心應(yīng)手。Ruby提供的基本功能如下:
      alias:給方法另起別名
      include:引入其他模塊的方法
      remove_method: 取消本類中的方法
      undef:取消方法 
     
在 Ruby 中使用 Monkey Patch
我當(dāng)時(shí)遇到的場(chǎng)景是這樣的:

我司使用第三方庫 fog 進(jìn)行 EC2 的操作。創(chuàng)建實(shí)例等很多命令都需要設(shè)置實(shí)例類型這個(gè)參數(shù)。在 fog 里,EC2 的所有類型都定義在 fog/aws/models/compute/flavors.rb 的 FLAVORS 數(shù)組里。如果設(shè)置的類型不在 FLAVORS 數(shù)組里,fog 都會(huì)視作是無效的參數(shù)而報(bào)錯(cuò)。

后來,亞馬遜發(fā)布了新的實(shí)例類型 D2。雖然 Ruby 的第三方社區(qū)非?;钴S,但是 fog 的開發(fā)社區(qū)還是沒有及時(shí)添加 D2 到 flavors.rb 里;而我司的工作又迫切需要使用 D2 類型的實(shí)例。

背景交待完畢,接下來看看有什么樣的解決方法。

方法一:我們可以向 fog 提交一個(gè) Pull Request 來添加新類型。

但是這個(gè)方法行不通。我們使用的 knife-ec2 對(duì) fog 的版本依賴必須是 1.25.*,但是 fog 已經(jīng)更新到了 1.31.0,而且 fog 從 1.27.0 開始結(jié)構(gòu)上有很大的變化。顯然,我們不可能再等 knife-ec2 升級(jí)支持新版本的 fog,所以我們提交 Pull Request 更新 fog 不能解決問題。

方法二:手動(dòng)更新舊版 fog 既然不能使用最新版的 fog,我們可以手動(dòng)編輯 1.25 版的 fog,再打包成 Gem 使用。這個(gè)方法比前一個(gè)方法更容易操作,但是帶來的問題時(shí)不易于維護(hù)。為了一個(gè)極小的改動(dòng),把自己的代碼加入到第三方庫中總是讓人覺得不夠「干凈」。

最后,在同事的指點(diǎn)下,我采用了第三種方法,即 Monkey Patch。我在我司的 Ruby 項(xiàng)目里添加了一個(gè)文件 lib/PROJECT_NAME/monkey_patches/flavors.rb,接著在文件中添加以下代碼來修改 fog/aws/models/compute/flavors:

require 'fog/aws/models/compute/flavors'class Object def redef_without_warning(const, value)  mod = self.is_a?(Module) ? self : self.class  mod.send(:remove_const, const) if mod.const_defined?(const)  mod.const_set(const, value) endendmodule Fog module Compute  class AWS   NEW_FLAVORS = FLAVORS + [    {     :id => "d2.xlarge",     ...    },    {     :id => "d2.2xlarge",     ...    },    {     :id => "d2.4xlarge",     ...    },    {     :id => "d2.8xlarge",     ...    }   ]   redef_without_warning :FLAVORS, NEW_FLAVORS  end endend

總結(jié)
通過在自己的代碼中添加一個(gè) Monkey patch,我們成功地實(shí)現(xiàn)了向 fog 中動(dòng)態(tài)添加新實(shí)例類型。我司終于可以使用 fog 創(chuàng)建 D2 類型的機(jī)器了;而且這個(gè)方法改動(dòng)的代碼量最小,也更加容易維護(hù)。

Monkey Patch 并非是完美的解決方法,它會(huì)引入一些陷阱。所以這個(gè)技巧在軟件工程領(lǐng)域還有一些爭(zhēng)議。不過,我還是覺得 Monkey Patch 是一個(gè)不錯(cuò)的零時(shí)性解決方法。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产精品久久久久网站 | 亚洲九九爱 | 国产精品www | 99ri在线| 本站只有精品 | 青热久思思 | 毛片在线免费播放 | 久久丝袜脚交足黄网站免费 | 久久久综合视频 | 黄色免费影片 | 欧美14一15sex性hd| 久久精品在线免费观看 | 亚洲黑人在线观看 | xxxx69hd一hd| 91精品国 | 亚洲黑人在线观看 | 国产精品午夜未成人免费观看 | 福利在线免费 | 国内精品久久久久影院不卡 | 羞羞的视频免费在线观看 | 黄色av一区二区三区 | 免费人成年短视频在线观看网站 | 嗯~啊~弄嗯~啊h高潮视频 | 国产毛片aaa一区二区三区视频 | 九九热免费观看 | 久久综合精品视频 | 久草干 | 国产剧情在线观看一区二区 | 国产免费视频一区二区裸体 | 国产精品高潮99久久久久久久 | 中文字幕精品一二三四五六七八 | 国产91久久精品 | 欧美成在人线a免费 | 免费国产一级淫片 | 91欧美视频 | 亚洲操比视频 | 欧美激情视频一区二区免费 | 妇子乱av一区二区三区 | 男女隐私免费视频 | 怦然心动50免费完整版 | 成人不卡在线观看 |