🚀 94sssh
Published on

2023.12.24

[함수형 코딩] - 04 / 05

04. 액션에서 계산 빼내기

"동작하니까 배포해야지!"

테스트하기 쉽게 만들기

  • DOM 업데이트와 비즈니스 규칙 분리하기
  • 전역변수가 없도록 하기

재사용하기 쉽게 만들기

  • 전역변수에 의존하지 않기
  • DOM을 사용할 수 있는 곳에서 실행된다고 가정하면 안 된다.
  • 함수가 결괏값을 리턴해야 한다.

함수에는 입력과 출력이 있다

모든 함수는 입력과 출력이 있다.

  • 입력: 인자, 전역변수를 읽는 것
  • 출력: 콘솔에 뭔가 찍는 것, 전역변수를 바꾸는 것, 리턴값

입력과 출력은 명시적이거나 암묵적일 수 있다
인자는 명시적인 입력이고, 리턴값은 명시적인 출력이지만, 인자 외 다른 입력은 암묵적 입력이 되고, 리턴값 외 다른 출력은 암묵적 출력이 된다. 암묵적 입력/출력은 곧 부수 효과다.

함수에 암묵적 입력과 출력이 있으면 액션이 된다
함수에서 암묵적 입력과 출력을 없애면 계산이 된다. 암묵적 입력은 인자로, 암묵적 출력은 리턴값으로 바꾸면 된다.
이를 테스트와 재사용성에 적용시키면 아래와 같이 된다.

  • DOM 업데이트와 비즈니스 규칙 분리하기
    DOM을 업데이트하는 것은 함수에서 어떤 정보가 나오는 것이므로 출력이지만, 리턴값이 아니므로 암묵적 출력이다.
  • 전역변수가 없도록 하기
    전역변수는 읽으면 암묵적 입력이고, 바꾸면 암묵적 출력이다. 그렇기에 전역변수를 없애야 한다. 암묵적 입력은 인자로, 암묵적 출력은 리턴값으로 바꾸면 된다.
  • DOM을 사용할 수 있는 곳에서 실행된다고 가정하면 안 된다
    DOM을 쓰는 것은 암묵적 출력이다. 함수의 리턴값으로 바꾸면 된다.
  • 함수가 결괏값을 리턴해야 한다
    암묵적인 출력 대신 명시적인 출력을 사용한다.

액션에서 계산 빼내기

액션에서 계산에 해당하는 코드를 분리한다. 그러기 위해 분리한 계산에 해당하는 부분을 새로 함수로 만들고, 입력값은 인자로 출력값은 리턴값으로 바꾼다. 분리한 코드가 여전히 액션을 포함하고 있다면 과정을 반복한다.
이러한 리팩터링을 서브루틴 추출하기라고 한다.

  • 전역변숫값을 바꾸는 일은 함수에서 데이터가 나가므로 출력
  • 전역변숫값을 읽는 일은 데이터가 함수 안으로 들어오므로 입력
    전역볏숫값을 다룬다면 지역변수를 사용하도록 바꾸고 지역변숫값을 리턴하도록 수정한다. 이를 통해 암묵적 입력과 암묵적 출력을 명시적으로 고칠 수 있다.
  1. 계산 코드를 찾고 분리해 새 함수로 만든다.
  2. 새 함수의 암묵적 입력과 출력을 찾는다.
  3. 명시적인 입/출력(인자/리턴값)으로 바꾼다.

책을 읽으면서 나는 아직 함수형 생각?을 하고 있지 않구나 싶었던 것이, 보면서 드는 '코드가 너무 길어지는거 아닌가'같은 생각들을 쉬는 시간이라는 코너를 통해 정리해주고 있다... 아직 코드의 가독성이라는 것에 대해 기준이 없이 읽고 있었던 것 같다. 한 눈에 잘 들어오면 가독성이 좋은건가? 코드가 이해가 잘 되게 쓰여있으면 가독성이 좋은건가? 아니면 둘 다? @.@

보너스주세요

여기까지 읽고 6장까지 읽는 것은 무리가 아닐까 하는 생각이 들었다. ㅋㅋㅋ

05. 더 좋은 액션 만들기

  • 비용과 관련하여
    암묵적인 입력을 줄이고 명시적으로 사용하기 위한 것과 부수 효과를 줄이기 위해 배열을 매번 복사해서 사용하는 것을 보면서, 매번 복사를 하면서 실행 횟수가 늘어나고 배열을 참조하기 위한 메모리가 계속해서 필요한 것 아닌가 생각했다. 책에서도 마침 이런 내용에 대해 비용이 너무 많이 드는 것 아니냐는 질문이 있었다. 거기에 적힌 답은 '그렇기도 하고 그렇지 않기도 합니다.'였다.
    배열을 바꾸는 것보다는 비용이 더 드는 것이 맞지만, 최신 프로그래밍 언어의 런타임과 가비지 컬렉터가 불필요한 메모리를 효율적으로 정리해주어 신경 쓰지 않아도 된다는 얘기였다. 결론은 비용에 대해 고민하지 않아도 된다는 것이었고, 복사본을 통해 잃는 것보다 얻는 것이 많다는 얘기였다. 이 내용에 대해 안심한 것만으로도 5장은 얻어가는 게 큰 챕터였다.

설계는 엉켜있는 코드를 푸는 것이다

함수를 통해 관심사를 분리한다. 분리한 것은 다시 쉽게 조합할 수 있다.
함수는 작을수록 재사용하기 쉬우며, 작은 함수는 유지보수하기 쉽고, 테스트하기 쉽다.

뭔가 책을 읽고 있으면 내용이 너무 좋은 것 같고 당장에라도 적용해보고 싶은데, 아직 갈 길이 먼 것 같다. 🤔