이전글: Hash#diff - 메서드 연쇄의 재미 전체보기
어떤 객체를 만들어서 반환하는 코드가 있다고 해봅시다. 꽤 흔한 일입니다. 예를 들어, 해시를 만듭니다.
객체를 만들고, 그 객체를 이용해 작업을 하고(@globals에 추가한다는 설정은 좀 억지스럽기는 합니다만), 그 객체를 다시 반환합니다. 이 코드도 이해하기 쉬운 코드지만 오늘 설명하려는 액티브 서포트의 Object#returning을 활용하면 좀 더 나은 코드가 됩니다.
위 코드와 아래 코드는 코드 줄 수(LoC)는 전혀 차이가 없습니다. 글자수로 따지면, 오히려 늘었군요. 하지만 좀 더 의미를 드러내는 코드입니다. ret라는 이름의 변수를 선언하는 것보다는 returning Hash.new(새로운 해시를 하나 반환할껀데, 이 해시는...)이라고 블럭을 정의하는 두번째 코드가 좀 더 쉽게 읽히고, 루비스럽기도 합니다.
사실 이런 코딩 방식은 레일스에서 고안한 것은 아닙니다. K Combinator라는 이름으로 함수형 언어에서 쓰기고 있던 방법입니다. (참조: http://wiki.tcl.tk/1923)
returning은 어떻게 구현되어 있을까요? 하나의 매개변수와 결합된 블럭이 있을테고, 블럭을 실행하고 매개변수를 다시 반환해주면 됩니다. 코드는 단지 2줄이면 됩니다.
뭐, 더 설명할 것도 없는 간결한 코드군요. 하지만 이 간결한 코드가 주는 장점은 레일스 코드를 깔끔하게 만드는 초석이 됩니다. 이렇게 더 나은 루비를 만드는 것이 프로그래밍의 재미가 아닐까요?
- 강문식