モンキーパッチを適用するときは、必ずモジュールを書いてからそれをincludeさせるようにする
class String def /(that) "#{self}/#{that}" end end
こういうコードを書くのはイケてないという考え方。
module StringExtension def /(that) "#{self}/#{that}" end end String.send(:include, StringExtension)
こういう風に書く。こうしておくと、たとえば適用したモンキーパッチを削除したいときにStringExtension固有のメソッドを取得して、それぞれについてStringからundefすればよいからだ。もちろん、既存のメソッドを変更したりしているときには意味がないけど、見通しがよくなるだけでもじゅうぶん価値がある。
副作用があるメソッドにはすべて `!' を接尾辞として付加する
破壊的変更をするメソッドだけでなく、副作用をもつメソッド全般について `!' をつけるべきだとおもっている。
たとえばオブジェクトがインスタンス変数などに状態を保持していてステートフルであるとき、そのインスタンス変数を変更して、なおかつそのインスタンス変数の値によって挙動が変わるようなメソッドがオブジェクトに定義されている場合、そのインスタンス変数を更新するメソッドは副作用を持つと考えて `!' をつけるべきだと考える。
あるいは、Statefulのような継承ツリーに現れることだけに意味があるダミーのモジュールを定義し、ステートフルなオブジェクトはそのモジュールを継承ツリーに含むようにしておけば、 `obj.kind_of?(Stateful)' のようなコードでステートフルであるかどうかが判別できる。
(副作用とかオブジェクトが状態を持つことだとかについて、僕の知見が足りてない感があるのであまり強い感じで言えないです)
ライブラリが提供する定数はConstantsのようなモジュールに定義し、それをincludeして使うようにする
モンキーパッチとほぼ同じ理由。
ファイルパスは必ずPathnameを用いる
文字列をのまま扱うといろいろめんどうだ。