問題タブ [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.
ruby - モンキーパッチコアクラスの代替
私はまだ Ruby を使い始めたばかりで、基本的に Cooper の本を読み終わった後、最初のマイクロプログラムを書いたところです。私はサルのパッチを避ける方向を指摘されましたが、問題は、同じ動作を実現するための代替手段がわからないことです。基本的に、すべての文字列オブジェクトからアクセスできる新しいメソッドを追加したいと考えています。明らかなモンキーパッチの方法は次のとおりです。
String.send を使用する方法があることを思い出します。しかし、それがどのように行われたのか、どこで読んだのか思い出せません。そのメソッドを String クラスと子オブジェクトで使用できるようにする代替手段を誰か指摘できますか?
language-agnostic - モンキーパッチの何が問題になっているのか、具体的な例をお探しですか?
モンキーパッチがいかにクールであるか、またはモンキーパッチが地球上で最悪のものであるかについて、私は多くのああとああを聞いたことがあります。あるコードを書いて、他の誰かがその機能を変更して何か他のことをするのは良くないという考えがあります。しかし、私はこれが本当にあなたを傷つける可能性がある状況の具体的な例を探しています。つまり、私は常にコードを記述し、それから同僚がそれを変更します。では、モンキーパッチはそれとどう違うのですか?起こりうる最悪の事態は何ですか?
python - Ruby と Python の両方でモンキー パッチが許可されているのに、なぜ Ruby でもっと物議をかもしているのでしょうか?
私が聞いた Ruby についての多くの議論では、人々がこの言語について留保を表明していましたが、モンキー パッチの問題が彼らの主要な関心事の 1 つとして取り上げられました。
ただし、Python 言語でも許可されていますが、Python のコンテキストで同じ議論が行われることはめったにありません。
なぜこの区別?
Python には、この機能のリスクを最小限に抑えるためのさまざまなタイプのセーフガードが含まれていますか?
java - クラスの外部からJavaの`privatestatic final`フィールドの値を変更する方法はありますか?
私はこれが通常かなり愚かであることを知っていますが、質問を読む前に私を撃たないでください。私はこれを行う必要がある正当な理由があることを約束します:)
リフレクションを使用してJavaの通常のプライベートフィールドを変更することは可能ですが、Javaがfinal
フィールドに対して同じことを行おうとすると、セキュリティ例外がスローされます。
これは厳密に強制されていると思いますが、誰かがこれを行うためのハックを見つけた場合に備えて、とにかく尋ねると思いました。
SomeClass
クラス「 」を持つ外部ライブラリがあるとしましょう。
私は基本的に、自分のバージョンのを実行できるように、SomeClassをモンキーパッチしますdoSomething()
。(私の知る限り)Javaで実際にそれを行う方法はないので、ここでの唯一の解決策は、の値を変更INSTANCE
して、変更されたメソッドでクラスのバージョンを返すようにすることです。
基本的には、セキュリティチェックで呼び出しをラップしてから、元のメソッドを呼び出したいだけです。
外部ライブラリは常にgetInstance()
このクラスのインスタンスを取得するために使用します(つまり、シングルトンです)。
編集:明確にするために、getInstance()
私のコードではなく外部ライブラリによって呼び出されるので、サブクラス化するだけでは問題は解決しません。
それができない場合、私が考えることができる他の唯一の解決策は、クラス全体をコピーして貼り付け、メソッドを変更することです。ライブラリの変更に合わせてフォークを最新の状態に保つ必要があるため、これは理想的ではありません。誰かがもう少し保守しやすいものを持っているなら、私は提案を受け入れます。
.net - PowerShell、拡張メソッド、およびモンキーパッチ
PowerShellで拡張メソッドを作成することはできますか?または、実行時に[string] liveのような既存のタイプの上に新しいメソッドを追加しますか?
python - Djangoで、別のデータベーステーブルで動作するようにUserクラスを変更するにはどうすればよいですか?
djangoを既存のアプリケーションと一緒に実行し、データベースを共有しています。そして、既存の「ユーザー」テーブル(Django自身のものではない)を使用してユーザー情報を格納したいと思います。
User定義のMetaクラスで、Djangoが使用するテーブルの名前を変更できるようです。
ただし、Djangoコア自体は変更しない方がよいでしょう。
したがって、コアauth.Userクラスを次のようにサブクラス化できると考えていました。
ここでの目的は、カスタマイズされたUserクラスにフィールドを追加することではありません。ただし、代替テーブルを使用するだけです。
ただし、これは失敗します(ORMは、our_user_tableに元のUserテーブルを参照する外部キーが必要であると想定しているためと思われますが、そうではありません)。
それで、私たちがやりたいことをするためのこの賢明な方法はありますか?クラスをテーブルにマップする簡単な方法を見逃したことがありますか?または、そうでない場合、これを機能させることができますか?
アップデート :
local_settings.pyのUserの_metaに「モンキーパッチ」を適用するだけで、必要な変更を加えることができると思います。
私がこれをした場合に起こり得る何か悪いことを誰かが考えることができますか?(特に、かなり典型的なDjango / Pinaxアプリケーションのコンテキストでは?)
ruby - Ruby で安全で下位互換性のある「reverse-monkeypatch」を行うにはどうすればよいですか?
あなたの同僚がRubyのクラスを「オープン」(「モンキーパッチ」)し、あなたが使用する必要があるいくつかの重要な機能を再定義した場合、モンキーパッチが適用された定義にすでに依存している/依存しているシステムを壊すことなく、モンキーパッチが適用される前の元の機能にどのようにアクセスしますか? ?
ruby - Ruby コードがロードされる順序にどのように影響を与えることができますか?
あなたの同僚が Fixnum クラスにモンキーパッチを適用し、+ メソッドを再定義して、加算ではなく減算を行ったとします。
あなたの問題は、 + メソッドの元の機能にアクセスしたいということです。したがって、このコードを同じソース ファイル内の彼の前にドロップします。+ メソッドを「original_plus」にエイリアスしてから、モンキーパッチを適用します。
+ メソッドの元の機能に original_plus からアクセスできるようになりました
しかし、私が知る必要があるのはこれです:
彼が変更したのと同じソースファイルに貼り付ける以外に、彼のmonkeypatchがロードされる前にこのエイリアスをロードする方法はありますか?
私の質問には2つの理由があります:
- 私がこれをしたことを彼に知られたくないかもしれません
- エイリアスがモンキーパッチより下になるようにソースファイルが変更された場合、エイリアスはもはや望ましい結果を生成しません。