이번 내용은 챕터4 "액션에서 계산 빼내기"를 읽은 내용들을 정리해 보려고 한다.
계산과 액션을 분리하는 것이 굉장히 중요하다.
그 이유는 크게 3가지로 나눌 수 있다.
액션에서 계산 로직을 분리하면, 동일한 입력에 대해 항상 같은 결과를 반환하는 순수 함수를 만들 수 있다. 이렇게 만들어진 함수는 재사용이 쉽고, 실행 환경에 영향을 받지 않기 때문에 다양한 곳에서 사용할 수 있게 된다.
액션이 섞여 있는 함수는 테스트 환경이나 실행 조건, 횟수 등에 따라 결과가 달라지기 때문에 테스트하기 어렵다. 반면 계산만 하는 순수 함수는 동일한 입력값이라면 언제 실행해도 같은 값을 출력하기 때문에 예측하기 쉽고, 테스트에 용이하다.
코드를 유지보수할 때 가장 어렵게 만드는 것 중 하나가 부수효과이다. 부수효과가 많을수록 코드의 동작을 예측하기 어렵고, 원하는 대로 동작하지 않을 가능성도 높아진다. 계산을 분리해두면 이런 부수효과를 최소화할 수 있고, 계산을 분리해두면 부수효과를 최소화할 수 있고, 코드는 더 명확하고 안정적이게 된다.
액션과 계산을 분리하려면, 계산처럼 보이지만 실제로는 액션처럼 동작하는 함수들을 분리해내고, 이를 순수 함수가 되도록 만드는 것이 핵심이다.
즉, 동일한 입력에 대해 항상 같은 출력을 반환하고, 함수 외부 상태에 영향을 주거나 영향을 받지 않도록 해야 한다.
기존 코드에서 계산 역할을 하는 부분을 찾아 함수로 분리한다.
이때 필요한 값이 있다면 함수의 인자로 넘겨주도록 리팩토링하여 외부 상태에 의존하지 않는, 순수한 계산 함수로 만든다.
암묵적인 입력은 함수를 부르는 동안 결과에 영향을 줄 수 있는 것을 말한다.
암묵적인 출력은 함수 호출의 결과로 영향을 받는 것을 말한다.
이러한 암묵적인 요소들은 함수의 예측 가능성을 떨어뜨리고 테스트를 어렵게 만든다.
예로들면, 암묵적인 입력은 전역변수 참조라고 할 수 있고 암묵적인 출력은 전역변수를 변경하는 것이라고 할 수 있다.
암묵적인 입력은 명시적인 함수 인자로 바꾼다.
이때 외부 상태를 직접 인자로 넘기기 어렵다면, 필요한 값을 지역 변수로 추출해서 함수에서 사용하는 방식으로 바꾼다.
암묵적인 출력도 마찬가지로, 외부에 영향을 주는 행위가 아닌 함수의 리턴값으로 처리해야 한다.
이렇게 하면 함수가 외부 상태에 의존하거나 영향을 주지 않는 순수 함수가 되어,
예측 가능하고 테스트하기 쉬운 코드로 바꿀 수 있다.
이번 챕터 역시 굉장히 흥미로웠다.
특히 리액트의 관점에서 '계산'과 '액션'을 어떻게 분리할 수 있을지 계속 생각하게 만든 챕터였다.
그러다보니 단순히 내용을 이해하는 것이 아니라, 실제 코드에 어떻게 적용할 수 있을지에 대한 고민도 자연스럽게 하게 된 것 같다.
물론, 고민한 것을 적용하는 것은 또 다른 얘기지만 말이다.
그래도 이책을 읽으며 고민한 것들을 적용해 보면서, 나의 세계관을 조금씩 만들고 확장해가는 연습을 해야겠다.
저도 요즘 이 책 읽고있는데 정말 좋은 책인거같아요! 정리해주신 글 잘 읽었습니다 ^_^