モンキ-パッチングVs.S.O.L.I.D.原則?
-
08-07-2019 - |
質問
私はゆっくりと動からPHP5Python一部の個人プロジェクトになっていましたを愛してありました。前を選択へのPythonのルートご本人の了解のもと、掲載しています。かっけからのお知らせをrubyのコミュニティとモンキ-パッチングを両立したと高い評価を受けています。もっ 多く ホラー物語に関する試験のデバッグruby s/wので誰かが含まれて比較的無害図書館にジョブが表示一部の良く使用されるオブジェクトの中核ことなくあります。
またPython用(その他の理由など)、クリーナーの構文ができることはないものRubyできます。PythonではOOをクリックしいPHPって、いくつかについて触れたいと思います。OOの原則をこよりです。
今日の夕方に笑い ロバート-マーチンの固体 原則として、"
- Single責任の原則
- Oペン/休館日原則として
- Liskov代替原則として
- I拡張インター分離の原則は、
- Dependency反転の原則
私は現在まで O: ソフトウェア団体(クラス、モジュール、関数、など) 開のための拡張が変更.
私の頭の中にスピンの紛争の間の一貫性を確実なものとするにOOデザイン、モンキ-パッチングというもの。理解していることが可能なモンキ-パッチング。私もこれ"pythonic"をはじめとする共通、試験、oopベスト-実践&原理です。
何というのは、コミュニティの意見に反対科; どのように相互運用が定期的にメンテナンスとのかどうかをモンキ-パッチングで行うべきである。今までの決議事項のだった。
解決
モンキーパッチ(既存のメソッドの上書きまたは変更)と新しいメソッドの単純な追加には違いがあります。後者は完全に問題なく、前者は疑わしく見るべきだと思いますが、私はそれを維持することにまだ賛成です。
サードパーティの拡張機能がコアライブラリにパッチを当てて問題を解決するという問題がかなり多く発生しましたが、それらは本当にひどいものです。残念なことに、それらはすべて、ソリューションを実際に適切に構築する方法を考えるのではなく、常にサードパーティのエクステンション開発者が最も抵抗の少ない道を進んでいることに起因すると思われます。
これは残念ですが、人々が時々自分自身を切るのはナイフメーカーのせいではなく、猿のパッチングのせいではありません。
モンキーパッチの正当な必要性を見たのは、サードパーティまたはコアライブラリのバグを回避することだけです。これだけでも、それは貴重であり、彼らがそれをする能力を取り除いたら本当に失望するでしょう。
所有していたC#プログラムのバグのタイムライン:
- 奇妙なバグレポートを読み、CLRライブラリのマイナーバグの問題を追跡します。
- 奇妙な場所で例外をキャッチし、コードを大いに侵害する多くのハッキングを含む回避策を考え出す日を投資します
- Microsoftがサービスパックをリリースする際にハッキングの回避策を解放するために何日も費やします
Railsプログラムのバグのタイムライン:
- 奇妙なバグレポートを読み、問題をruby標準ライブラリのマイナーバグにトレースします
- マイナーモンキーパッチを15分間実行して、Rubyライブラリからバグを削除し、Rubyの間違ったバージョンで実行されている場合は、ガードを配置してトリップします。
- 通常のコーディングを続けます。
- Rubyの次のバージョンがリリースされたら、後でmonkeypatchを単に削除します。
バグ修正プロセスは似ていますが、モンキーパッチの場合は15分間の解決策で、5秒間の「抽出」ですが、それがないと痛みや苦痛が続きます。
PS:次の例は「技術的に」です;サルパッチングですが、それは「道徳的に」ですモンキーパッチング?私は振る舞いを変えていません-これは多かれ少なかれルビーでAOPをしているだけです...
class SomeClass
alias original_dostuff dostuff
def dostuff
# extra stuff, eg logging, opening a transaction, etc
original_dostuff
end
end
他のヒント
私の考えでは、サルのパッチは有用ですが、悪用される可能性があります。人々はそれを発見する傾向があり、おそらくミックスインや他の構造がより適切なあらゆる状況で使用されるべきだと感じます。
これはあなたが違法とすべきだとは思わない、それはRubyの人たちが使うのが好きなものだ。 Pythonでも同様のことができますが、コミュニティは物事をよりシンプルでわかりやすいものにするというスタンスをとっています。
Monkeyのパッチ適用はrubyで明示的なものではなく、javascript全体で行われ、マイナス(IMO)効果があります。
個人的な意見としては、サルのパッチは次の目的にのみ使用するべきです
a)必要な言語の新しいバージョンで利用可能な言語の古いバージョンに機能を追加します。
b)他に「論理」がない場合それのための場所。
ADDITION などの基本的な機能の動作方法を変更する機能など、猿のパッチを本当にひどいものにする多くの簡単な方法があります。
私のスタンスは、あなたがそれを避けることができるなら、そうすることです。
それをうまく回避できるなら、称賛してください。
それを避けられない場合は、おそらく十分に考えていないので、200人の意見を聞いてください。
私の嫌いは、 function オブジェクトを拡張するmootoolsです。はい、これを行うことができます。 javascriptの仕組みを学ぶだけでなく、
setTimeout(function(){
foo(args);
}, 5000 );
すべての関数オブジェクトに新しいメソッドが追加されました(はい、冗談ではありません)。関数に独自の関数が追加されました。
foo.delay( 5000 , args );
この種のがらくたが有効であるという追加の効果がありました:
foo.delay.delay( 500, [ 500, args ] );
そしてそのような広告の無限。
結果は?あなたはもはや図書館を持っていない、あなたの言語は図書館に屈し、たまたま図書館が範囲内にあるなら、あなたはもはや言語を持っていなくて、あなたが学んだときに物事をただやったことはできない言語の代わりに、コマンドの新しいサブセットを習得する必要があります(過度の減速を犠牲にして!)
は、foo.delayが独自のメソッドを持つオブジェクトも返したことに気付くことがあります。そのため、
x = foo.delay( 500, args );
x.clear();
さらに
x.clear.delay(10);
これは非常に便利に聞こえるかもしれませんが、これを実行可能にするために使用される膨大なオーバーヘッドを考慮する必要があります。
clearTimeout(x);
SO HARD!
(免責事項:mooを使用してからしばらく経ちましたが、それを忘れようとしました。関数名/構造が間違っている可能性があります。これはAPIリファレンスではありません。 APIリファレンスがひどい!))
Mokeypatchingは一般的に間違っています。適切なサブクラスを作成し、メソッドを追加します。
実稼働コードで一度モンキーパッチを使用しました。
問題は、RESTがGET、POST、PUT、およびDELETEを使用することです。ただし、DjangoテストクライアントはGETとPOSTのみを提供します。 PUT(POSTのような)とDELETE(GETのような)のメソッドをモンキーパッチしました。
DjangoクライアントとDjangoテストドライバーが緊密にバインドされているため、完全なRESTテストをサポートするためにそれをモンキーパッチするのが最も簡単に思えました。
啓発的な Rubyのオープンクラスとオープンクローズドプリンシパルに関するこのディスカッション。
Rubyは好きですが、モンキーパッチは物事を成し遂げるための最後の手段です。すべてが平等であるため、関数型プログラミングの良さをふりかけた従来のオブジェクト指向技術を使用することを好みます。
私の目には、猿パッチはAOPの1つの形式です。記事アスペクト指向設計の原則:オブジェクト指向設計からの教訓 (PDF)は、SOLIDおよびその他のOOP原則をAOPに適用する方法のアイデアを提供します。
最初に考えたのは、クラスのクライアントがそのクラスが一貫して機能することを期待できるはずなので、モンキーパッチはOCPに違反するということです。
モンキ-パッチングは無地 間違った,まぁ.私は、開/閉原則だが、この原則私は長年培われてきた私としては賛成ですので100%になっています。私の考えでは、サルパッチングとしてコード-香りがより大きな規模では、コーディング-哲学のいい香りでした。