問題タブ [monkeypatching]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Javaでパッチを適用することは可能ですか?
可能であれば、このアプローチのメリットについては議論したくありません。答えは「いいえ」だと思います。しかし、誰かが私を驚かせるかもしれません!
コア ウィジェット クラスがあるとします。calculateHeight()高さを返すメソッドがあります。高さが大きすぎます - これにより、(たとえば) ボタンが大きすぎます。DefaultWidget を拡張して独自の NiceWidget を作成し、独自のものを実装してより適切calculateHeight()なサイズを返すことができます。
現在、ライブラリ クラス WindowDisplayFactory は、かなり複雑なメソッドで DefaultWidget をインスタンス化しています。あなたは、NiceWidget を使用したいと考えています。ファクトリ クラスのメソッドは次のようになります。
それが取引です。その結果、DefaultWidget は他のオブジェクトの階層の奥深くにあります。質問 - このファクトリ メソッドを取得して自分の NiceWidget を使用するにはどうすればよいですか? または、少なくとも自分のものcalculateHeight()をそこに入れます。理想的には、DefaultWidget にモンキー パッチを適用して、その calculateHeight が正しいことを実行できるようにしたいと考えています...
これは私が Python や Ruby などでできることです。名前は私が思いつきましたsetMethod()。私に開かれている他のオプションは次のとおりです。
createView()ファクトリ クラスから継承する独自のクラスにメソッドのコードをコピー アンド ペーストする- 大きすぎるウィジェットとの生活
ファクトリ クラスは変更できません。コア プラットフォーム API の一部です。返された結果を反映して、(最終的に) 追加されたウィジェットにたどり着きましたが、それはいくつかのウィジェット層であり、どこかで他のものを初期化するために使用され、奇妙な副作用を引き起こしています。
何か案は?これまでの私の解決策はコピー アンド ペーストの仕事ですが、それはプラットフォームの新しいバージョンにアップグレードするときに親ファクトリ クラスの変更を追跡する必要があるため、他のオプションを聞くことに興味があります。
ruby - Rubyで「モンキーパッチ」とは正確にはどういう意味ですか?
ウィキペディアによると、モンキー パッチは次のとおりです。
元のソース コードを変更せずに、動的言語のランタイム コードを拡張または変更する方法 [...]。
同じエントリからの次のステートメントは、私を混乱させました。
Ruby では、モンキー パッチという用語は、クラスへの動的な変更を意味すると誤解されており、実行時に任意のクラスを動的に変更することの同義語としてよく使用されます。
Rubyでのモンキーパッチの正確な意味を知りたいです。次のようなことをしていますか、それとも別のことですか?
ruby-on-rails - [] ルビ文字列のメソッド
Beast のソース コードを読んでいると、次のようなコードがたくさん見つかりました。
私には Symbol を String への入力パラメーターとして [] メソッドを呼び出すように思えますが、Ruby API で String [] メソッドのそのようなタイプのパラメーターを見つけられませんでした。これはどういう意味ですか?前もって感謝します。
oop - モンキーパッチをするかしないか?
これはより一般的な質問であり、言語固有のものですが、python ncurses モジュールで遊んでいるときにこの問題に遭遇しました。ロケール文字を表示し、それらを文字として認識させる必要があったため、curses モジュールのいくつかの関数/メソッドにモンキー パッチを適用しました。
これは、機能するとしても、高速で醜いソリューションと私が呼ぶものでした。そして、変更は比較的小さかったので、何も台無しにしていないことを願っています. 私の計画は別の解決策を見つけることでしたが、それが機能し、うまく機能しているのを見て、対処しなければならなかった他の問題に進みました。これにバグがなければ、決して解決しません改善する。
しかし、より一般的な質問が私に現れました-明らかに、一部の言語では、クラス内のコードの大きなチャンクをモンキーパッチすることができます。これが自分だけのコードであるか、変更が小さい場合は問題ありません。ただし、他の開発者が私のコードを使用した場合、彼は私がよく知られたモジュールを使用していることを知っているので、以前と同じように機能すると想定できます。次に、このメソッドは突然、本来の動作とは異なる動作をします。
では、非常に主観的な話ですが、モンキー パッチを使用する必要がありますか。どのように文書化する必要がありますか?
編集:@ゲルダのために:
モンキー パッチは、コード自体を変更することなく、実行時にコードの一部の動作を動的に変更する機能です。
Python での小さな例:
python - モンキーパッチを使用せずにDjangoユーザーをGoogleアプリと同期する
Djangoアプリを作成していますが、アカウントがローカルで作成されるたびに、ProvisioningAPIを使用してGoogleAppsでホストされているメールにアカウントを作成したいと考えています。
シグナルのみを使用しますが、パスワードをサイト間で同期させたいので、モンキーパッチを適用し、ラッパーUser.objects.create_userをUser.set_password使用してGoogleアカウントを作成し、パスワードを更新しました。
モンキーパッチは眉をひそめているようですので、これを達成するためのより良い方法はありますか?
perl - Perl でインスタンス メソッドにモンキー パッチを適用するにはどうすればよいですか?
LWP::UserAgent次のように、インスタンスにモンキー パッチ (ダック パンチ :-) を適用しようとしています。
これは正しい構文ではありません。結果は次のようになります。
[module] 行 [lineno] の非左辺値サブルーチン呼び出しを変更できません。
私が思い出したように ( Perl のプログラミングから)、ディスパッチ ルックアップは、祝福されたパッケージに基づいて動的に実行されるref($agent)ため (私は信じています)、祝福されたパッケージに影響を与えずにインスタンス モンキーのパッチ適用がどのように機能するかはわかりません。
をサブクラス化できることはわかっていますがUserAgent、より簡潔なモンキーパッチを適用したアプローチを好みます。大人の同意とあなたが持っているもの。;-)
perl - Perl モンキー パッチを適用すると、パッチを適用したパッケージのスコープを確認できますか?
「Perl でインスタンス メソッドにモンキー パッチを適用するにはどうすればよいですか?」の冒頭で説明した手法を使用して、パッケージにモンキー パッチを適用しています。. 私が直面している問題は、元のサブルーチンがパッケージ レベルのmy変数を使用していたことです。パッチを適用したサブルーチンは、フル パスの指定または暗黙的な使用によってアクセスできないようです。
パッチを適用したサブルーチンで使用するために、この方法で範囲指定されたデータを取得する方法はありますか?
php - (monkeypatch) PHP 関数を置き換えることは可能ですか?
これは Python で実行できますが、PHP で実行できますか?
例えば:
oop - モンキーパッチ/クラスの再開は本当にリフレクションの例ですか?
この質問の再帰的な性質についてはお詫びしますが、SOに関する質問に対して選択された回答により、反射の理解に疑問が生じました。
リフレクションは主に、プログラムの実行中に内部で起こっていることを照会することだと思っていました。このレスポンスに示されている例は、Ruby の組み込み Integer クラスにパッチを当てています。
- これは、実行時の変更というよりも、関数のオーバーロード/継承に似ていませんか?
- クラスの再開は本当に反省の例ですか?
perl - Perlでmonkeypatchedメソッドの元のメソッドにアクセスするにはどうすればよいですか?
Perl クラスにモンキー パッチを適用しようとしています。既存のメソッドの動作を変更したいと考えています。
perlmonks のこのノードは、関数を既存のクラスに追加する方法を示しています。このパターンは、既存の関数に新しい実装を提供するためにも使用できることがわかりました。
ただし、元の関数を呼び出す方法を知りたいです。
私はこのようなものを探しています: