마틴 파울러의 Refactoring에서 다뤄진 Introduce Null Object 패턴을 Ruby Metaprogramming techniques를 참고해 작성했습니다.
Ruby에서의 nil은 그 자체로 NilClass의 인스턴스입니다.
irb(main):001:0> a = nil => nil irb(main):002:0> a.class => NilClass irb(main):003:0> a.kind_of?(NilClass) => true irb(main):004:0>
그래서 다음과 같이 NilClass를 바꿀 수 있죠.
#!/usr/bin/ruby class Foo def run(cmd) puts "Default Action: #{cmd}" end end objs = [Foo.new, nil] # Bad way to handle nulls cmd = "hello world" objs.each do |o| if o.nil? puts "NIL Object Action: #{cmd}" else o.run(cmd) end end # Better way called Null Object Refactoring def nil.run(cmd) puts "NIL Object Action: #{cmd}" end objs.each do |o| o.run(cmd) end
nil이 사용되는 곳이 많을테니 이것이 바람직한 코딩이라고 생각되지는 않습니다. 특정 범위 내에서만 NilClass를 재정의 가능하다면 쓸만하겠지만, 그 방법은 모르겠네요.