Null Object Refactoring

Tags:

마틴 파울러의 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를 재정의 가능하다면 쓸만하겠지만, 그 방법은 모르겠네요.