mibros.hatena

みぶのはてないぶろぐ

present?のダークサイド

前回のエントリでpresent?メソッドがわりと好きな話をしましたが、このメソッドには負の側面もあってそれは、Objectクラスのモンキーパッチとして定義されている点。

Objectクラスは、Rubyの中で最も頂点に立つ存在のクラスで、あらゆるクラスはこのクラスに属する。ということは、全てのクラスにおいてpresent?メソッドが適用されるので、よく知らずに自前で作ったクラスの自前のpresent?メソッドなんかを作ると呼び出し側に乱世が訪れたりする。

activesupport説明ページを参照すると、present?があるObjectクラス以外にも、ArrayとかHashとかDateとか結構あるので、モンキーパッチを施したオレオレライブラリをrailsに取り込む場合は、正面衝突してないかは要チェックである。というか他のgemを取り込んだ時も挙動に注意しないといけない気がしてきた。railsに取り込まれる前提のgemかどうかさくっと判断つけばいいけど、今のところそんな素敵なものは無かった。知っている人いたらぜひこちらまで連絡いただきたい。

ちなみに、EffectiveRuby先生によるとモンキーパッチ使う前にRefinementsで代用できないか検討しましょう。とのことでした。詳しくは書籍を購入されたし。

[amazonjs asin="4798139823" locale="JP" title="Effective Ruby"]