여기에 테스트 코드가 있었다면 쉽게 수정했겠지요. 그러나 만약 테스트가 없다면, 고객 상담 부서가 언제 항의성 이메일을 받을지 알 수 없는 일입니다.
예제를 통해 살펴본 문제의 대부분은 분리된 함수에서 의도치 않게 원본을 조작한 것이 원인입니다. 사실 그 점이 조작이 위험해질 수 있는 이유입니다. 함수를 호출할 때는 함수에 전달한 값을 변경하지 않을 것이라는 신뢰가 필요합니다. 부수 효과가 없는 함수를 순수 함수(pure function)라고 하며, 우리는 순수 함수를 만들기 위해 노력해야 합니다.
입력값을 조작한 후에도 함수에서 값을 반환하는 경우에는 훨씬 더 혼란스러울 수 있습니다. 이후에 코드를 다룰 개발자는 갱신된 값이 반환되어 있기 때문에 원본 값이 변경되었을 것이라고 생각하지 못할 것입니다. 이 경우 실제로는 입력한 값도 변경되지만, 개발자는 이 사실을 알지 못하고 잘못된 판단을 내리게 됩니다.
이제 문제를 해결할 차례입니다. 해결법은 너무나 간단합니다. 해결법을 보자마자 펼침 연산자가 왜 큰 인기를 끌게 되었는지 단번에 이해할 수 있을 것입니다.
arrays/push/push.js
function addGift(cart) { if (cart.length > 2) { return [...cart, reward]; } return cart; } function summarizeCartSpread(cart) { const cartWithReward = addGift(cart); const discountable = cart.filter(item => item.discount); if (discountable.length > 1) { return { error: '할인 상품은 하나만 주문할 수 있습니다.', }; } return { discounts: discountable.length, items: cartWithReward.length, cart: cartWithReward, }; }