Ruby의 `then` 메서드: 코드 가독성 향상을 위한 파이프라인 체이닝

The 'then' Ruby Keyword - What is it? – Ben Koshy – Rails, Tekla Open API, AutoDesk .NET

작성자
발행일
2024년 12월 09일

핵심 요약

  • 1 Ruby의 `then` 메서드는 파이프라인 형태의 메서드 체이닝을 통해 복잡한 연산의 가독성을 향상시킵니다.
  • 2 `then`은 각 단계를 명확히 분리하여 함수형 프로그래밍의 커링(currying) 스타일을 Ruby 코드에 적용하는 데 효과적입니다.
  • 3 `then`은 `yield_self`와 기능적으로 동일하며, `tap`과는 사용 목적이 달라 코드의 의도에 따라 적절히 선택해야 합니다.

도입

Ruby 2.5부터 도입된 `then` 메서드는 많은 개발자에게 생소할 수 있지만, 코드의 가독성을 획기적으로 개선할 수 있는 강력한 도구입니다. 이 메서드는 객체 자신을 블록에 전달하고 블록의 반환값을 다시 반환함으로써, 일련의 연산 과정을 파이프라인 형태로 연결할 수 있도록 지원합니다. 특히 복잡한 데이터 변환이나 여러 단계를 거치는 로직을 구현할 때, 코드의 흐름을 더욱 명확하고 이해하기 쉽게 만들어줍니다.

then을 활용한 가독성 높은 코드 작성

기존의 Ruby 코드에서 여러 단계를 거치는 연산은 다음과 같이 구현될 수 있습니다.

1. 전통적인 방식 (operation_1)

ruby def operation_1(a) a_int = (a.to_i) sum = a_int + 1 cube = sum ** 3 return cube end puts "operation_1 is: #{operation_1("3")}" # => operation_1 is: 64 이 방식은 각 단계가 명확하지만, 코드가 길어지고 중간 변수가 많아집니다.

2. 간결하지만 밀집된 방식 (operation_2_dense)

ruby def operation_2_dense(a) (a.to_i + 1) ** 3 end puts "operation_2_dense is: #{operation_2_dense("3")}" # => operation_1 is: 64 이 방식은 간결하지만, 한 줄에 여러 연산이 밀집되어 있어 한눈에 이해하기 어려울 수 있습니다.

3. then을 활용한 커링(Currying) 방식 (curry)

then 메서드를 사용하면 각 연산을 별도의 블록으로 분리하여 파이프라인 형태로 연결할 수 있습니다. 이는 마치 함수형 프로그래밍의 커링과 유사한 효과를 줍니다.

ruby def curry(a) a.then { |i| i.to_i } .then { |i| i + 1 } .then { |i| i ** 3 } end puts "curry is #{curry("3")}" # => curry is 64 이 방식은 각 연산 단계를 시각적으로 분리하여 코드의 흐름을 직관적으로 파악할 수 있게 합니다.

4. then과 헬퍼 메서드 활용 (curry_2)

각 연산 단계를 별도의 헬퍼 메서드로 분리하면 코드의 재사용성과 모듈성이 더욱 향상됩니다.

ruby def add_one(i) i + 1 end def cube(i) i ** 3 end def curry_2(a) a.then { |i| i.to_i } .then { |i| add_one(i) } .then { |i| cube(i) } end puts "curry_2 is #{curry_2("3")}" # => curry_2 is 64 이 접근 방식은 각 단계의 구현 세부 사항을 숨기고, 코드의 의도를 명확하게 표현할 수 있도록 돕습니다.

tap과의 비교 및 yield_self와의 관계

thentap과 유사해 보이지만 목적이 다릅니다. tap은 블록 내에서 작업을 수행한 후 원래 객체를 반환하는 반면, then은 블록의 반환값을 다음 체인으로 전달합니다. 예를 들어, User.create!DemoContent.create_manual을 호출하는 상황에서 tap 대신 then을 사용하여 더 간결하게 표현할 수 있습니다.

```ruby # tap 사용 예시 (원문) User.create!(user_params.merge(role: :administrator)) .tap do |user| DemoContent.create_manual(user) end

then 사용 예시 (개선 제안)

User.create_admin(user_params).then do |user| DemoContent.create_manual(user) end ```

또한, then은 Ruby의 yield_self 메서드와 기능적으로 완전히 동일합니다. 따라서 두 메서드 중 어느 것을 사용할지는 개발자의 선호도에 따라 달라질 수 있습니다.

결론

`then` 메서드는 Ruby 코드의 가독성을 높이고, 복잡한 연산 과정을 명확한 파이프라인 형태로 구성할 수 있도록 지원하는 유용한 기능입니다. 특히 함수형 프로그래밍 스타일을 선호하거나, 데이터 흐름을 시각적으로 명확하게 표현하고자 할 때 그 진가를 발휘합니다. `tap`과는 다른 목적을 가지며, `yield_self`와는 동일한 기능을 제공하므로, 개발자는 코드의 의도와 개인적인 스타일에 맞춰 적절한 메서드를 선택하여 코드의 품질을 향상시킬 수 있습니다. 새로운 도구를 익히는 가장 좋은 방법은 실제 프로젝트에 적용해보는 것이며, 이를 통해 Ruby 개발 역량을 한 단계 더 발전시킬 수 있을 것입니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!