Object#returning - 문법 사탕

이전글: Hash#diff - 메서드 연쇄의 재미  전체보기

 

어떤 객체를 만들어서 반환하는 코드가 있다고 해봅시다. 꽤 흔한 일입니다. 예를 들어, 해시를 만듭니다.

 

  1. def new_hash
        ret = Hash.new
        ret[:key] = 1 if condition_is_true
        @globals << ret
        ret
    end

 

객체를 만들고, 그 객체를 이용해 작업을 하고(@globals에 추가한다는 설정은 좀 억지스럽기는 합니다만), 그 객체를 다시 반환합니다. 이 코드도 이해하기 쉬운 코드지만 오늘 설명하려는 액티브 서포트의 Object#returning을 활용하면 좀 더 나은 코드가 됩니다.

 

  1. def new_hash
        returning Hash.new do |ret|
          ret[:key] = 1 if condition_is_true
          @globals << ret
        end
    end

 

위 코드와 아래 코드는 코드 줄 수(LoC)는 전혀 차이가 없습니다. 글자수로 따지면, 오히려 늘었군요. 하지만 좀 더 의미를 드러내는 코드입니다. ret라는 이름의 변수를 선언하는 것보다는 returning Hash.new(새로운 해시를 하나 반환할껀데, 이 해시는...)이라고 블럭을 정의하는 두번째 코드가 좀 더 쉽게 읽히고, 루비스럽기도 합니다.

 

사실 이런 코딩 방식은 레일스에서 고안한 것은 아닙니다. K Combinator라는 이름으로 함수형 언어에서 쓰기고 있던 방법입니다. (참조: http://wiki.tcl.tk/1923)

 

returning은 어떻게 구현되어 있을까요? 하나의 매개변수와 결합된 블럭이 있을테고, 블럭을 실행하고 매개변수를 다시 반환해주면 됩니다. 코드는 단지 2줄이면 됩니다.

 

  1. def returning(value)
      yield(value)
      value
    end

 

뭐, 더 설명할 것도 없는 간결한 코드군요. 하지만 이 간결한 코드가 주는 장점은 레일스 코드를 깔끔하게 만드는 초석이 됩니다. 이렇게 더 나은 루비를 만드는 것이 프로그래밍의 재미가 아닐까요?

 

- 강문식