まず、これは実際、カプセル化のオブジェクト指向の原則に違反していますか?
はい。
第二に、プログラマーとして、変更されていないバージョンのクラスで作業していることをコードで保証できる方法はありますか?
まだ。Ruby 2.0 のクラスボックスが (うまくいけば) 解決策になるでしょう。
第三に、何らかの理由で、コード内でクラスを「開く」必要がありますか?
最後の手段としてのみ。
独自のクラスにモンキー パッチを適用しないでください。まったく意味がありません。あなたはそれらを制御し、そもそもあなたがやりたいことをさせることができます。
ライブラリ内のクラスにモンキー パッチを適用しないでください。(このルールの例外は、何かにモンキー パッチを適用することが唯一の目的であるライブラリです。たとえば、Marc-André Lafortune のbackports
ライブラリでは、Ruby 1.8.6、1.8.7、1.9.0、および 1.9.1 にできるだけ多くのモンキー パッチを適用しています。 Ruby 1.9.2 の機能を使用できるようになります。) ライブラリを使いやすくするモンキー パッチを提供するアドオン ライブラリを提供することができます (たとえば、メソッドを提供する暗号化ライブラリがあり、Kryptonite.encrypt(str)
アドオンを提供する場合)。メソッド)、ただし、そのアドオンは、ユーザーが明示的にString#encrypt
必要とする別のライブラリにある必要があります。それは完全にオプションであるべきです。 require
コア クラスにモンキー パッチを適用しないでください。Array
これは RubyやRubyなどのクラスを指しますが、Rails ライブラリの場合は、「コア」ラベルの下Symbol
にクラスも含めます。ActiveRecord::Base
(上記と同じ警告です。たとえば、Rails 3.0 より前のバージョンでは、明確に定義されたプラグイン API がなく、 Rails を拡張する唯一の方法はモンキー パッチでした。このルールを破った人がいなければ、プラグインは存在しなかったでしょう。 Rails が現在のようになることはありません。)
最初に継承を試してください。最初に構成 (ラッパー、プロキシ、ファサード、アダプターなど) を試してください。最初にリファクタリングを試してください。最初にヘルパー オブジェクトを試してください。それがうまくいかない場合にのみ、モンキーパッチを適用してください。
モンキー パッチを適用するときは注意してください。新しいメソッドを追加する場合は、それがまだ存在していないことを確認し、存在する場合は対処します (たとえば、メソッドから呼び出します)。既存のメソッドをラップしている場合は、他の誰かがすでにラップしている場合はそのラッパーが呼び出され、後で誰かがそれをラップしたい場合は、ラッパーがそれを許可することを確認してください。(特に、これはメソッドの既存のコントラクトを保持する必要があることを意味します。)
可能であれば、モンキーパッチを mixin に入れます。そうすれば、それらは継承チェーンに表示され、コードをデバッグしようとする人は誰でも、何が起こっているのかを理解するための戦いの機会を得ることができます. モンキーパッチは、明らかに名前が付けられた別のファイルに入れます。
最後に、大規模な本番コーディング環境では、この種のことはどのように処理されるのでしょうか? 言い換えれば、プログラミング業界の人々は、他の人が使用するコードで実際にこれを行っているのでしょうか? または、そうでないとしても、どこかのプラグイン作成者が、プログラムの重要な部分を台無しにするようなことをしていないことをどのように保証しますか?
あなたが言うように、「本当に悪いプログラマー」と一緒に仕事をしないでください。
これは単純に聞こえるかもしれませんが、基本的にはこのようになります。はい、もちろん、テストを書いたり、コード レビューを行ったり、ペア プログラミングを練習したり、静的解析ツールを使用したり、警告を有効にしてコードを実行したりできます (たとえば、質問に投稿したコードは を生成しますwarning: method redefined; discarding old ==
)。しかし、私にとって、それはすべて、それほど悪いプログラマーがとにかく行うことのすべてです。