コンピュータプログラミングにおいて、モンキーパッチとは、実行時にコードの動作を動的に更新するために使用される手法です。これは、元のソースコードを変更せずに、 Smalltalk、JavaScript、Objective-C、Ruby、Perl、Python、Groovy、Lispなどの動的言語のランタイムコードを拡張または変更するために使用されます。
語源
モンキーパッチという用語は、実行時にこっそりとコードを変更する(おそらく他の同様のパッチとは互換性がない)ことを指していた、以前の用語であるゲリラパッチから来ているようです。ゴリラとほぼ同音のゲリラという言葉がモンキーになりましたが、これはおそらくパッチの威圧感を和らげるためでしょう。[1]
別の語源としては、コードをいじる(いじる)ことを意味するという説があります。[要出典]
名前の示唆に反して、「モンキー パッチ」はプログラムを拡張するための公式の方法である場合があります。たとえば、FirefoxやInternet Explorerなどの Web ブラウザーはかつてこれを推奨していましたが、最近のブラウザー (Firefox を含む) には公式の拡張機能システムがあります。[引用が必要]
定義
この用語の定義は、それを使用するコミュニティによって異なります。Ruby 、[2]、Python 、 [ 3] 、およびその他の多くの動的プログラミング言語では、モンキーパッチという用語は、実行時にクラスまたはモジュールを動的に変更することのみを指します。これは、バグや期待どおりに動作しない機能に対する回避策として、既存のサードパーティコードにパッチを当てるという意図によるものです。実行時にクラスを変更するその他の形式は、その異なる意図に基づいて異なる名前が付けられています。たとえば、ZopeとPloneでは、セキュリティパッチは動的クラス変更を使用して配信されることがよくありますが、ホットフィックスと呼ばれています。[要出典]
アプリケーション
モンキーパッチは次の目的で使用されます。
- 実行時にメソッド/クラス/属性/関数を置き換えます(例:テスト中に関数をスタブ化するため)。
- ソースコードのプライベートコピーを保持せずにサードパーティ製品の動作を変更/拡張する。
- 実行時にパッチの結果をディスク上のソースコードではなくメモリ内の状態に適用します。
- 元のソースコードと並行してセキュリティまたは動作の修正を配布する (例としては、 Ruby on Railsプラットフォームのプラグインとして修正を配布することが挙げられます)。
落とし穴
悪意のある、不適切な記述、および/または不十分に文書化されたモンキーパッチは、次のような問題を引き起こす可能性があります。
- パッチがパッチを当てたオブジェクトについてもはや真実ではない仮定をした場合、アップグレードの問題を引き起こす可能性があります。新しいリリースによってパッチが壊れる可能性も十分にあります。このため、モンキーパッチは条件付きで作成されることが多く、適切な場合にのみ適用されます。[4]
- 2つのモジュールが同じメソッドにモンキーパッチを適用しようとすると、そのうちの1つ(最後に実行されたもの)が「勝ち」、もう1つのパッチは効果がありません。ただし、モンキーパッチが のようなパターンで記述されている場合は除きます
alias_method_chain。[5] - パッチは元のソースコードと観察された動作の間に矛盾を生じさせ、パッチの存在を知らない人にとっては非常に混乱を招く可能性があります。たとえば、Linuxカーネルは、カーネル構造を改ざんするNvidiaドライバーなどのプロプライエタリモジュールやその他のサードパーティモジュールを検出し、開発者が修正できない問題のデバッグに時間を無駄にしないようにします。[6]
- アドオンは、メインプログラムや互いを攻撃するために悪意のあるコードで書かれることがあります。例えば、2009年にNoScriptの開発者であるGiorgio Maoneは、 FirefoxのAdblock Plus拡張機能を攻撃し、自身のウェブサイトの広告が機能するように例外を追加しました。問題のコードは、ユーザーが例外を削除しようとしても、例外が再度追加されるようにもしていました。この口論は広範囲にわたる怒りを引き起こし、新しいアドブロックルールがユーザーに押し付けられる一方で、Maoneが新しいルールを妨害し、最終的にMozillaが介入してアドオンに関するポリシーを変更することになりました。[7]
例
次の Python の例では、標準の Python 数学ライブラリのPiの値をモンキーパッチして、インディアナ州の Pi 法案に準拠させます。
>>> import math
>>> math . pi
3.141592653589793
>>> math . pi = 3.2 # math モジュールの Pi の値をモンキーパッチします
>>> math . pi
3.2
================================ RESTART ===================================
>>> import math
>>> math . pi
3.141592653589793
>>>
参照
- ポリフィル
- アドバイス(プログラミング)
- アスペクト指向プログラミング
- Objective-C のカテゴリ
- 動的ロード
- C# の拡張メソッド
- 自己修正コード
参考文献
- ^ 「用語集 - 'モンキーパッチ' の定義」。Ploneコンテンツ管理システム。2021-01-22 にオリジナルからアーカイブ。2021-07-02に取得。
誰かがゲリラパッチを非常に慎重に作成し、戦闘を避けようとしたとき、彼らはそれをモンキーパッチと呼ぶことで、それをあまり強力ではないように見せようとしました
。 - ^ ナッター、チャールズ・オリバー。「ルビーの精製」チャールズ・オリバー・ナッター。
- ^ Biswal, Bimal. 「Python でのモンキーパッチ」。ソフトウェア技術のヒント。Mindfire Solutions。2012 年 8 月 22 日時点のオリジナルよりアーカイブ。2013年12 月 9 日閲覧。
- ^ Zakas, Nicholas C. (2010 年 3 月 2 日)。「メンテナンス可能な JavaScript: 所有していないオブジェクトを変更しない - Human Who Codes」。Human Who Codes。
- ^ 「Rails の新機能: Module#alias_method_chain」。Ruby on Rails。
- ^ 「Tainted kernels — Linux カーネルドキュメント」www.kernel.org . 2020年7月12日閲覧。
- ^ Paul, Ryan (2009-05-04). 「Mozilla、Firefox拡張機能をめぐる戦いの後にポリシー変更を検討」Ars Technica . 2020年7月12日閲覧。
