이 글은 <쏙쏙 들어오는 함수형 코딩, 에릭 노먼드 지음>을 참고하여 작성하였습니다.
지난 글에서는 액션에서 계산을 빼내는 방법에 대해서 같이 알아보았습니다.
작업은, 액션 내 계산에 해당하는 부분을 서브 루틴으로 추출하고,
다음으로 추출된 서브 루틴에서 암묵적 입력과 출력을 제거하는 순서로 이루어졌습니다.
이번 장에서는 더 좋은 액션을 만들기 위한 방법에 대해서 알아보겠습니다.
비즈니스 요구 사항과 설계를 맞추기
첫 번째 방법은 비즈니스 요구사항과 설계를 맞추어라 입니다. 아래는 "장바구니에 담긴 금액 합계가 100을 넘은 경우 면세 가능하다"는 요구사항을 구현한 안 좋은 예시와 좋은 예시입니다.
# NO: 요구사항과 설계가 일치하지 않음
def gets_tax_free(total, item_price):
return total + item_price > 100
# YES: 요구사항에 맞춰 장바구니 합계를 계산해 100이 넘는지 확인
def gets_tax_free(cart):
total = 0
for item in cart:
total += item.price
return total > 100
이처럼, 비즈니스 요구사항과 함수의 동작 내용을 맞추며 더 좋은 액션을 정의할 수 있습니다.
암묵적 입력과 출력은 적을 수록 좋습니다.
이전 장에서, 액션에서 계산을 빼내는 연습을 했기에, 다시 그 예시를 보지는 않겠지만, 더 좋은 액션을 구성하려면 그 속에 암묵적 입력과 출력은 적을 수록 좋습니다.
계산 분류하기
서로 다른 도메인이 한 곳에 섞이지 않도록 분류한다면 유지보수에 더 좋은 액션을 만들 수 있습니다. 아래 예시를 볼게요.
# No: cart, item, copy-on-write가 한 곳에
def add_item(cart, name, price, quantity):
new_cart = cart.copy()
new_cart.push({name, price, quantity})
return new_cart
# Yes: cart, item, copy-on-write 분리
def add_item(cart, item):
return push_element(cart, item)
def push_element(arr, elem):
new_arr = arr.copy()
new_arr.append(elem)
return new_arr
초기에는 cart 도메인 로직(장바구니에 아이템 추가), item 도메인 로직(아이템 생성), 그리고 유틸리티 로직(배열 끝에 원소를 추가하기 위해 배열을 복사하는 로직)이 하나의 함수에 혼재되어 있었습니다. 이를 개선하기 위해, add_item과 같은 cart 도메인 로직에서 item을 생성하는 과정을 분리하고, 배열을 복사한 뒤 원소를 추가하는 과정을 별도의 유틸리티로 분리함으로써, 각 로직을 의미 있는 계층에 맞게 정리하고 더 명확한 구조로 개선한 것을 확인할 수 있습니다.
'개발 이야기 > [스터디] 함수형 프로그래밍' 카테고리의 다른 글
[쏙쏙들어오는함수형코딩] Chapter 7. 신뢰할 수 없는 코드를 쓰면서 불변성 지키기 (0) | 2025.01.23 |
---|---|
[쏙쏙들어오는함수형코딩] Chapter 6. 변경 가능한 데이터 구조를 가진 언어에서 불변성 유지하기 (0) | 2025.01.19 |
[쏙쏙들어오는함수형코딩] Chapter 4. 액션에서 계산 빼내기 (1) | 2025.01.15 |
[쏙쏙들어오는함수형코딩] Chapter 3. 액션과 계산, 데이터의 차이를 알기 (2) | 2025.01.12 |
[쏙쏙들어오는함수형코딩] Chapter 2. 현실에서의 함수형 사고 (0) | 2025.01.11 |