method_missing(*)

Ruby Null Object

2022-02-18 (Fri)

Null Objectとは

Null Objectとは、「何もしないメソッド」を持つオブジェクトのこと。

クラスベースのオブジェクト指向言語(Java, C#など)だと時折見かける。

class Huga
  def huga
    'huga'
  end
end

class NullHuga
  def huga; end
end

class Hoge
  def process_huga(huga)
    # create_hugaはhuga or nullを返す設定
    create_huga || NullHuga.new
  end
end	

Null Objectのメソッドを呼び出すと、エラーを出さずにメッセージをゴミ箱に捨ててくれる。

つまり、初期化されていない参照をNull Objectで置換すると、NoMethodErrorを起こさなくて済む

これにより、いちいち既存の処理にifチェックを入れなくても済む。

moduleを応用してみる

対象となるクラスとNull Objectクラス間で共通のメソッドを持つようにするため、Interfaceのようなモジュールを持たせてみる。

# 専用のエラーを作っておく
class InterfaceError < StandardError; end

module HogeInterface
  def hoge
    raise InterfaceError
  end
end

class Hoge
  include HogeInterface
  def hoge
    'hoge'
  end
end

class NullHoge
  include HogeInterface
  def hoge; end
end

これで、Interfaceモジュールに先にメソッド定義するよう心がければ、抜け漏れが減るかも?

参考書籍

メタプログラミングRuby 第2版